关于Vuex的数据读写

583 阅读2分钟

关于Vuex的数据读写

Vuex定义

与我们手写的store一样,用于管理数据的工具,可以认为是一个对象。它可以帮助我们改写数据。

vuex使用

const store = new Vuex.Store({
  state: {
    count:0
  },
})
console.log(store.state.count)

首先引入,并加入数据。

const store = new Vuex.Store({
  state: { // data
    count: 0
  },
  mutations: { // methods
    increment (state) {
      state.count++
    }
  }
})

其次,使用mutations,运用数据。

奇葩的地方来了。

想要使mutations生效,我们需要使用store.commit进行触发。

console.log(store.state.count)
store.commit('increment')
console.log(store.state.count)

结果为:

0
1

活学活用:

const store = new Vuex.Store({
  state: { // data
    count:0
  },
  mutations:{
    increment(state,n:number){// methods
      state.count += n
    }
  }
})
console.log(store.state.count)
store.commit('increment',10)
console.log(store.state.count)

加入参数n,想要加几就得几.

结果为:

0
10

state

单一状态树
state: { // data
    count:0
  },

官方的解释:用一个对象就包含了全部的应用层级状态。至此它便作为一个“唯一数据源。

本质:state用一个对象包含了项目里所有组件的数据。且是唯一的数据来源。

了解getter

可以将其简单的理解为我们创建的Vuex实例的计算实行(store的计算书属性)。它会将其所依赖的数据缓存起来,当兹依赖值发生改变,才会重新计算。

使用方式:

const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: '...', done: true },
      { id: 2, text: '...', done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    }
  }
})

mutaion和action

mutation

我们需要对 state 中的数据继续操作时, 需要用到mutation。其相当于普通模板中的 methods , 通过store.commit 方法触发。

const store = new Vuex.Store({
  state: { //data
    count: 1
  },
  mutations: { //methods
    add (state) {
      // 变更状态
      state.count++
    }
  }
})

store.commit('add')
actions

与mutation非常相像。不过action的用法是异步的。他不会直接对数据进行修改,而是提交一个mutation去进行操作。

const store = new Vuex.Store({
  state: { //data
    count: 1
  },
  mutations: { //methods
    add (state) {
      // 变更状态
      state.count++
    }
  },
    actions: {
      add (context){
      context.commit('increment')
    }
  }
})

在组件中获取Vuex状态

方法一:使用computed

计算属性

 computed:{
    count(){
      return store.state.count
    }
  }

使用computed引入。计算属性可以继续实行有改变的函数。这样我们的数据就不会只执行一次了。

模板

<div>
   <button @click="add">
   +1
   </button>
   {{count}}
</div>   

触发

 add(){
    store.commit('increment',1)
  }
方法二:从Vue实例直接获取

打开store/index.ts

Vue.use(Vuex)

这串代码的意思是:把 store 绑到 Vue.prototype 上

main.ts中

new Vue({
    router,
    store,
    render: h => h(App)
}).$mount('#app');

store会被挂到Vue实例上。

这样我们可以直接使用this.$store来获取数据了。

计算属性

 computed:{
    count(){
      return this.$store.state.count
    }
  }

模板及触发

<div>
    <button @click="$store.commit('increment',1)">
      +1
    </button>
    {{count}}
</div>

vue2+ts配合使用Vuex的bug

前面说到了,我们获取数据使用computed来使用的。

然而当我们使用ts的装饰器:vue-property-decorator。bug就会出现了,具体表现为:computed下引入的state无法被当前组件的方法获取。

于是我再搜索了vue-class-component, 它使用了原生自带的get和set函数。

使用如下:

store/index.ts的数据

const store = new Vuex.Store({
  state: { // data
    count:0
  })

组件中使用:

get count(){
   return this.$store.state.count
}

一般用get比较多,所以只举了get的例子。

具体可以查看:vue-class-component