使用Vuex心得

之前一直都是看别人写的vuex感觉还挺好理解的,今天自己根据需求写了下vuex,一下子不知道怎么写了,

想要用好vuex还是先要知道原理:

参考好博客写的非常到位:https://www.cnblogs.com/DM428/p/7293867.html

基本组成:

       注意到这个store对象包含三个子对象:

     state、mutations、actions

      其中state用于存储数据,类似vue实例的data属性。

       mutations用于递交更改,对state对象中的属性数据进行更改。

      actions用于进行递交异步更改,通过调用mutations实现对数据的更改。

actions与mutations的区别:

      其中actions区别于mutations的地方在于mutations只能进行同步更改,而actions中的更改可以是异步执行。所以基本上所有用户执行的直接数据更改都是触发mutations属性

      函数执行,而需要与后端进行数据交互的数据更改通常是通过actions属性函数去执行。

定义actions与mutations属性函数的注意事项:

      其中定义mutations属性函数时必须传递的第一个参数是state,因为要对state进行更改,第二个参数代表传入的新参数。mutations属性函数只接受两个参数,如果要同时更改多个属性值,可以通过对象传入。

  在actions属性函数中可以通过context.commit()方法触发mutations属性函数。定义actions属性函数时,必须传递的第一个参数是context,用于触发mutations函数。

触发actions与mutations属性函数的方法:

    在子组件中通过this.$store.commit()方法触发mutations属性函数。在注册store的Vue实例中(第三步中将会讲到)可以通过store.commit()触发。

    commit函数第一个参数是mutations的属性函数名,第二个参数是传入的新值。

    actions属性函数中可以进行异步操作,比如通过ajax或者Vue.Resource()进行数据获取,获取数据后再通过context.commit()触发更改。

    触发actions属性函数使用this.$store.dispatch()或者store.dispatch() (在注册store的Vue实例中)函数。dispatch函数传递的一个参数是actions属性函数名称。如果希望在

    Vue实例创建完成还未挂载时就从后端获取数据,则可以在created钩子函数中调用actions属性函数。

在组件中访问数据中心state的注意事项:

    在Vue实例中可以通过this.$store.state对象获取state中的数据。如果希望在state中的数据发生更改之后,组件会自动更新,则应该使用组件的computed属性定义数据,而

    不是通过data属性定义。如果使用data定义组件数据,则state中的数据发生更改之后组件不会发生变化。

练习:vuex+父子组件间通信

项目目录:

页面组件:AppFilm.vue

<template>
  <div class="app-film">
    <AppFilmNav></AppFilmNav>
    <AppFilmBox></AppFilmBox>
  </div>
