目标: Vuex的高级使用与localStorage本地存储

  1. bug:我们在src/store/index.js中设置的city的默认值是“上海”,当我们在城市列表中选择某一个城市的时候,首页上确实会变成相应的城市,但是当我们再刷新首页的时候会发现又变成了“上海”。

正常情况下我们去访问一个网页,当再次打开的时候,它显示的应该是用户上次请求的内容。在H5中有一个新增API: localStorage,它可以帮助我们实现类似Cookie的功能,做到本地存储,这个API比Cookie更简单,所以在这里使用localStorage来实现城市保存的功能。

  1. localStorage的使用:在city这个数据发生变化的时候,除了改变公共数据state中的city,还要把这个city进行本地存储,而首页中city的默认值就是localStorage.city或者上海:
export default new Vuex.Store ({state: {city: localStorage.city || '上海'},mutations: {changeCity (state, city) {state.city = citylocalStorage.city = city}}
})

注意: 在使用localStorage的时候最好是在外层加一个try-catch,因为如果用户关闭了浏览器的本地存储功能或者使用隐身模式,使用localStorage有可能会导致浏览器直接抛出异常,整个代码就无法运行了,为了避免这种问题,最好是在外层加一个try-catch:

let defaultCity = '上海'
try {if (localStorage.city) {defaultCity = localStorage.city}
} catch (error) {}export default new Vuex.Store ({state: {city: defaultCity},mutations: {changeCity (state, city) {state.city = citytry {localStorage.city = city} catch (error) {}}}
})
  1. store目录下的index.js文件中的内容开始变得复杂起来了,在真正的项目开发中,会将整个文件做进一步的拆分。

在store中创建state.js文件,将与城市数据更新相关的代码拆分到state.js文件中,并将city export出去,这时需要在index.js中引入这个模块才能使用state.js接口对象中的city数据。

state.js:

let defaultCity = '上海'
try {if (localStorage.city) {defaultCity = localStorage.city}
} catch (error) {}export default {city: defaultCity
}

创建store/mutations.js,将index.js中的mutations下的changeCity函数拆分到mutations.js文件中并export出去,则在index.js中使用这个模块同样要import进去。

mutations.js:

export default {changeCity(state, city) {state.city = citytry {localStorage.city = city} catch (error) {}}
}

此时index.js中就变成了:

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import mutations from './mutations';Vue.use(Vuex)export default new Vuex.Store ({state: state,mutations: mutations
})

键和值是一样的,可以进一步修改成ES6的写法:

export default new Vuex.Store ({state,mutations
})
  1. 小bug: 当我们选择的城市名字是4个字或者5个字的时候,会发现首页的header部分会被撑开,页面样式放生了变化。

在home的Header.vue组件中进行样式的修改:
原本是:

.header-rightwidth: 1.24remfloat: right text-align: centercolor: #fff

上面的代码写死了它的宽度,修改:

.header-rightmin-width: 1.04rempadding 0 .1remfloat: right text-align: centercolor: #fff
  1. vuex的使用的优化

我们在使用state当中的city数据时,是这样写的:this.$store.state.city,写起来很繁琐, vuex提供了一个简便的API。

pages/home/components/Header.vue中首先引入:import { mapState } from 'vuex', 然后设置一个计算属性:

export default {name: 'HomeHeader',computed: {...mapState(['city'])}
}

计算属性中的...是一个展开运算符,mapState的意思是指把vuex里面的数据映射到当前这个组件的计算属性中,就是把city这个公用数据映射到名称为city的计算属性中,所以,在使用这个数据的时候就可以使用this.city替换原来的this.$store.state.city

也可以这样用:

computed: {...mapState({currentCity: 'city'})
}

表示的是: 想要把公用数据中的city映射到当前组件的计算属性当中,映射过来的名称叫作currentCity,所以这里就可以直接用this.currentCity代替this.$store.state.city

同样的,当点击城市按钮的时候,city数据将会发生变化,就会去派发一个mutation,即this.$store.commit('changeCity', city)。Vuex同样也提供了一个简便的方法:mapMutations。

首先,import { mapState, mapMutations } from 'vuex',然后在methods中应用mapMutations:

