vue中的vuex入门

Vue干货 小白 暂无评论

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。说白了,vuex就是用来管理数据的。

Vuex的核心就是store(仓库),其包含应用中的大部分状态。Vuex 和单纯的全局对象有以下两点不同:

Vuex的状态存储时响应式的

store中状态不能直接改变

创建一个store


new Vuex.Store({
    state:{
        //......
    },
    mutations:{

    }
})

在这个store里,包含了一个 state 对象和 mutations

state用来存储初始化的数据,读取数据使用 store.state.数据 。

修改数据使用 mutations ,调用 mutations 里的数据需要使用 commit()

现在来尝试使用以下vuex,做一个简单的计数程序:

HTML

  
  
  <div id="app">

  </div>

  <template id="tpl">
    <div>
      <tip></tip>
      <btn></btn>
    </div>
  </template>

js

    
    
    var store = new Vuex.Store({
      state:{
        count:0
      },
      mutations:{
        plus(state){
          state.count++
        },
        less(state){
          state.count--
        }
      }
    });

    var app=new Vue({
      el:'#app',
      template:'#tpl',
      components:{
        tip:{
          template:'<div>{{$store.state.count}}</div>'
        },
        btn:{
          template:`
            <div>
              <input type="button" value="+" v-on:click="$store.commit('plus')"/>
              <input type="button" value="-" v-on:click="$store.commit('less')"/>
            </div>
          `
        }
      },
      store
    }}

vue的核心

state

由于 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态:

// 创建一个 Counter 组件


const Counter = {
  template: `<div>{{ count }}</div>`,
  computed: {
    count () {
      return store.state.count
    }
  }
}

每当 store.state.count 变化的时候, 都会重新求取计算属性,并且触发更新相关联的 DOM。

mapState 辅助函数

当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键:


// 在单独构建的版本中辅助函数为 Vuex.mapState
import { mapState } from 'vuex'

export default {
  // ...
  computed: mapState({
    // 箭头函数可使代码更简练
    count: state => state.count,

    // 传字符串参数 'count' 等同于 `state => state.count`
    countAlias: 'count',

    // 为了能够使用 `this` 获取局部状态,必须使用常规函数
    countPlusLocalState (state) {
      return state.count + this.localCount
    }
  })
}

mapGetters 辅助函数

mapGetters 辅助函数仅仅是将 store 中的 getters 映射到局部计算属性:



computed:{
 ...mapGetters([
   // 使用对象展开运算符将 getters 混入 computed 对象中
   'doneTodosCount',
   'anotherGetters'
 ])
}

Mutations

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutations 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数:



const store = new Vuex.Store({
 state:{
   count:0
 },
 mutations:{
   plus(state){
     state.count++
   },
   less(state){
     state.count--
   }
 }
});

提交载荷(Paylaod)

你可以向 store.commit 传入额外的参数,即 mutation 的 载荷(payload):



const store = new Vuex.Store({
 state:{
   count:0
 },
 mutations:{
   plus(state,n){
     state.count+=n
   },
   less(state,n){
     state.count-=n
   }
 }
});

this.$store.commit('plus',5)
this.$store.commit('less',5)

Actions

Action 类似于 mutation,不同在于:



Action 提交的是 mutation ,而不是直接变更状态
Action 可以包含任意异步操作
actions:{
 plus(commit){
   commit({type:'plus',n:5})
 }
}


转载请注明: Vue教程中文网 - 打造国内领先的vue学习网站-vue视频,vue教程,vue学习,vue培训 » vue中的vuex入门

喜欢 ()or分享