前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >#Vue 简单的 store 模式

#Vue 简单的 store 模式

原创
作者头像
前端小tips
修改2021-11-25 13:09:18
1.2K0
修改2021-11-25 13:09:18
举报
文章被收录于专栏:前端文章小tips

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

代码语言:javascript
复制
// 简单的 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

代码语言:javascript
复制
// 在需要使用 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 里面设置

代码语言:javascript
复制
// 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 最合适

代码语言:javascript
复制
// store / index.js 修改
let store = {
    debug: true,
    state: window.sessionStorage.getItem('sharedState') ? JSON.parse(window.sessionStorage.getItem('sharedState')) : {
        message: 'Hello!'
    }
}
export default store
代码语言:javascript
复制
// 在 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持久化状态插件)
代码语言:javascript
复制
npm install vuex-persistedstate --save

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、在 src 目录下 创建 store / index.js
  • 2、引入 store / index.js
  • 3、.vue 文件里的 data 里面设置
  • 4、解决页面刷新之后 store 数据丢失问题
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档