vue.set(this.$set)的正确用法
2019-01-27 12:04
363 查看
vue.set的用法
项目前沿
在做移动端项目的时候,往往有这样一个需求。头部有多个type切换,对应不同的内容,在以往面向web开发的时候我们往往采用的是点击哪个type传对应的值请求哪个的内容,这样的话每次点击就会产生一次请求,对于用户体验来说是不怎么友好的,在移动webapp的时代,我们完全可以做成原生应用的切换效果。
需求分析
既然这样,那么我们就需要创建多个变量来做一些滑动的效果,之前我是想直接这样写的,如下:
//头部分类请求 async getcategoryList(){ this.categoryList = await this.$http.post('/pdd/opt_list',{},this.showLoading) this.categoryList.forEach((e,i)=>{ //创建需要滑动的多个变量 this.dataObj[i] = [] })
此时虽然已经创建了对应的多个变量,但是不会触发视图更新,原因在于javasecipt 的限制,Vue.js 不能检测到对象属性的添加或删除。因为 Vue.js 在初始化实例时将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的 正确的写法应该是:
//头部分类请求 async getcategoryList(){ this.categoryList = await this.$http.post('/pdd/opt_list',{},this.showLoading) this.categoryList.forEach((e,i)=>{ //创建需要滑动的多个变量 this.$set(this.dataObj, `${i}`, []) })
解决方案
这样的话,我们现在就有了对应的头部type的多个content,当我们每次点击的时候只需要改变dataObj的下标就可以了,当我们对应的dataObj[i]有数据我们就不进行接口请求代码如下:
async ontypeClick(i){ //记录点击的当前type下标 if(this.dataObj[i].length == 0){ //如果没有数据进行接口请求 await this.getPindata(this.pages[i],this.id,this.tabListIndex,true,true) //传入对应的下标的page, }
getPindata方法代码如下
async getPindata(page,id,i,kry,showLoading){ let postUrl if(this._isSearch){ postUrl = '/pdd/good_search' }else{ postUrl = '/pdd/query_good_by_opt' } let sendData = { opt_id:id, sort_mode:this.sort_mode, sort_type:this.sort_type, pagesize:this.pagesize, pageno:page, keyword:this.keyword let data = await this.$http.post(postUrl,sendData,showLoading) if(kry){ //下拉刷新 if(this._isSearch){ //搜索的格式 this.dataObj[i] = data.goods_list }else{ this.dataObj[i] = data } }else{ //上拉加载 if(this._isSearch){ this.$set(this.dataObj, i, this.dataObj[i].concat(data.goods_list)) }else{ this.$set(this.dataObj, i, this.dataObj[i].concat(data)) //进行赋值操作 } console.log(this.dataObj) } },
type切换完成的页面
代码分析
上面的代码主要是介绍数据的一些操作,我们可以将每次请求的数据放在一个对象之中,在循环我们操作完成的对象,这样相对来说会减少一些不必要的请求,其实还可以优化的更好,我们可以在刚进入此页面的时候进行Promise.all 进行所有数据的拉取,点击type的时候只需要做左滑右滑的操作就ok拉,下面是一些动画的代码,这边就不解释了,我用的是weex官方的animation,所有没什么可说的。
//动画代码如下 animation.transition( this.$refs['sowTransform'], { styles: { transform: `translateY(${this.transformStyle}px)` }, duration: 300, //ms timingFunction: "ease", needLayout: false, delay: 0 //ms }, );
附
该博客仅为记录开发中一些遇到的问题及解决方案,后续还会继续更新维护。
相关文章推荐
- Vue 报错TypeError: this.$set is not a function 的解决方法
- vue.js的computed,filter,get,set的用法及区别
- SetForegroundWindow的正确用法
- 用java实现结婚、离婚小程序,其中有一些判断条件,正确掌握this关键字的用法
- 从vue源码看Vue.set()和this.$set()
- 将指定窗口设为顶层窗口SetForegroundWindow的正确用法
- Vue作为组件在前端项目中的应用&Vue.set 的用法
- vue.js的computed,filter,get,set的用法及区别详解
- Vue.set() this.$set()引发的视图更新思考及注意事项
- Vue.set()用法案例
- SetForegroundWindow的正确用法
- SetForegroundWindow的正确用法
- SetForegroundWindow的正确用法2
- Vue.set() this.$set()引发的视图更新思考
- vue计算属性get和set用法示例
- SetForegroundWindow的正确用法
- vue.js的computed,filter,get,set的用法及区别
- 一个小Demo掌握Vue.set(给对象新增属性)用法
- 改善C#程序的建议2:C#中dynamic的正确用法
- SQL语句详解 MySQL update的正确用法