Vue改变数组值,页面视图为何不刷新?
1、iview table 自定义序号
将其对应的type设为 index 即可
{title: "序号",width: 70,align: "left",type: "index"
}
复制代码 2、父子组件传值,父组件调用子组件方法
场景:iview 中 封装一个modal 组件公共引用
父组件:
// 引入组件
import orderModal from './orderModal.vue'
// 使用
"showPop" // 控制组件的显示关闭:orderData="orderData" // 数据:orderH1="orderH1":btnText="btnText"@on-close="hidePop"> // 将子组件的方法传递给父组件使用
// 父组件方法
hidePop(e,type){if(type !== undefined){// 方法}this.showPop = e // 关闭弹窗 e 为子组件传递过来的值
},
复制代码 子组件
"currentValue" // 子组件中接受父组件的 isShowAdd@on-cancel="cancel"> // Modal 的关闭事件
// 子组件 props接受传递参数
props: ['showPop','orderData','orderH1','btnText'],
复制代码 这里原本 ==v-model== 使用的使传递过来的 ==showPop== 作为参数,一开始没有问题,但是如果我想将子组件的关闭方法提到父组件去触发 那么 直接在 父组件 ==this.showPop = false==。那么就会提示报错,因为 Vue使单向数据流不能直接改版传递子组件的值。改成如下:
// 在子组件中用watch来监听 isShowAdd 是否变化,
然后赋值给 currentValue
watch: {isShowAdd(value,val) {this.currentValue = value}
}
// 子组件的关闭操作提升到父组件 $emit
cancel(type){this.$emit('on-close', false, type)
}复制代码 3、网上的资料如下图:
总结:
这个问题还折腾了快半个小时,归根到底还是不经常使用的后果,好多代码之前都用过,像封装组件这种还要折腾,简直是不知道说什么好呀,只能以后多使用了。
4、Vue改变数据视图不更新
4.1 异步更新队列
Vue 异步执行 DOM 更新。只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作上非常重要。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部尝试对异步队列使用原生的 Promise.then 和 MessageChannel,如果执行环境不支持,会采用 setTimeout(fn, 0) 代替。
复制代码 解决方法
this.$nextTick()
复制代码 4.2 数组改变视图不更新
通过以下数组方法可以让vue监测数组改动
push()pop()shift()unshift()splice()sort()reverse()
复制代码 4.3 vue不能检测到对象属性的添加或删除
由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的
解决方法
1、Vue.set(object, key, value)2、Object.assign() 或 _.extend() 方法来添加属性。
复制代码 但是第二种方法,添加到对象上的新属性不会触发更新。在这种情况下可以创建一个新的对象,让它包含原对象的属性和新的属性:
// 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 }) // 深拷贝复制代码
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
