Vuex的学习和使用

127 阅读1分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

什么是vuex?

Vuex 是专门为 Vue.js 设计的状态管理库,采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

简单地说就是采用全局单例模式,将组件的共享状态抽离出来管理,使组件树中的每一个位置都可以获取共享的状态(变量)或者触发行为。

额,或者更直白的说就是响应式的全局变量

Vuex的安装以及使用

安装Vuex

npm install vuex --save     // 如果安装了淘宝镜像可以使用 cnpm安装

新建store文件夹,新建一个index.js文件,引入Vue和Vuex.

目录结构:

1878611-20200417163831218-841328117.png

我是将store属性抽离出去的看个人习惯

index.js

import Vue from 'vue'
import Vuex from 'vuex'
// 导入抽离出去的属性
import store from './store'

Vue.use(Vuex)

export default new Vuex.Store({
  ...store, //Es6语法展开运算符,将方法展开

  modules: {} // 模块化Vuex
})

store.js

// 将属性分离出来便于更好的维护
export default {
    state: {},
    mutations: {},
    actions: {}
}

在main.js中注册

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import './styles/base.css'
Vue.config.productionTip = false
new Vue({
  router,
  store, //注册store 组件中用this.$store访问
  render: h => h(App)
}).$mount('#app')

store中的 state,mutation,anction,getter

1.state

在state中定义属性name,给个值 "大仙" ,在组件中使用 this.$store.state.name获取定义的属性name

store.js

// 将属性分离出来便于更好的维护
export default {
    state: {
        name:'大仙' // 定义的属性
    },
    mutations: {},
    actions: {}
}

Home.vue

  <div>
    <h2>Home</h2>
    {{name}}
  </div>
</template>

<script>
export default {
  data() {
    return {
      name:''
    };
  },
  created(){
    // this.$store.state.name 获取Vuex中的name值
    this.name=this.$store.state.name
    console.log(this.name);
    
  }
};
</script>

2.mutation 修改state的唯一方法

修改state只能通过mutation来修改包括action也是通过提交mutation去修改

store.js

        //不带参数的方法
        changeName(state) {
            state.name = '修改后'
        },
        // 带参数的方法
        changeNameparameter(state, value) {
            state.name = value
        }
    },

Home.vue

  <div>
    <h2>Home</h2>
    {{this.$store.state.name}}
    <button @click="setName">没有参数</button>
    <button @click="setNameParameter('传的参数')">带参数</button>
  </div>
</template>

<script>
export default {
  data() {
    return {};
  },
  methods: {
    // 不带参数修改
    setName() {
      this.$store.commit("changeName");
    },

    // 带参数修改 两种方法
    setNameParameter(value) {
      // 1.载荷提交
      this.$store.commit("changeNameparameter", value);
      // 2.对象提交
      this.$store.commit({
        type:'changeNameparameter',
        value
      });

    }
  }
};
</script>

3.anction 异步修改状态

mutation中是不允许异步操作的,如果我们需要异步修改怎么办?于是Vuex为我们提供了action

store.js

        // 1.不带参数
        changeNameActions(context){
            // 异步修改
            setTimeout(()=>{
                context.commit('changeName')
            },1000)
        },
        // 2.带参数
        changeNameActionsParameter(context,value){
            // 异步修改
            setTimeout(()=>{
                context.commit('changeNameparameter',value)
            },1000)
        }
    }

Home.vue

  <div>
    <h2>Home</h2>
    {{this.$store.state.name}}
    <button @click="setName">没有参数</button>
    <button @click="setNameParameter('传的参数')">带参数</button>
  </div>
</template>

<script>
export default {
  data() {
    return {};
  },
  methods: {
    // 不带参数修改
    setName() {
      this.$store.dispatch("changeNameActions");
    },

    // 带参数修改 两种方法
    setNameParameter(value) {
      // 1.载荷提交
      this.$store.dispatch("changeNameActionsParameter", value);
      // 2.对象提交
      this.$store.dispatch({
        type:'changeNameActionsParameter',
        value
      });

    }
  }
};
</script>

4.getter

getter,我们可以理解为是对store中state的一些派生状态,也可以理解为一种计算属性,因为它像计算属性一样,返回值会根据它的依赖被缓存起来,且依赖对象发生改变的时候它才会被重新计算

store.js

        // 1.不带参数
        changeNameGetter:(state)=>{
            if(state.name==='大仙'){
                return state.name+'1111'
            }
        },
        // 2.带参数
        changeNameGetterParameter:(state)=>(value)=>{
            if(state.name==='大仙'){
                return state.name+" "+value
            }
        }
    }

Home.vue

  <div>
    <h2>Home</h2>
    {{this.$store.getters.changeNameGetter}}
    {{this.$store.getters.changeNameGetterParameter('传的参数')}}
  </div>
</template>

<script>
export default {
  data() {
    return {};
  }
};
</script>