Vue2.5开发去哪儿网App 城市列表开发之 Vuex实现数据共享及高级使用
一,数据共享
1. 安装:
npm install vuex --save
2. 在src目录下 新建state文件夹,新建index.js文件
3. 创建一个 store
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex)
export default new Vuex.Store({
state: {
city: '上海'
}
})
4.main.js中创建根实例时,传入store
import store from './store'
......
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
})
......
5.然后子组件使用:
//获取城市名
{{this.$store.state.city}}
二,数据的修改

1. 给每个城市绑定一个方法:
@click="HandleCity(城市名)"
HandleCity (value) {
// 派发一个citychange city的 action
this.$store.dispatch('citychanged',value)
}
2. 在Index.js中:
actions: {
//ctx上下文
citychanged (ctx, cityname) {
ctx.commit('citychanged', cityname)
}
}
mutations: {
//改变数据
citychanged (state, city) {
state.city = city
}
}
效果:

3. 简化步骤
HandleCity (value) {
this.$store.commit('citychanged', value)
}
index.js中 省略actions:
mutations: {
citychanged (state, city) {
state.city = city
}
}
搜索Seatch组件步骤一致
三,使用localstorage存储当前城市,并返回到城市
每次刷新后,城市默认
localStorage - 用于长久保存整个网站的数据,保存的数据没有过期时间,直到手动去除。
let defaultCity = '北京'
try {
//判断浏览器是否支持
if (localStorage.city) {
defaultCity = localStorage.city
}
} catch (e) {}
//点击后页面跳转
this.$router.push('/')
在 Vue 实例内部,你可以通过 $router 访问路由实例。因此你可以调用 this.$router.push

