Vuex的理解与应用

时间:2024-04-19 10:47:00 类型:vue
字号:    

一. vuex是什么

1, 概念: 专门在Vue中实现集中式状态(数据)管理的一个Vue插件(Vue.use()), 对vue应用中多个组件的共享状态进行集中式的管理(读/写), 也是一种组件间通信的方式, 且适用于任意组件间通信

2,    github地址:https://github.com/vuejs/vuex

二. 什么时候用vuex

1,  多个组件依赖于同一状态

2,  来自不同组件的行为需要变更同一状态

三. 使用过程

1,  npm i vuex@3  (安装插件)

注意: 2022年7月,默认安装vue为npm vue3版本, vuex默认版本为vuex4(只能在vue3中使用)

 1, vue2, 使用vuex3

  2, vue3, 使用vuex4

2,  Vue.use(Vuex)

3,  store

4,  vc  ==> store(每个组件都可以用store)

四. 搭建vuex环境

1,  创建store文件  ./store/index.js

//该文件用于创建Vuex中最为核心 的store
//引入vue
import Vue from "vue";

//引入vuex库
import Vuex from "vuex";

// 使用vuex
Vue.use(Vuex)  //让各个组件中拥有store属性
//准备ctions--用于响应组件中的动作
const actions = {}
//准备mutations--用于操作数据(state)
const mutations = {}
//准备state = {}
const state = {}
export default new Vuex.Store({
    actions,
    mutations,
    state
})

2,  在main.js中创建vm时传入store配置项

//引入store
import store from './store'
Vue.config.productionTip = false

new Vue({
    el:'#app',
    render: h=> h(App),
    store,
    beforeCreate() {
        Vue.prototype.$bus = this;
        //安装全局事件总线, 所有的VC,VM都能看到$bus
    },
})

五. 实例代码应用

  1. Count.vue组件: 增加数据

    1.1 dispath调用 actions, actions提交到mutations, mutations直接修改数据

    1.2 commit调用mutations, mutations直接修改数据

    组件中修改vue数据:

    this.$store.dispatch('actions中的方法名',数据)      【逻辑复杂时,把业务逻辑写在actions中】

    this.$store.commit('mutations中的方法名',数据)  【没什么逻辑时使用】

<template>
  <div>
        <select v-model.number="n">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
        </select>
        <button @click="increment">加一</button>
        <button @click="deincrement">减一</button>
  </div>
</template>

<script>
export default {
    name:'Count',
    data() {
        return {
           n:1 
        }
    },
    methods:{
        increment(){
            this.$store.dispatch('increment',this.n)
            //dispatch中的increment: 对应store.js中actions中的increment方法

        },
        deincrement(){
            this.$store.commit('DEINCREMENT',this.n)
            //commit中的increment: 对应store.js中mutations中的increment方法
            //如果不需要actions做什么(即不需要服务员做什么), 可以直接找后厨

        }
    }
}
</script>

2,   更新state信息

//该文件用于创建Vuex中最为核心 的store
//引入vue
import Vue from "vue";
//引入vuex库
import Vuex from "vuex";
// 使用vuex
Vue.use(Vuex) //让各个组件中拥有store属性
export default new Vuex.Store({
    //准备actions--用于响应组件中的动作
    actions:{
        increment(context,value){
            //context中还有dispatch[可以调用其它方法],及state
            //写业务代码,调整value
            context.commit('INCREMENT',value)
            //commit中的increment: 对应mutations中的increment方法
            //注意: 这里也可以直接执行mutations中的数据,只是开发者工具看不到效果
        }
    },
    //准备mutations--用于操作数据(state)
    mutations:{
        INCREMENT(state,value){
            state.sum += value
            console.log(value,state.sum);
         },
         DEINCREMENT(state,value){
             state.sum -= value
         }
    },
    //准备state = {}
    state:{
        sum:1
    },
    //准备getters , 用于加工state中的数据, 类似于computed属性
    getters:{
        bigSum(state){
            return state.sum * 10
        }
    }
})

3,  读取state信息

组件中读取vue数据: {{$store.state.sum}}

<template>
    <div class="main">
         <h1>vuex学习</h1>
         <!-- 模板里面能够看到VC里面的所有东西, 所以这里不用写this.$store -->
         <p>当前的和是:{{$store.state.sum}}</p>
        <p>当前的和*10的结果是:{{$store.getters.bigSum}}</p>
         <Count/>
    </div>
    
</template>

<script>
import Count from './components/Count.vue'
export default {
    name:"App",
    components:{
        Count,
    },
    mounted() {
        console.log(this);
    },
    
}
</script>

4,   getters的使用

1, 概念: 当state中的数据需要经过加工后再使用时, 可以使用getters加工

   2,  见2中的实例

3,  组件中读取{{$store.getters.bigSum}}


<