Vue 简单的 store 模式

作者: Cherry丶小丸子 | 来源:发表于2021-04-27 14:07 被阅读0次

    1、在 src 目录下 创建 store / index.js

    // 简单的 store 模式
    let store = {
        debug: true,
        state: {
            message: 'Hello!'
        },
        setMessageAction(newValue) {
            if (this.debug) console.log('setMessageAction triggered with', newValue)
            this.state.message = newValue;
        },
        clearMessageAction() {
            if (this.debug) console.log('clearMessageAction triggered')
            this.state.message = '';
        }
    }
    export default store
    
    `需要注意,所有 store 中 state 的变更,都放置在 store 自身的 action 中去管理。
    这种集中式状态管理能够被更容易地理解哪种类型的变更将会发生,以及它们是如何被触发。
    当错误出现时,我们现在也会有一个 log 记录 bug 之前发生了什么`
    

    2、引入 store / index.js

    // 在需要使用 store 的 .vue 文件里面引入
    import store from "@/store/index.js"; // 导入 store 文件
    
    或者
    
    // 挂载到 vue 实例中
    // 在 main.js 中写入
    /* 
        引入-----简单的 store 模式
     */
    import store from './store/index.js';
    Vue.prototype.$store = store;
    
    

    3、.vue 文件里的 data 里面设置

    // a.vue
    var vmA = new Vue({
        data(){
            return {
                privateState: {},
                sharedState: store.state, // .vue 引入方法,此处必须这样写,如果写成sharedState: store.state.message则不能同步更新
                // sharedState: this.$store.state // 挂载到 vue 实例方法
            }
        }
    })
    
    // b.vue
    var vmB = new Vue({
        data(){
            return {
                privateState: {},
                sharedState: store.state // .vue 引入方法,此处必须这样写,如果写成sharedState: store.state.message则不能同步更新
                // sharedState: this.$store.state // 挂载到 vue 实例方法
            }
        }
    })
    `这样就和普通的 data 数据一样使用了`
    
    `接着我们继续延伸约定,组件不允许直接变更属于 store 实例的 state,而应执行 action 来分发 (dispatch) / 事件通知 store 去改变,
    我们最终达成了 Flux 架构。这样约定的好处是,我们能够记录所有 store 中发生的 state 变更,
    同时实现能做到记录变更、保存状态快照、历史回滚/时光旅行的先进的调试工具`
    

    4、解决页面刷新之后 store 数据丢失问题

    原因:刷新页面时,vue实例重新加载,从而,store也被重置了。store是用来存储组件状态的,而不是用来做本地数据存储的。所以,对于不希望页面刷新之后被重置的数据,使用本地存储来进行存储。

    cookie: 不适合存储大量的数据。
    localStorage: 是永久存储,浏览器关闭后数据不会丢失,除非主动删除数据。当关闭页面后重新打开,会读取上一次打开的页面数据。
    sessionStorage: 在当前浏览器窗口关闭后自动删除。所以,sessionStorage 最合适

    // store / index.js 修改
    let store = {
        debug: true,
        state: window.sessionStorage.getItem('sharedState') ? JSON.parse(window.sessionStorage.getItem('sharedState')) : {
            message: 'Hello!'
        }
    }
    export default store
    
    
    // 在 App.vue 中添加
    mounted() {
        // 监听当浏览器窗口关闭或者刷新时
        // window.addEventListener('unload', this.saveSharedState)
        window.addEventListener('beforeunload', this.saveSharedState)
    },
    methods: {
        saveSharedState() {
            window.sessionStorage.setItem('sharedState', JSON.stringify(this.$store.state))
        }
    }
    
    // 也就是监听 unload 或者 beforeunload 方法,如果重载页面就把 state 存入 sessionStorage
    
    vuex-persistedstate(vuex持久化状态插件)
    npm install vuex-persistedstate --save
    

    相关文章

      网友评论

        本文标题:Vue 简单的 store 模式

        本文链接:https://www.haomeiwen.com/subject/acgurltx.html