Vue2.5开发去哪儿网App 城市列表开发之 Vuex实现数据共享及高级使用
程序员文章站
2022-03-20 19:23:24
一,数据共享 1. 安装: 2. 在src目录下 新建state文件夹,新建index.js文件 3. 创建一个 store 4.main.js中创建根实例时,传入store 5.然后子组件使用: 二,数据的修改 1. 给每个城市绑定一个方法: 2. 在Index.js中: 效果: 3. 简化步骤 ......
一,数据共享
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>
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 })
项目地址:
上一篇: easyui 前端实现分页 复制就能用
下一篇: 打造一个健壮高效的网络爬虫