</template>
<script>
import AppFilmNav from ‘@/components/AppFilmNav‘
import AppFilmBox from ‘@/components/AppFilmBox‘
export default {
  name: ‘app-film‘,
  components:{AppFilmNav,AppFilmBox},
  data () {
    return {
    }
  },
  computed:{

 }
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.app-film{
  height: 0.5rem;
}
</style>

AppFilmBox:

<template>
  <div class="app-film-box">
    <AppFilmItem  :film="film" v-for="(film,index) in films" :key="index"></AppFilmItem>   /// :film 绑定数据传递给子组件
    <!--{{ infor }}-->
   </div>
</template>
<script>
import axios from ‘axios‘
import AppFilmItem from ‘./AppFilmItem‘
export default {
  // props:[‘infor‘],
  name: ‘app-film-box‘,
  components:{AppFilmItem},
  data () {
    return {
      // films:[]
    }
  },  // 必须通过computed属性使用state数据!否则state属性中的数据发生更改时不会反映在组件上!
  computed: {
    films(){
      return this.$store.state.film
    }
  },
  methods: {
    getfilms(){
      let that = this;
      this.$store.dispatch(‘Toggle‘,this.$store.state.posturl);
    }
  },
  created(){
    this.getfilms()
  }
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style>
.app-film-box{
  padding:0 15px;
}
</style>

appFilmItem.vue

<template>
  <div class="app-film-item">
    <img  :src="film.poster" alt="">
    <div class="info">
        <h5>{{film.name}}</h5>
        <p class="for">{{film.intro}}</p>
        <p class="for1">{{film.cinemaCount}}家影院上映<i>{{film.watchCount}}人购票</i></p>
    </div>
    <div class="other">
        <div class="range">8.5</div>
        <i class="fa fa-angle-right"></i>
    </div>

  </div>
</template>
<script>
export default {
  name:‘app-film-item‘,
  props:[‘film‘], // 从父组件那里接受数据 film
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss">
body{
  background-color:#f9f9f9;
}
.app-film-item{
  // padding-left: 20px;
  // margin-top: -0.3rem;
  display: flex;
  align-items: center;
  padding-bottom: 28px;
  border-bottom: 1px solid #ccc;
  padding-top: 25px;
  img{
    width:0.6rem;
  }
  .info{
    padding-left: 15px;
    display: inline-block;
    width: 75%;
    h5{
      font-size: 16px;
      line-height: 32px;
      color: #000;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
    .for{
      height: 24px;
      line-height: 24px;
      color: #8e8e8e;
      font-size: 14px;
      overflow: hidden;
      text-overflow: ellipsis;
      width: 100%;
      display: inline-block;
    }
    .for1{
      line-height: 24px;
      color: #8e8e8e;
      font-size: 12px;
      i{
        margin-left: 15px;
      }
    }

  }
}
.other{
  display: flex;
  justify-content: space-between;
  margin-right: 0.2rem;
  margin-bottom:0.5rem;
  .range{
    font-size: 16px;
    line-height: 32px;
    color: #fc7103;
  }
  i{
    padding-left: 5px;
    line-height: 29px;
    color: #c6c6c6;
  }
}
</style>

AppFilmNav.vue

<template>
  <div class="app-film-nav">
    <div  class="now_playing" @touchend.stop.prevent="toggle(0)" :class="{active:active==0}">
        正在热映
    </div>
    <div  class="coming_soon" @touchend.stop.prevent="toggle(1)" :class="{active:active==1}">
        即将上映
    </div>
  </div>
</template>
<script>
export default {
  name:‘app-film-nav‘,
  data () {
    return {
      active:0
    }
  },
  methods: {
    toggle (i) {
      this.active = i;
      this.$store.state.posturl = this.$store.state.urls[i].url;
      this.$store.dispatch(‘Toggle‘,this.$store.state.posturl);
    }
  }
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss" scoped>
.app-film-nav{
  height: 47px;
  margin: 0.5rem 15px 5px 15px;
  border-bottom: solid #fe6e00 1px;
  // padding-left: 15px;
  // padding-right:15px;
  .now_playing{
    float: left;
    width: 50%;
    height: 100%;
    text-align: center;
    font-size: 16px;
    line-height: 46px;
    // color: #6a6a6a;
    cursor: pointer;
  }
  .coming_soon{
    float: left;
    width: 50%;
    height: 100%;
    text-align: center;
    font-size: 16px;
    line-height: 46px;
    color: #6a6a6a;
    cursor: pointer;
  }
  .active{
    color: #fe6e00;
    border-bottom: solid;
  }
}
</style>

vuex写在main.js里

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from ‘vue‘
import App from ‘./App‘
import router from ‘./router‘
import Vuex from ‘vuex‘
import axios from ‘axios‘

Vue.use(Vuex)
Vue.config.productionTip = false

const store = new Vuex.Store({
  state:{
    urls:[
      {title:‘正在热映‘,url:‘/static/mock/now-playing.json‘},
      {title:‘即将上映‘,url:‘/static/mock/coming-soon.json‘}
    ],
    posturl:‘/static/mock/now-playing.json‘,
    film:‘‘
  },
  mutations:{
    SET_FILM: (state, film) => {
      state.film = film
    }
  },
  actions: {
    Toggle: ({commit},url) => {
      return new Promise((resolve, reject) => {
        axios.get(url).then((res) => {
          const data = res.data.data
          commit(‘SET_FILM‘, data)
          resolve()
        }).catch((err) => {
          reject(err)
        })
      })
    }
  }
})

/* eslint-disable no-new */
new Vue({
  el: ‘#app‘,
  store, // 根组件通过store选项将store实例注入所有地子组件
  created (){
    store.dispatch(‘Toggle‘,store.state.posturl);
  },
  router,
  components: { App },
  template: ‘<App/>‘
})

// 上面的代码能够让子组件通过this.$store访问到store实例。

页面效果:

这里用Vuex来切换get请求的地址

原文地址:https://www.cnblogs.com/mmzuo-798/p/9450990.html

时间: 2024-11-02 14:01:39

使用Vuex心得的相关文章

vuex使用心得分享(填坑)

今天我们简单说一下vuex的使用,vuex是什么呢,相当于react的redux,如果项目使用数据过多的话,直接管理是非常不方便的,那么采用vuex,那些繁琐的问题就迎刃而解了,首先我们先看看官方对vuex的说明: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调

vuex使用心得

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式. 通俗点讲就是管理各种交互数据的 什么情况下使用Vuex? 当自己因为组件间数据交互越来越复杂,而代码越写越迷糊时,就可以使用Vuex了 安装Vuex 直接去官网下载,然后再script中引用,就像jquery一样,(这样引用除非是写demo练习,实际工作中好像没人这样用,反正我没用过) 使用Vue-cli时 npm install vuex --save ,在一个模块化的打包系统中,必须通过 Vue.use()来安装 Vuex:

探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用

前言 首先说明这并不是一个教程贴,而记事本应用是网上早有的案例,对于学习 vuex 非常有帮助.我的目的是探索 vuex 2.0 ,然后使用 vue 2.0 + vuex 2.0 重写这个应用,其中最大的问题是使用 vue-cli 构建应用时遇到的问题.通过这些问题深入探索 vue 以及 vuex . 我对于框架的学习一直断断续续,最先接触的是 react,所以有一些先入为主的观念,喜欢 react 更多一点,尤其在应用的构建层面来说.之所以断断续续,是因为自己 JS 基础较弱,刚开始学习的时候

前端框架Vue自学之Vuex(八)

终极目标:掌握和使用Vue(全家桶:Core+Vue-router+Vuex) 本博客目的:记录Vue学习的进度和心得(Vuex) 内容:学习和使用Vuex. 正文: Vuex 一.认识Vuex 二. 原文地址:https://www.cnblogs.com/xinkuiwu/p/12115274.html

使用 Vuex + Vue.js 构建单页应用

鉴于该篇文章阅读量大,回复的同学也挺多的,特地抽空写了一篇 vue2.0 下的 vuex 使用方法,传送门:使用 Vuex + Vue.js 构建单页应用[新篇] -------------------- 华丽的分割线 -------------------- 原文地址:https://coligo.io/learn-vuex-by-building-notes-app/ 前言:在最近学习 Vue.js 的时候,看到国外一篇讲述了如何使用 Vue.js 和 Vuex 来构建一个简单笔记的单页应用

Delphi组件indy 10中IdTCPServer修正及SSL使用心得

indy 10终于随着Delphi2005发布了,不过indy套件在我的印象中总是复杂并且BUG不断,说实话,不是看在他一整套组件的面子上,我还是喜欢VCL原生的Socket组件,简洁,清晰.Indy9发展到了indy10几乎完全不兼容,可叹啊.言归正传.在使用IdTCPServer组件的时候发现了他的漏洞,他的OnConnec,OnExecute,OnDisconnect等事件是在其他线程中执行的,通常情况下这没有问题,但是在特殊的情况下会造成问题,如果其他部分的程序写得有问题就会出现漏洞.

Linux系统理解以及Linux系统学习心得

原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 说一下我对Linux系统的理解 1.加载Linux内核准备:在加载基本输入输出模块(BIOS)之后,从磁盘的引导扇区读入操作系统的代码文件块到内存中,之后开始整个系统的初始化. 2.main.c的start_kernel函数是整个操作系统的入口,这也与Linux是基于C语言的特性相符,start_kernel具体做的动作很多

参加老男孩linux培训心得

参加老男孩linux培训心得 时间如白驹过隙,已经不知不觉来到老男孩培训已经三个月了.在这三个月中我渐渐得到了成长,专业技术成长,以及为人处事之道与思想的提高. 我一共就总结以下了三点     一.思想 在我刚来老男孩的时候,老师天天上课前讲一段思想,我当时不太明白,不赶紧上课,讲这干啥呢?而且老师早一点讲完,又可以招下一批学生了,老讲思想,这不是自断财路么?随着时间的流逝,渐渐的我悟懂了点.人在那里都可以学技术,但是学会了技术没有思想,一旦来了新事物,就会接受的很慢.尤其在互联网这个圈子里,软

Linux串口IO模式的一些心得

众所周知,在Linux系统下所有设备都是以文件的形式存在,串口也一样. 通常I/O操作都是有阻塞与非阻塞的两种方式. 其中"超时"这个概念其实是阻塞中的一种处理手段,本质还是属于阻塞的I/O模式. 在Linux中串口的IO操作 本文将它分为三种状态: 阻塞状态 超时状态 非阻塞状态 这三种状态的转换组合有这么几种: 阻塞 --> 超时 阻塞 --> 非阻塞 超时 --> 阻塞 超时 --> 非阻塞 非阻塞 --> 阻塞 我们一个一个来分析 首先在一个串口的