Vue改变数组值,页面视图为何不刷新?

简介: Vue改变数组值,页面视图为何不刷新?

1、iview table 自定义序号

image.png

将其对应的type设为 index 即可

{
title: "序号",
width: 70,
align: "left",
type: "index"
}

2、父子组件传值,父组件调用子组件方法

场景:iview 中 封装一个modal 组件公共引用

父组件:

// 引入组件
import orderModal from './orderModal.vue'
// 使用
<order-modal 
  :showPop="showPop"    // 控制组件的显示关闭
  :orderData="orderData"      // 数据
  :orderH1="orderH1"
  :btnText="btnText"
  @on-close="hidePop">    // 将子组件的方法传递给父组件使用
</order-modal>
// 父组件方法
hidePop(e,type){
if(type !== undefined){
// 方法
    }
this.showPop = e  // 关闭弹窗 e 为子组件传递过来的值
},

子组件

<Modal 
    v-model="currentValue"  // 子组件中接受父组件的 isShowAdd
    @on-cancel="cancel">    // Modal 的关闭事件
    <Form   
ref="orderData"
        :model="orderData">  // 接受传递的数据
    </Form>
</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 })  // 深拷贝
相关文章
|
17天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
3天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
3天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
3天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
3天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
2天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
4天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
2天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
4天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
9天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发