0
点赞
收藏
分享

微信扫一扫

Vuex快速上手

科牛 2021-09-24 阅读 83
Vue

Vuex快速上手

一、Vuex安装使用

  • 安装Vue CLI
cnpm install -g @vue/cli
  • 创建项目名称
vue create 项目名称
  • 选择下载的模式
  • 选择需要的配置

  • 选择路由模式
  • 是否需要保存当前的配置项(n)等操作(Y)
  • 安装Vuex
cnpm install Vuex -S
  • 引入并使用插件
import Vue from "vue"
import Vuex from "vuex";
Vue.use(Vuex);
  • 创建公共的内存对象
const store = new Vuex().store({

})
export default stroe;
  • 将Vuex在入口文件引入,挂载在Vue上
new Vue({
    store,
    render:h => h(app)
}).$mount('#app')

二、Vuex常用的配置项

  • state:存储公共状态

  • mutations:修改公共状态(必须是同步函数,只处理数据,不做逻辑)

  • actions:处理异步

  • modules:公共状态私有化

  • getters:公共状态计算属性

总结:mapMutions和mapActions是映射到methods上,mapState和mapGetter是映射到computed上

三、数据传递的流程

  • 案例描述:
  • one.vue
<template>
    <div>
        <h2>这是一个One组件</h2>
        <p>{{$store.state.n}}</p>
        <button @click="handleAdd">点击</button>
    </div>
</template>

<script>
export default {
    data(){
        return {
            message:"lxc"
        }
    },
    created() {
        console.log(this);
    },
   methods:{
        handleAdd(){
           this.$store.dispatch("handleActionsAdd","lxc")
        }
   }
}
</script>
  • two.vue
<template>
    <div>
         <h2>这是一个Two组件</h2>
         <p>{{$store.state.n}}</p>
    </div>
</template>
  • store中的index.js
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);

const store = new Vuex.Store({
    state: {
        n: 10
    },
    actions: {
        handleActionsAdd({ commit }, params) {
            commit("handleMutationsAdd", params)
        }
    },
    mutations: {
        handleMutationsAdd(state) {
            state.n++;
        }
    }
})

export default store;
  • 运行结果

四、Vuex的简易封装

let Vue;
function install(_Vue) {
    //vue.use是找到install方法,给他传递一个vue
    Vue = _Vue;
    Vue.mixin({
        //将store的实例挂在vue的实例身上   this.$store.state.属性
        beforeCreate() {

            if (this.$options.store) {
                Vue.prototype.$store = this.$options.store;
            }
        },
    })
}

class Store {
    //初始化
    constructor(options) {
        //将state中的状态转换为响应式状态
        this.state = new Vue({
            data: options.state
        })

        //初始化mutations
        this.mutations = options.mutations || {};

        //初始化actions
        this.actions = options.actions || {};
        
        //初始化getters
        options.getters && this.handleGetters(options.getters)
    }
    
    commit(eventName, params) {
        var fn = this.mutations[eventName];
        fn(this.state, params);
    }
    
    dispatch(eventName, params) {
        var fn = this.actions[eventName];
        fn({ commit: this.commit.bind(this), dispatch: this.dispatch.bind(this), state: this.state }, params);
    }
    
    handleGetters(getters) {
        var that = this;
        this.getters = {};

        Object.keys(getters).forEach(key => {
            Object.defineProperty(that.getters, key, {
                get: function () {
                    return getters[key](that.state);
                }
            })
        })
    }
}
举报

相关推荐

0 条评论