• 10 — vuex


    1,vuex

    官网介绍:Vuex 是一个专为 Vue.js 应用程序开发的状态(数据)管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
    个人理解:是一个‘’仓库‘’,只是vuex里面存储的是数据。

    2,vuex的各个模块

    1. state:用于数据的存储,
    2. getters:如vue的计算属性一样,可以对state的数据进行二次封装,
    3. mutations:同步操作,改变state数据的唯一途径,
    4. actions:异步操作,类似于mutation,用于提交mutation来改变状态,
    5. modules:将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter。

    3,Vuex实例应用

    首先在项目中下载vuex,执行命令:npm install --save vuex
    在src目录下创建store文件夹
    store目录结构

    store目录结构

    store/index.js

    import Vue from 'vue'
    import Vuex from 'vuex'
    import getters from './getters'
    
    Vue.use(Vuex)
    
    //把modules下的所有文件导入
    const modulesFiles = require.context('./modules', true, /\.js$/)
    
    // you do not need `import app from './modules/app'`
    // it will auto require all vuex module from modules file
    const modules = modulesFiles.keys().reduce((modules, modulePath) => {
       // set './app.js' => 'app'
       const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
       const value = modulesFiles(modulePath)
       modules[moduleName] = value.default
       return modules
    }, {})
    
    const store = new Vuex.Store({
       modules,
       getters
    })
    
    export default store
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在main.js中导入store。

    import store from './store'
    
    //在vue全局对象上注册store(相当于挂载到全局对象Vue上)
    new Vue({
      el: '#app',
      router,
       store,
      components: { App },
      template: '<App/>'
    });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    数据初始化(./modules/login.js)

    const state = {
        account: '管理员',
        password: '123456',
        msg:'',
    }
    
    //修改数据的唯一方法(同步)
    const mutations = {
        SET_ACCOUNT: (state, account) => {
            // 将组件的数据存放于state
            state.account = account
        },
        SET_PASSWORD: (state, password) => {
            state.password = password
        },
        SET_MSG: (state, msg) => {
            state.msg = msg
        },
    }
    
    //提交mutation,改变数据,
    const actions = {
        alterMsg({ commit }, v) {
            commit('SET_MSG', v)
        },
    }
    
    /*
      * namespaced: true:使其成为带命名空间的模块。当模块被注册后,
      * 它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。
      * */
    export default {
        namespaced: true,
        state,
        mutations,
        actions
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    存、取值

    <template>
        <div>
            <h1>欢迎来到页面——vuex</h1>
            <p>当前页面msg的值:{{msg}}</p>
            <div>
                <span>点击按钮,把msg存入vuex,并在下个页面显示</span>
                <el-button type="primary" @click="handleSaveMsg">保存msg</el-button>
            </div>
            <hr>
            <p>第1种方法,显示vuex中存在的账户号:{{oneAccount}}</p>
            <p>第2种方法,显示vuex中存在的账户号:{{twoAccout}}</p>
        </div>
    </template>
    
    <script>
    import { mapState } from 'vuex';
    
    export default {
        name: "vueVuex",
        data() {
            return {
                msg: "Hello Vue!",
            };
        },
        computed: {
            ...mapState({
                //第2种取值,state.
                twoAccout: state => state.login.account,
            }),
            oneAccount() {
                // 第1种取值,this.$store.state.
                return this.$store.state.login.account;
            }
        },
        methods: {
            handleSaveMsg() {
                /* //同步存值
                //this.$store.commit(键,值)。
                this.$store.commit("login/SET_MSG", this.msg);
                this.$router.push({
                    name: "/vue/vuex-details"
                }); */
    
                //异步存值
                //this.$store.dispatch(键,值)。
                this.$store.dispatch("login/alterMsg",this.msg);
                this.$router.push({
                    name: "/vue/vuex-details"
                });
            },
        },
    };
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    效果展示
    在这里插入图片描述

  • 相关阅读:
    MySQL:增量备份和恢复(5)
    springboot 项目生成docker镜像
    SQL必需掌握的100个重要知识点:使用游标
    【Linux】WSL2与VMware切换使用
    程序员需要了解英国文学
    ASP.NET Core中如何限制响应发送速率(不是调用频率)
    leetcode刷题(126)——1289. 下降路径最小和 II
    电容笔和触屏笔一样吗?高性价比电容笔排行
    如何实现高效地扩展5G毫米波段?
    linux常用命令
  • 原文地址:https://blog.csdn.net/dugujiuding/article/details/125497123