vuex在组件化开发中的简单应用小例子

Posted luckq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vuex在组件化开发中的简单应用小例子相关的知识,希望对你有一定的参考价值。

首先, 介绍一下vuex是个什么东西, 个人理解来说, vuex就是一个状态管理的东西, 它里面有且仅有一个Store仓库, 这个仓库里面存放着一些变量, 为什么要有这么一个变量呢, 用过vue的人肯定都清除, 父子组件之间的通讯传值是个比较麻烦的事情, 特别是, 嵌套组件特别多的时候, 这种情况下, 一级一级地传递下去十分麻烦, 还有就是兄弟组件之间的传值也一样麻烦. 而vuex中的Store这个仓库, 就能够为我们将放在这个仓库中的值, 分发给整个项目下的所有组件, 也就是说是, 不用一级一级地向下传值, 所有组件就都可以共享这些变量. 今天主要想说的就是在组件化开发中, 如何使用vuex的一个简单入门级的小例子, 先介绍一下组件和文件结构:

技术分享图片

一个是主组件App.vue, 一个是子组件page1.vue, 将子组件渲染在主组件App.vue中, 新建一个文件夹vuex, 在里面放置了store.js文件

首先, 安装vuex  

npm i vuex

在store.js文件中, 引入vue和vuex的包, 并实例化暴露Store对象,设置其中的数据

import Vue from ‘vue‘
import Vuex from ‘vuex‘

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  count: 0
}
})

在main.js中设置vue实例, 引入store对象

//..
import store from ‘./vuex/store‘
Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
 //..
  store,
  components: { App },
  template: ‘<App/>‘
})

我们现在已经在这个store仓库里放了一个数据了,  现在要做的就是在子组件中将这个store中的数据获取到, 我们可以在组件的计算属性computed中, 使用this.$store.state.数据的方式, 获取store中想要的数据

<template>
  <div>
    <span>{{count}}</span>  
  </div>  
</template>

<script>
  export default {
    //..
    computed: {
      count() {
        return this.$store.state.count
      }
    },
  }
</script>

我们可以在这个子组件中, 把store打印出来, 看一下是什么样子的

技术分享图片

从这里就可以看到在store中有一个state对象,就是我们设置的值, 但是, 如果想要改变值就需要用到store对象中的mutations方法, mutations是唯一可以改变store中的数据的值的方式, 它里面可以定义一个函数, 接收state, 比如, 我们想要在子组件中, 改变store中count的值, 就需要在store的实例中, 定义一个类型的方法, 让count的值增加, 然后, 再在子组件中, 定义一个方法, 来唤醒mutations中指定类型的方法,从而达到改变count值, 比如, 我在store实例的mutations中定义了一个类型为add的方法, 然后再在子组件中, 通过this.$store.commit(‘add‘)改变了count的值

export default new Vuex.Store({
  state: {
    count: 0,
  },
  mutations: {
    add() {
      this.state.count++
    },
  }
})
<template>
  <div>
    <span>{{count}}</span>  
    <button @click="addCount">+</button>
  </div>  
</template>

<script>
  export default {
    /..
    computed: {
      count() {
        return this.$store.state.count
      }
    },
    methods: {
      addCount() {
        this.$store.commit(add)
      }
    }
  }
</script>

此外, mutations是支持传入额外的参数的

this.$store.commit(‘add‘,2)
 add(state,n) {
      state.count += n
    },

 

其实, 在store中, 也有一个类似于vue中计算属性computed的属性, 叫做getters, getters的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。它的第一个参数接收state

export default new Vuex.Store({
  state: {
    info: [
      {id: 1, name: ‘zs‘},
      {id: 2, name: ‘ls‘},
      {id: 3, name: ‘ww‘},
      {id: 4, name: ‘zl‘}
    ]
  },
  //..  
  getters: {
    getInfo(state) {
      return state.info.filter(item => {
        return item.id === 1
      })
    }
  }
})

如果想要在子组件中显示getters中getInfo的返回值, 需要在子组件的computed属性中, 用this.$store.getters.getInfo的方式获取, 要注意的是, 如果在getInfo中, 不将state传入进去, 那么子组件在获取的时候, 是会报错的

<template>
  <div>
    <p>{{userInfor}}</p>
  </div>  
</template>

<script>
  export default {
    //..
    computed: {
      userInfor() {
        return this.$store.getters.getInfo[0].name
      }
    }
  }
</script>

现在, 我们要注意的一点就是, mutations 必须是同步的, 因为,如果我们正在 debug 一个 app 并且观察 devtool 中的 mutation 日志。每一条 mutation 被记录,devtools 都需要捕捉到前一状态和后一状态的快照 如果mutations中有一个回调函数, 那么当mutations触发时, 其中的回调函数或者定时器暂时还并没有被执行,devtools 不知道什么时候回调函数实际上被调用, 这时候, 就需要利用store中的actions来帮助我们改变数据了, actions只是提交mutations,而不是像mutations一样直接改变数据, 并且, actions中可以有任意的异步函数,在子组件中,需要利用this.$store.dispach的方式, 分发actions

export default new Vuex.Store({
  state: {
    count: 0,
  },
  mutations: {
    min(state,n) {
      state.count -= n.amount
    }
  },
  actions: {
    increment ({commit},n) {
      setInterval(()=>{
        commit(‘min‘,n)
      },1000)
    }
  }
})
      minCount() {
        this.$store.dispatch({
          type: ‘increment‘,
          amount: 2
        })
      }

 






以上是关于vuex在组件化开发中的简单应用小例子的主要内容,如果未能解决你的问题,请参考以下文章

vuex是什么?怎么用,例子

Vuex简单使用

Vuex的认识和简单应用

Vuejs242-7个有用的Vue开发技巧

vuex的 例子

Vue开发技巧