四,vuex高级使用
mapState:
import { mapState, mapMutations } from 'vuex'
mapState指将state数据映射到city的计算属性中
computed: mapState({
current_city: 'city'
})
// html写法:
// {{this.current_city}}
mapMutations : 你可以在组件中使用this.$store.commit('xxx')提交 mutation,或者使用mapMutations辅助函数将组件中的 methods 映射为store.commit调用
HandleCity (value) {
this.citychanged(value)
this.$router.push('/')
},
...mapMutations([
'citychanged'
])
mapgetter函数:
mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性:
import { mapGetters } from 'vuex'
export default {
// ...
computed: {
// 使用对象展开运算符将 getter 混入 computed 对象中
...mapGetters([
'doneTodosCount',
'anotherGetter',
// ...
])
}
}
如果你想将一个 getter 属性另取一个名字,使用对象形式:
mapGetters({
// 把 `this.doneCount` 映射为 `this.$store.getters.doneTodosCount`
doneCount: 'doneTodosCount'
})
<template>
<div class="list" ref="wrapper">
<div>
<div class="area">
<div class="title border-topbottom">当前城市</div>
<div class="button-list">
<div class="button-wrapper">
<div class="button" ref="mycity">{{this.current_city}}</div>
</div>
</div>
</div>
<div class="area">
<div class="title border-topbottom">热门城市</div>
<div class="button-list">
<div class="button-wrapper" v-for="city in hotcities" :key="city.id">
<div class="button" @click="HandleCity(city.name)">{{city.name}}</div>
</div>
</div>
</div>
<div class="area" v-for="(city,key) in cities" :key="key" :ref="key">
<div class="title border-topbottom">{{key}}</div>
<div class="item-list">
<div class="item border-bottom" v-for="c in city" :key="c.id" @click="HandleCity(c.name)">{{c.name}}</div>
</div>
</div>
</div>
</div>
</template> <script>
import BScroll from 'better-scroll'
import { mapState, mapMutations } from 'vuex'
export default {
name: 'CityList',
mounted: function () {
this.scroll = new BScroll(this.$refs.wrapper)
},
props: ['cities', 'hotcities', 'letter'],
methods: {
HandleCity (value) {
// this.$store.commit('citychanged', value)
this.citychanged(value)
this.$router.push('/')
},
...mapMutations([
'citychanged'
])
},
watch: {
letter () {
if (this.letter) {
const element = this.$refs[this.letter][0]
this.scroll.scrollToElement(element)
}
}
},
computed: mapState({
current_city: 'city'
})
}
</script>
<style lang="stylus" scoped>
@import "~styles/varibles.styl"
.border-topbottom
&:before
border-color #ccc
&:after
border-color #ccc
.border-bottom
&:before
border-color #ccc
.list
overflow hidden
position absolute
top 1.58rem
right 0
bottom 0
left 0
.title
line-height .54rem
padding-left .2rem
background #eee
color #666
font-size .26rem
.button-list
padding .1rem .6rem .1rem .1rem
overflow hidden
.button-wrapper
float left
padding .1rem
.button
text-align center
margin .1rem
border .02rem solid #ccc
border-radius .06rem
padding .1rem .5rem
.item-list
.item
line-height .76rem
padding-left .2rem
</style>
List.vue
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,
// 省略步骤
// 1. this.$store.dispatch('citychanged', value)
// 2. actions: {
// citychanged (ctx, cityname) {
// ctx.commit('citychanged', cityname)
// }
// },
mutations: mutations
})
/src/store/index.js
五,keep-alive优化网页性能
解决每次进入页面都发送ajax请求的问题
1. keep-alive是Vue提供的一个抽象组件,用来对组件进行缓存,从而节省性能
<template>
<div id="app">
<!--#显示当前路由对应的内容-->
<keep-alive>
<router-view/>
</keep-alive>
</div>
</template>
2. 当组件在keep-alive内被切换时组件的activated、deactivated这两个生命周期钩子函数会被执行
添加LastCity 属性
mounted () {
this.getHomeInfo()
this.LastCity = this.city
}
activated () {
// 当页面加载时,进行判断,城市发生了改变
if (this.LastCity !== this.city) {
this.getHomeInfo()
// 更新上一城市
this.LastCity = this.city
}
},
项目地址:
https://github.com/1417766861/Vue2.5-App
Vue2.5开发去哪儿网App 城市列表开发之 Vuex实现数据共享及高级使用的更多相关文章
- Vue2.5开发去哪儿网App 城市列表开发之 兄弟组件间联动及列表性能优化
一, 兄弟组件间联动 1. 点击城市字母,左侧对应显示 给遍历的 字母 添加一个点击事件: Alphabet.vue @click="handleLetterClick" ha ...
- Vue2.5开发去哪儿网App 城市列表开发
一,城市选择页面路由配置 ...
- Vue2.5 开发去哪儿网App
Vue2.5开发去哪儿网App 技术栈和主要框架
- Vue2.5开发去哪儿网App 从零基础入门到实战项目
第1章 课程介绍本章主要介绍课程的知识大纲,学习前提,讲授方式及预期收获. 1-1 课程简介 试看第2章 Vue 起步本章将快速讲解部分 Vue 基础语法,通过 TodoList 功能的编写,在熟悉基 ...
- Vue2.5开发去哪儿网App 搜索功能完成
效果展示: Search.vue: <div class="search-content" ref="search" v-show="keywo ...
- Vue2.5开发去哪儿网App 首页开发
主页划 5 个组件,即 header icon swiper recommend weekend 一. header区域开发 1. 安装 stylus npm install stylus --s ...
- Vue2.5开发去哪儿网App 第五章笔记 上
1.css动画原理 .fade-enter{ opacity: 0; } .fade-enter-active{ transition: opacity 2s; } .fade-leave-to{ o ...
- Vue2.5开发去哪儿网App 第五章笔记 下
1. 多个元素或组件的过渡 多个元素的过渡: <style> .v-enter,.v-leace-to{ opacity: 0; } .v-enter-active,.v-leave-ac ...
- Vue2.5开发去哪儿网App 第四章笔记 下
1.解决非父子组件之间的传值问题 非父子组件传值(Bus/总线/发布订阅模式/观察者模式) 给 Vue类上挂在一个属性,然后创建vue实例时,实例就拥有了这个属性 Vue.prototype.bus ...
随机推荐
- 2018.10.26 poj3421X-factor Chains(数论+排列组合)
传送门 排列组合入门题. 令X=p1a1p2a2..pkakX=p_1^{a_1}p_2^{a_2}..p_k^{a_k}X=p1a1p2a2..pkak 那么答案1就等于∑i=1kai\ ...
- Java 学习之集合类(Collections)
Collection(集合类) 我们是使用数组来保存数据,但是他的长度一旦创建,就已经确定了,当我们要动态传入穿值,数组就有些局限了,集合类就孕育而生:所谓集合,就是来保存,盛装数据,也可称为容器类: ...
- android检测手机是否安装某个app
public static boolean isAvilible(Context context, String packageName){ //获取packagemanager final Pack ...
- TCP/IP协议(7):应用层
应用层上协议有DNS.DHCP.HTTP.SSL/TLS.FTP.Telnet等. 1.DNS域名解析 DNS服务器用来解析域名从而获得对应IP地址,我们在对网络进行设置的时候如果DNS服务器没有设置 ...
- 第08章:MongoDB-CRUD操作--文档--删除
①语法 remove() [2.6以后方法过时] deleteOne() [2.6以后官方推荐] deleteMany() [2.6以后官方推荐] db.collection.remove( < ...
- UVa 1610 Party Games(思维)
题意: 给出一系列字符串,构造出一个最短字符串(可以不在集合中)大于等于其中的一半,小于另一半. 析:首先找出中间的两个字符串,然后暴力找出最短的字符串,满足题意. 代码如下: #include &l ...
- Element类型
除了document,element类型也算是最常用的类型 Element节点有以下特征: nodeType 值为1 nodeName 元素的标签名 nodeValue 值为null parentNo ...
- Angularjs的directive封装ztree
一般我们做web开发都会用到树,恰好ztree为我们提供了多种风格的树插件. 接下来就看看怎么用Angularjs的directive封装ztree <!DOCTYPE html> < ...
- js基础学习笔记(二)
2.1 输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用“”括起,直接输出&q ...
- 判断页面是app打开还是浏览器打开。cookie
有个需求需要对页面判断不同的打开方式来最里面的链接进行不同调整, 这样就要分四种情况,app,浏览器X安卓系统,苹果系统,起初是对页面url地址带有的参数(安卓)跟用户代理(苹果)返回值判断navig ...