Vuex
在进入项目之前先学习一下Vuex。
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。这是官网的解释。个人理解为在data中的属性需要共享给其他vue组件使用的部分叫做状态。简单的说就是data中需要共用的属性。
vuex有几个核心概念,下面是我对它们的理解,简而言之:
- state:也就是共享的数据
- mutation:对数据进行修改操作,也就是修改state(Mutation除了接收
state 作为第一个参数外,还可以接收其他的参数)。 - getters:取数据
- action:对取出的数据做处理
这里不过多的解释,感兴趣的同学可以去网上搜一些相关文章!
使用vuex
1、安装vuex
|
|
2、新建一个store文件夹,并在文件夹下新建index.js文件,文件中引入vue和vuex。
|
|
3、使用vuex
|
|
同时创建state.js、mutation-type.js、mutations.js、getters.js、actions.js这几个文件,引入到index文件中,实例化vuex时加入这几个对象
|
|
4、在main.js 中引入新建的vuex文件,在实例化 Vue对象时加入 store 对象
|
|
food页面
点击foodType(例如:点击美食)进入相应的food页面。如图操作:
页面跳转
修改msite页面foodType的router-link配置。
msite.vue
|
|
设置跳转带的参数geohash
、title
、restaurant_category_id
。点击图标后进入food页面。
food页面
food页面分为三个部分:对应头部名称、选项排序、餐厅列表。
头部名称
首先设置它的头部名称,我们可以直接根据router-link配置中的查询参数获取相应参数。代码如下:
food.vue
|
|
选项排序
选项排序又分为三部分:分类、排序、筛选。
|
|
:class
表示被绑定的DOM 将与数据保持同步,每当数据有改动,相应的DOM视图也会更新。也就是说当choose_type发生改变时sortBy
会更新对应的数据。sortBy
表示为筛选条件。
分类
想要展示分类下的内容,需要添加个点击事件chooseType()
|
|
当点击顶部三个选项展示不同的列表,选中当前选项进行展示同时收回其他选项
|
|
截图:
获取展开headTitle左侧的食品分类
点击headTitle后变成分类。通过使用axios请求获取分类数据。同理,先在webpack.dev.conf.js文件中添加后台数据。
webpack.dev.conf.js
|
|
接着设置访问参数
food.js
|
|
请求中需要得到latitude
和longitude
的值,想要得到这两个参数值先要获取当前地址,使用vuex管理特性对这两个参数进行状态记录和设置。
state.js
|
|
mutation-types.js
|
|
mutations.js
|
|
getters.js
|
|
在food.vue组件中引入getFoodCategory()
和vuex管理特性。data中定义category表示分类左侧数据。
|
|
dom渲染:
|
|
遍历category
,填充每个item需要的相应数据。绑定当前点击的category
,表示为:class="{category_active:restaurant_category_id == item.id}"
得到category数据,dom渲染运行如图:
获取category右侧的数据
获取每个category所对应的数据,data中定义属性categoryDetail表示分类右侧的数据
|
|
在dom中渲染。当点击category左侧列表的某个选项时,右侧渲染相应的sub_categories列表,创建selectCategoryName(item.id, index)
点击事件获取右侧数据。
|
|
遍历categoryDetail
,填充每个detailItem
需要的相应数据。绑定当前点击的categoryDetail
,表示为:class="{category_right_choosed: restaurant_category_ids == detailItem.id || (!restaurant_category_ids)&&index == 0}"
。
页面渲染如图:
左侧数据为category,右侧则是categoryDetail。渲染成功!
获取当前餐厅列表
在msite.vue组件中,设置router-link时query参数需要带restaurant_category_id
,这是就需要在shop-list.vue组件props中添加restaurantCategoryId
属性。
shop-list.vue
|
|
继续回到msite.vue组件中,对restaurant_category_id
的值做些处理。
|
|
getCategoryId(url)
作用是解码url地址,求restaurant_category_id
值。首先对传入的url进行拆分处理,通过正则表达式去匹配,看有没有和urlData相同的字符串,如果匹配成功返回restaurant_category_id
的值,如果匹配失败则返回空。
前面我们已经写了个餐厅列表shop-list.vue基础组件,直接拿来使用就可以了。
|
|
webpack.dev.conf.js文件中添加后台数据。
|
|
food.js文件设置请求参数
|
|
food.vue中引入getFoodRestaurants()
,获取商铺列表数据。
|
|
通过路由里面传递的参数获取restaurant_category_id
。
页面渲染如图: