zoukankan      html  css  js  c++  java
  • vuex上手

    核心概念

    • modules 模块
      • state 状态
      • getters 获取状态属性
      • mutations 改变状态(同步)
      • acitons 改变状态(异步)

    示例代码

    本示例托管在gitee博客

    1. CDN方式引入vue、vuex

    • 外国cdn

      • https://unpkg.com/vue

      • https://unpkg.com/vuex

    • gitee博客托管:

      • https://koalamini.gitee.io/library/vue.min.js
      • https://koalamini.gitee.io/library/vuex.js
    <script src="https://unpkg.com/vue"></script>
    <script src="https://unpkg.com/vuex"></script>
    

    2. vuex示例

    <script type="text/javascript">
        const modulesA = {
            // 命名空间
            namespaced: true,
            // 状态
            state: () => ({
                todos: [{
                    id: 1,
                    text: '已完成的任务',
                    done: true
                },
                        {
                            id: 2,
                            text: '未完成的任务',
                            done: false
                        }
                       ]
            }),
            // 获取状态属性
            getters: {
                // 获取完成的任务
                doneTodos: state => {
                    return state.todos.filter(todo => todo.done);
                },
                // 获取完成任务的数量
                doneTodosCount: (state, getters) => {
                    return getters.doneTodos.length
                },
                // 根据ID获取任务
                getTodoById: (state) => (id) => {
                    return state.todos.find(todo => todo.id === id)
                }
            },
            // 改变状态(同步)
            mutations: {},
            // 改变状态(异步)
            actions: {}
        }
    
    const modulesB = {
        namespaced: true,
        state: {
            count: 0
        },
        // 改变状态(同步)
        mutations: {
            // 计数+1
            increment(state) {
                state.count++
            },
            // 计数+n,提交载荷
            incrementPayload(state, n) {
                state.count += n
            }
        },
        // 改变状态(异步)
        actions: {
            incrementAsync(context) {
                setTimeout(() => {
                    context.commit('incrementPayload', 10)
                    console.log('5秒后,b/count', context.state.count)
                }, 5*1000)
            }
        }
    }
    
    // vuex存储
    const store = new Vuex.Store({
        modules: {
            a: modulesA,
            b: modulesB
        }
    })
    
    // 获取状态
    console.log('a/doneTodos', store.getters['a/doneTodos'])
    // 改变状态
    store.commit('b/increment')
    console.log('b/count', store.state.b.count)
    
    new Vue({
        el: '#app',
        store: store,
        data: {
            message: '请按【f12】查看控制台'
        },
        methods: {
            // 计数异步增加
            incrementAsync(){
                // vuex派发
                this.$store.dispatch('b/incrementAsync')
            }
        },
        // 挂载后
        mounted() {
            this.incrementAsync()
        }
    })
    </script>
    

    运行结果:

    image-20211220140804659

    • 通过namespaced控制多模块,通过模块/状态属性名访问相应模块的状态属性
    • 同步改变状态mutations方式,只能通过store实例方法commit修改,直接修改会报Error in callback for watcher "function () { return this._data.$$state }"错误,详情
    • 异步改变状态actions方式,需要通过store实例方法dispatch修改


    • 创建时间: 2021.12.15.3_14.24.29
    • 更新时间: 2021.12.20.1_02.58.23
    • 版权作者: 贝可考拉
    • 当前版本: v1.0
    • 标签分类: #编程开发 #web #vue #vuex
  • 相关阅读:
    python语言中的编码问题(续)
    python语言中的编码问题
    如何为eclipse安装合适版本的python插件pydev
    JavaScript 中的变量命名方法
    使用tomcat manager 管理和部署项目
    不同地图坐标系的经纬度转换方法
    tomcat项目中文乱码问题解决方法
    CATransition(os开发之画面切换) 的简单用法
    星级评价 实现
    ASIHttpRequest 使用理解
  • 原文地址:https://www.cnblogs.com/koalamini/p/15710965.html
Copyright © 2011-2022 走看看