Vue前台PC项目其三
大约 4 分钟
优化相关
swiper相关
swiper轮播图影响多个页面
- 通过选择器可以指定哪个地方需要,但是不好
- 通过ref最好
swiper创建的时间应该是在页面列表创建之后才会有效果
静态页面是没问题的
静态页面不需要等待数据,因此monted完全可以去创建swiper
现在我们的数据是动态的,monted内部去创建,数据还没更新到界面上,因此无效
可以使用延迟定时器去创建 但是不好
使用watch + nextTick 去解决比较好
Vue.nextTick 和 vm.$nextTick 效果一样
nextTick是在最近的一次更新dom之后会立即调用传入nextTick的回调函数
/* 在列表数据已经有了,且已经更新显示了 数据变化后 ==> 同步调用监视的回调 => 最后异步更新界面 watch:监视bannerList,就可以知到有数据了 nextTick:界面更新后执行回调 */ watch:{ bannerList(){ //此时只是数据有了, 但界面还没用更新 // swiper对象必须在列表显示之后穿件才有效果 /* Vue.$nextTick(callback) 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 */ this.$nextTick(() => { //在此次数据变化导致界面更新完成后执行回调 // DOM 更新了 new Swiper (this.$refs.swiper, { // direction: 'horizontal', // 垂直切换选项 loop: true, // 循环模式选项 autoplay:{ //自动轮播 delay:4000, disableOnInteraction:false //用户操作后是佛停止自动播放 }, // 如果需要分页器 pagination: { el: '.swiper-pagination', }, // 如果需要前进后退按钮 navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev', }, }) }) }
Floor当中的轮播没效果?
- 它是根据数据循环创建组件对象的,外部的floor创建的时候
- 所以数据肯定是已经获取到了,所以我们在mounted内部去创建swiper
定义可复用的轮播组件
- banner是在watch当中去创建swiper 因为组件创建的时候数据不一定更新
- floor是在mounted当中去创建swiper,因为内部组件创建的时候,数据已经存在了
Search优化
根据分类和关键字进行搜索,解决在search组件内部再进行搜索的bug
//真正到了搜索页面我们都要去解析拿到相关的参数 修改我们的搜索参数
//beforeMount 去同步更新data数据
//mounted 去异步发送请求
//在搜索页重新输入关键字或者点击类别不会再发送请求,因为mounted只会执行一次,需要监视路由变化
动态显示和删除选中的搜索条件发送请求
- 判断参数内部是否存在categoryName 存在就显示
- 判断参数内部是否存在keyword 存在就显示
- 点击事件,如果删除就把参数对应的数据清除,顺便发送新的请求
解决删除选中的搜索条件后路径不变的bug
- 上面删除发送请求我们的请求路径还是不变
- 我们需要手动去push跳转到去除对应参数的新路由
// 在 Search组件 中的 removeCategory()和 removeKeyword()方法中添加
// this.$router.push({ //有历史记录
this.$router.replace({ // 无历史记录
name:'search',
// params:this.$route.params,
query:this.$route.query
})
响应式对象数据属性的添加和删除
对象当中的属性数据更改会导致页面更改,响应式数据
添加:
错的:如果对象当中没有对应的属性数据: 直接添加一个属性,这个属性不是响应式的
因为vue只是在开始对对象当中的所有属性添加getter和setter,后期直接添加的没有
对的:我们需要使用Vue.set this.$set方法 这样的添加属性就是响应式的 必须对响应式对象添加属性
删除:
错的: 直接delete删除对象当中的属性,不会导致页面更改
因为响应式属性只是在检测属性值的改变而不是检测属性的删除
对的:我们需要使用Vue.delete this.$delete方法 除了删除,还添加了更新界面的操作