继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Vuex

幕布斯6054654
关注TA
已关注
手记 1135
粉丝 218
获赞 1009

在 Vuejs 2.5 开发旅游网站项目时,需要实现 city 页面的数据传递给 index 首页。由于 City.vueHome.vue 没有公用父级组件,这样就无法通过一个公用的父级组件进行数据的中转。除了使用 bus 总线,还可以使用 Vuex 数据层框架来实现。


Vuex 图解

设计理念

当一个项目之中各个页面或者多个组件之间进行数据传值很困难的时候。如果可以把公用的数据放到一个公共的存储空间去存储。然后某一个组件改变了公共的数据,其他的组件就可以感知到数据的改变。

webp

上图中绿色 Vuex 虚线的内容就是一个公用数据存储区域。这个区域可以理解成一个仓库。这个仓库由几部分构成。
所有的公用数据,存放在 State 之中(紫色)。如果组件想用公用的数据,直接去调用 State 即可。

有时候,希望改变 State 里面的数据。不能直接让组件去改动数据。必须通过相应的流程完成。流程如下:

如果有异步操作或者复杂的同步操作,那么将它们放置在 Actions (黄色),组件先去调用 ActionsActions 紧接着去调用 Mutations (红色), 而 Mutations 逐个的对 State 的修改。
也可以越过  Actions ,让组件直接调用  Mutations ,修改 State 里面的数据。

使用

在 Vuejs 2.5 开发旅游页项目中的使用方法记录。

创建 store 文件夹,index.js 文件。Store 相当于图示中的公共数据区域(绿色虚线),随后再创建一个 state

webp


并在 main.js 中声明。


webp




直接使用 {{this.$store.state.city}} 来使用刚刚 storestate 下面 city 的数据。

webp



完善 storeindex.js 代码

import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({  state: {    city: '重庆'
  },  // actions 可省略
  actions: {
    changeCity (ctx, city) {
      ctx.commit('changeCity', city)
    }
  },  mutations: {
    changeCity (state, city) {
      state.city = city
    }
  }
})


模块化

store 同样可以进行模块化,优化简洁代码。

webp

webp

webp


mapState

之前使用公用数据时,需要写得很复杂,例如 {{this.$store.state.city}}。Vuex 提供了 mapState 的 API。搭配 computed 计算属性中的展开运算符 ...mapState 使公用数据写法变得简洁。

webp




再看一个例子:

webp


keep-alive 性能优化

当查看 network 时候,可以看到从首页到城市选择页切换过程中每次切换都会发送 ajax 请求。所以我们对此进行优化。

webp


App.vue 中给 <router-view/> 外部添加一个 <keep-alive> 标签。其含义是路由的内容被加载过一次之后,就把路由的内容放置到内存中,下一次再使用路由的时候,无需重新加载组件、执行钩子函数。只需要从内存中拿出以前的内容显示就可以了。

webp


activated 生命周期钩子

结合 keep-alive 新增的 activated 生命周期钩子,实现每次点击曾经选中过的城市,不发送 ajax,城市选择变化的时候再进行 ajax 请求的优化。


webp



作者:evenyao
链接:https://www.jianshu.com/p/b083b9f35bf8


打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP

热门评论

666

查看全部评论