谈一谈vuex

Posted ymoonwind

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谈一谈vuex相关的知识,希望对你有一定的参考价值。

首先安装vuex

npm install vuex --save

等显示安装成功后,在src文件夹里面新建store文件夹,并且在store文件夹里新建index.js。index.js代码如下:

import Vue from ‘vue‘;
import Vuex from ‘vuex‘;
Vue.use(Vuex);
const state = 
    number:1,
    message:‘我在测试state‘

const store = new Vuex.Store(
    state
)
export default store

然后,我们到main.js文件引入store,代码如下:

import Vue from ‘vue‘
import App from ‘./App‘
import router from ‘./router‘
import store from ‘./store‘
Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue(
  el: ‘#app‘,
  router,
  store,
  components:  App ,
  template: ‘<App/>‘
)

至此,vuex就可以正常使用了。

接下来就详细说说用法:

回到store文件夹里的index.js,先声明一个state变量,在这个变量里面,我就随便定义两个属性值,再把它扔到已经实例化的Vuex.store里面,代码如下:

import Vue from ‘vue‘;
import Vuex from ‘vuex‘;
Vue.use(Vuex);
const state = 
    number:1,
    message:‘我在测试state‘

const store = new Vuex.Store(
    state
)
export default store

至此,我们就可以在任何组件里拿到这两个属性值了。不妨试试吧!代码如下:

<template>
    <div class=‘testVuex‘>
        this.$store.state.number<br>
        this.$store.state.message
        </div>
</template>

代码运行,演示结果如下图:

技术图片

 

 

但这并不是最好的方式,为此官方提供了一个更为可靠的方式,通过getters来实时监听state的数据变化。在这里解释下getters,据官方文档所述,getters相当于store的计算属性,它的返回值会根据依赖缓存起来。代码如下:

import Vue from ‘vue‘;
import Vuex from ‘vuex‘;
Vue.use(Vuex);
const state = 
    number:1,
    message:‘我在测试state‘

const getters = 
    showNumer(state)
        return state.number
    ,
    showMessage(state)
        return state.message
    

const store = new Vuex.Store(
    state
)
export default store

这个时候需要引入一个新名词mutations来真正的改变一下state数据,代码如下:

import Vue from ‘vue‘;
import Vuex from ‘vuex‘;
Vue.use(Vuex);
const state = 
    number:1,
    message:‘我在测试state‘

const getters = 
    showNumer(state)
        return state.number
    ,
    showMessage(state)
        return state.message
    

const mutations = 
    changeNumber(state,sum)
        state.number += sum
    ,
    changeMessage(state)
        state.message = ‘我是改变后的message‘
    

const store = new Vuex.Store(
    state,
    getters,
    mutations
)
export default store

紧接着我们就去任一组件里通过this.$store.commit(‘changeNumber‘,6)以及this.$store.commit(‘changeMessage‘)改变下state值,看看有没有相应改变,代码如下:

<template>
    <div class=‘testVuex‘>
        this.$store.state.number<br>
        this.$store.state.message
        <button @click="change()">点击改变state的number</button>
        <button @click="change2()">点击改变state的message</button>
        </div>
</template>
<script>
export default 
    methods:
        change()
            this.$store.commit(‘changeNumber‘,6)
        ,
        change2()
            this.$store.commit(‘changeMessage‘)
        
    

</script>

代码运行,点击按钮,演示结果如下:

技术图片

 

 但这不是理想的改变值的方式;因为在 Vuex 中,mutations里面的方法 都是同步事务,意思就是说:比如这里的一个this.$store.commit(‘changeNumber‘,sum)方法,两个组件里用执行得到的值,每次都是一样的,这样肯定不是理想的需求。

这个时候又要引入一个新名词actions来实现异步操作了。actions中回调函数的第一个参数是context,是一个与store实例具有相同属性和方法的对象。具体代码如下:

import Vue from ‘vue‘;
import Vuex from ‘vuex‘;
Vue.use(Vuex);
const state = 
    number:1,
    message:‘我在测试state‘

const getters = 
    showNumer(state)
        return state.number*2
    ,
    showMessage(state)
        return state.message
    

const mutations = 
    changeNumber(state,sum)
        state.number += sum
    ,
    changeMessage(state)
        state.message = ‘我是改变后的message‘
    

const actions = 
    changeNumber(context,sum)
        context.commit(‘changeNumber‘,sum)
    ,

const store = new Vuex.Store(
    state,
    getters,
    mutations,
    actions
)
export default store

任一组件使用代码如下:

<template>
    <div class=‘testVuex‘>
        this.$store.state.number <button @click="change()">点击改变state的number</button><br>
        this.$store.state.message <button @click="change2()">点击改变state的message</button><br>
        <button @click="changeSyncNumber">点击改变</button>
       </div>
</template>
<script>
export default 
    methods:
        change()
            this.$store.commit(‘changeNumber‘,6)
        ,
        change2()
            this.$store.commit(‘changeMessage‘)
        ,
        changeSyncNumber()
            this.$store.dispatch(‘changeNumber‘,8)
        
    

</script>

点击改变后运行结果由1变成了9。

 

以上是关于谈一谈vuex的主要内容,如果未能解决你的问题,请参考以下文章

谈一谈Elasticsearch的集群部署

谈一谈对Activity的理解

谈一谈对Activity的理解

谈一谈CloudBlog的系统架构

谈一谈vuex

谈一谈CloudBlog的系统架构