首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你真的会用vuex吗?

你真的会用vuex吗?

原创
作者头像
brzhang
发布2019-08-13 17:26:22
1.8K0
发布2019-08-13 17:26:22
举报
文章被收录于专栏:玩转全栈玩转全栈

不得不说,vuex真实一个非常好用的库,在vue中起着举足轻重的作用,那么,vuex的作用是什么呢?作为一个新手,我们关心的是在什么样的场景下,应该请出vuex这个大杀器。

vuex的作用

当然,我这里肯定不会给你讲官话,我将的只可能是基于实践中自己的感受,vuex实际上就是多页面共享数据仓库。是的,这就是我的vuex的理解,在我们开发也许需求的时候,不可避免的我们需要在多页面之间共享一些数据,比如用户基本信息,比如,省份城市列表等等,活在在举出一个例子,比如电商网站,用户的购物车数据,是的,这些数据都是要在所有页面中能个随时拿随时取的。好,我们不免有一个问题要问,难道我们就非得要使用vuex吗?

非得需要使用vuex来共享数据

这个答案明显是不一定的,官方也有着其建议,比较小的项目,本身的业务逻辑也不是很复杂,也不存在居多页面之间的交互,逻辑在怎么乱也乱不到哪里,因此是没有比较引入vuex的,一个简单的 store 模式就足够您所需了,嗯,没错,实际上只有中大型项目才有引入vuex的必要,所以说,引入vuex的另外一个不可忽视的原因是,代码解耦,扪心自问,页面的逻辑已经比较复杂了,有自己的数据,有跳转,有那么多的methods,computes,等等,已经受够了,还要去维护一个全局数据的管理,还要担心脏数据,真实受够了,这些交给一个专业的全局数据管理员多好呢?嗯,vuex就是你需要的这个管理者。

vuex三问

  1. vuex数据存在什么地方
  2. vuxe数据怎么修改
  3. vuex是谁的
要弄懂这三个问题,我们直接就看一个vuex的实例就好了
Vue.use(vuex);
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

所以,直观的讲,数据是存在,state里面的,操作数据在什么地方,答案是放在actions中,具体到了业务怎么触发,则是使用dispatch,比如state.dispath('increment'),然而,那么mutations是干嘛的,呵呵,我也是觉得脱裤子放屁,多此一举,如果你和我们一样这么认为,很不幸,我们都理解错了,事实上,只有通过mutations里面的方法去修改state中存储的数据,这些数据的变化才可以被追踪。改变 store 中的状态的唯一途径就是显式地**提交 (commit) mutation**。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用这是官方原话,不按照这么做,妄图直接修改state中的变量,bug是一定会粗线的。

Action和mutation是很相似的,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态,这也就是以为这可以缓冲。
  • Action 可以包含任意异步操作,所以耗时操作可以网这里丢。

第三问,这个仓库是属于谁的,这很重要,这就要看他如何挂载了。

export const vm = new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App)
});

事实上,vuex属于这个vm实例这个实例的,所以,他存储的数据的只对目前这个vm负责,换句话说,你在起一个new Vue,不好意思,数据你拿不到,就好比进程隔离数据一样,这也就是业界说的对于多页面(开多个页面)的vue是共享不到数据的。

如图,vue的这棵树,可以理解app就是我们的vue实例,至于root是什么,我目前也不清楚,然后其他下面的都是可以认为是component,然后,顺理成章的来说,被这颗vue管理的这个vuex,被这棵树自己所共享,无论是更节点,还是叶子节点都是一样,能拿,能修改,router-view路由过去的也是如此,事实上你将其想成一个component即可。你router-view切换再多层次,千遍万变,你会发下App雷打不动,所以vue也是雷打不动。

所以,有人就问啊,为什么我的页面刷新一下,vuex存储的数据都丢了

所以,明白了上面的三问,这都不是一个问题了,因为刷新之后,vm会重新实例化,上一个vm的vuex中state怎么可能被你拿到呢?所以,关键是怎么办呢?很简单,使用sessionStorage来存储一下state状态,具体做法是:在App.vue中

<script>
  export default {
    name: 'App',
    methods: {
      store() {
        console.log('正在保存store的状态到sessionStorage')
        console.log(this.$store.state)
        sessionStorage.setItem("store", JSON.stringify(this.$store.state))
      }
    },
    created() {
      //在页面加载时读取sessionStorage里的状态信息,解决浏览器刷新之后vuex数据丢失的问题,导致需要重复请求网络
      if (sessionStorage.getItem("store")) {
        this.$store.replaceState(Object.assign({}, this.$store.state, JSON.parse(sessionStorage.getItem("store"))))
        console.log('正在从sessionStorage恢复store')
        console.log(this.$store.state)
      }

      //在页面刷新时将vuex里的信息保存到sessionStorage里
      window.addEventListener("beforeunload", this.store)
    },
    destroyed() {
      window.removeEventListener("beforeunload", this.store)
    }
  }
</script>

那么,为什么不用localStorage,这个还是留给读者自己吧,别制作伸手党,自己也要有点思考。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • vuex的作用
  • 非得需要使用vuex来共享数据
  • vuex三问
    • 要弄懂这三个问题,我们直接就看一个vuex的实例就好了
    • 所以,有人就问啊,为什么我的页面刷新一下,vuex存储的数据都丢了
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档