methods: {handleCityClick (city) {// this.$store.commit('changeCity', city)this.changeCity(city)this.$router.push('/')},...mapMutations(['changeCity'])
}

...mapMutations(['changeCity'])表示的意思是: 有一个名字叫作changeCity的mutation,我把这个mutation映射到当前组件的一个名为changeCity的方法中,那如果要调用这个mutation就可以直接使用this.changeCity(city)来代替this.$store.commit('changeCity', city)了。

Search.vue中也要做出同样的修改,但是一定要记得先引入这个方法。

Vuex核心概念中的Getters它是一个方法,它的参数是state,可以根据state的值经过计算得到一些新的值,避免数据的冗余,它的功能有点类似于计算属性。

Module在目前还应用不上,具体的应用方法去官网自行学习。

代码提交

去哪儿-14-vuex_localstorage相关推荐

  1. 程序员经常去的 14 个顶级开发者社区(转)

    我们来看一下程序员经常去的 14 个顶级开发者社区,如果你还不知道它们,那么赶紧去看看,也许会有意想不到的收获. Stack Overflow 9 月份,Stack Overflow 也将迎来其 6 ...

  2. 必须去收藏14个响应式布局的前端开发框架

    必须去收藏14个响应式布局的前端开发框架 前端开发并不是一个容易的工作,不仅需要掌握HTML.CSS和JavaScript,针对不同的浏览器版本和平台,还需要了解如何设计出跨平台的网站.如今随着响应式 ...

  3. 14个程序员常去的外国网站

    作为程序员,选择好合适的开发社区对提高自己的编程能力会有很大的帮助,我也说不出为什么,但是一些优秀的实时开发社区确实能帮你积累不少开发经验. 下面这张图列出了14个程序员经常逛的顶级开发社区,作为程序 ...

  4. 14个顶级开发社区 [程序员]

      程序员常去的 14个顶级开发社区 [经典]         作为程序员,选择好合适的开发社区对提高自己的编程能力会有很大的帮助,我也说不出为什么,但是一些优秀的实时开发社区确实能帮你积累不少开发经 ...

  5. 已交社保10年,断交社保14年了,现在是继续交还是不交?

    这个事情我是这样看的! 第一,当地社保解释的没有道理: 为什么这么说呢?这是因为<社保法>规定,企业为职工参保缴费带有强制性,个人参保缴费自由.那么企业已经给你买断下岗,你就属于灵活就业人 ...

  6. c#委托与事件(二)

    这篇博客是在上篇的基础开始讲述了一下委托的一些用法,首先我举一个例子说明了一下前面章节的知识点,接下来我说了将方法作为参数传递的一个案例,接下来实现了一个委托实现冒泡排序的方法,如果你们和我一样正在学 ...

  7. 干货 | 20个教程,掌握时间序列的特征分析(附代码)

    作者 | Selva Prabhakaran 译者 | Tianyu 责编 | Jane 出品 | AI科技大本营(ID: rgznai100) [导语]时间序列是指以固定时间为间隔的序列值.本篇教程 ...

  8. 基本数据结构和算法回顾

    最近想回过头来看看以前写的一些代码,可叹为何刚进大学的时候不知道要养成写博客的好习惯.现在好多东西都没有做记录,后面也没再遇到相同的问题,忘的都差不多了.只能勉强整理了下面写的一些代码,这些代码有的有 ...

  9. 简单的选择排序(内部排序)

    1 /** 2 * 3 */ 4 package com.trfizeng.selectionsort; 5 6 /** 7 * @author trfizeng 内部排序 选择排序-简单选择排序(S ...

  10. 读书笔记—写给大家看的PPT设计书

    作者:[美]Robin Williams 第一部分 写在设计之前 在现实生活中你可以表现得不可思议地愚蠢,你的话可以让人听得毫无兴致,昏昏欲睡,但是在这个演讲的舞台上,你却是一个明星!同时你还承担着让 ...

最新文章

  1. 字符串的最大相似匹配
  2. 北京站售票员内部大量出票无耻的售票员(转)
  3. setTimeout和setInterval方法
  4. stl-map/set
  5. html首字母样式,html标签手册
  6. 鼠标右击 左击 等总结
  7. flask找不到css_Flask干货:访问数据库——Flask-SQLAlchemy初始化
  8. VSCode从下载到配置Ubuntu系统
  9. 如何开发rest接口服务_如何简化网络请求接口开发
  10. 荣获2009年“微软最有影响力开发者”称号
  11. html展开折叠菜单,纯CSS竖向滑动展开折叠菜单
  12. Unity 使用谷歌内购的密钥( license key )
  13. 企业官方微博的视觉设计与营销策略分析
  14. Visual Studio Code下c语言环境的安装与运行
  15. 四川铺管家:拼多多产品布局怎么做
  16. A,B,C类的IP地址详细介绍
  17. 阿里云oss文件上传(简单上传、服务端签名后直传)
  18. Froyo 自动编译方法
  19. 管理无人工厂属于计算机在,无人工厂-生产管理- 人大经济论坛-经管百科
  20. Python(IT峰)笔记05-数据类型详解:字符串、转义字符,字符串操作,字符串格式化,英文字符,字符串查找,字符串操作

热门文章

  1. asp之ajax技术:responstext中文乱码
  2. Intellij IDEA 社区版集成 Database Navigator 数据库管理工具
  3. DataGrip汉化方法
  4. Swift4.0 从相册中获取图片和拍照
  5. Android udp json+数组 ---gt;bytes发送数据
  6. Mac OS修改VSCode Go的默认缩进格式
  7. C语言 字符串大小写转换
  8. 【Java】统计字符串中每个字符出现的次数
  9. 输入一个三位正整数,输出百位数,十位数,个位数
  10. Upload-Labs(11-15)