卖坚果的怪叔叔 卖坚果的怪叔叔
  • 首页
  • 生活
  • 技术
  • 记录
  • 工具箱
  • 关于我
首页 › 技术 › Vue改变数组值,页面视图为何不刷新?

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

坚果大叔
2020-02-10 17:35:22技术阅读 3,227

Vue改变数组值,页面视图为何不刷新?-卖坚果的怪叔叔

将其对应的type设为 index 即可

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

场景: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)
}

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 })  // 深拷贝
对象
赞赏 赞(0)
本文系作者 @坚果大叔 原创发布在 卖坚果的怪叔叔。未经许可,禁止转载。
永远的曼巴
上一篇
常见的CSS文字居中显示
下一篇
在小程序中查看

这是个😊,挣点服务器费用😜

热门文章
西安!
QQ,你有多久没有打开啦!
JQ获取图片的实际尺寸
Python获取好友地区分布及好友性别分布
TrollStore 2 已发布,附超详细安装教程~
失业在家,我给小朋友做了一个练字小程序!
专题标签
agent (1) CSS (15) dom (1) Es6入门系列 (14) Git (3) html (1) iview (1) JavaScript (9) js (4) Lif (1) Node (4) pyecharts (1) Python (10) ref (1) scriptable (1) Skill (1) vsCode (1) vue (4) wordpress (2) 三月 (1) 上海 (1) 假期 (1) 其他分享 (3) 前端两三问 (15) 古镇 (1) 外滩 (1) 对象 (1) 小程序 (5) 年度总结 (6) 年终总结 (1) 微信机器人 (4) 打字机 (1) 技术 (1) 日常问题 (8) 日常问题记录 (1) 春天 (2) 服务器 (2) 海族馆 (1) 生活 (8) 网上国网 (1) 记录 (3) 通勤 (1) 重学JavaScript (11) 面试题 (10) 🌸 (1)
什么是Agent?
2026-08-15 23:49:12
405 0 2
什么是 Skill?
2026-08-12 21:32:42
322 1 0
失业在家,我给小朋友做了一个练字小程序!
2026-08-07 16:21:52
601 10 1
上线8年,15万用户的小程序,一共赚了多少钱?
2026-05-30 18:01:24
4,651 4 0
  • 0
博主

一位佛系的前端开发者,略通摄影,乐于尝试新事物,热衷于美食。

友链
故事胶片
公众号
坚果大叔 执行上下文 卖坚果的怪叔叔 Dacking
Copyright © 2017-2026 卖坚果的怪叔叔

开往-友链接力

萌ICP备20230818号

苏ICP备18048410号-3
  • 首页
  • 生活
  • 技术
  • 记录
  • 工具箱
  • 关于我
# CSS # # JavaScript # # vue # # 微信 # # 生活 #
坚果大叔
345
文章
171
评论
432
喜欢