前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Vue改变数组值,页面视图为何不刷新?

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

作者头像
执行上下文
发布于 2022-07-26 06:47:09
发布于 2022-07-26 06:47:09
1.7K00
代码可运行
举报
文章被收录于专栏:执行上下文执行上下文
运行总次数:0
代码可运行

1、iview table 自定义序号

WX201912191855372x.png

将其对应的type设为 index 即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    title: "序号",
    width: 70,
    align: "left",
    type: "index"
}

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

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

父组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 引入组件
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 为子组件传递过来的值
},

子组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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使单向数据流不能直接改版传递子组件的值。改成如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 在子组件中用watch来监听 isShowAdd 是否变化,
然后赋值给 currentValue
watch: {
  isShowAdd(value,val) {
    this.currentValue = value
  }
}
// 子组件的关闭操作提升到父组件 $emit
cancel(type){
    this.$emit('on-close', false, type)
}

3、网上的资料如下图:

总结:

这个问题还折腾了快半个小时,归根到底还是不经常使用的后果,好多代码之前都用过,像封装组件这种还要折腾,简直是不知道说什么好呀,只能以后多使用了。

4、Vue改变数据视图不更新

4.1 异步更新队列
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vue 异步执行 DOM 更新。只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。

如果同一个 watcher 被多次触发,只会被推入到队列中一次。

这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作上非常重要。

然后,在下一个的事件循环“tick”中,

Vue 刷新队列并执行实际 (已去重的) 工作。

Vue 在内部尝试对异步队列使用原生的 Promise.then 和 MessageChannel,如果执行环境不支持,会采用 setTimeout(fn, 0) 代替。

解决方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.$nextTick()
4.2 数组改变视图不更新

通过以下数组方法可以让vue监测数组改动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
push()

pop()

shift()

unshift()

splice()

sort()

reverse()
4.3 vue不能检测到对象属性的添加或删除

由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的

解决方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1、Vue.set(object, key, value)

2、Object.assign() 或 _.extend() 方法来添加属性。

但是第二种方法,添加到对象上的新属性不会触发更新。在这种情况下可以创建一个新的对象,让它包含原对象的属性和新的属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`

this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })  // 深拷贝
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 执行上下文 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue基础:响应式
Vue不是框架(前端框架往往需要解决路由、试图管理、数据持久化等流程),Vue只关注视图层。
奋飛
2019/08/15
1.1K0
vueweb端响应式布局_vue响应式原理图文详解「建议收藏」
Vue最显著的特性之一便是不太引人注意的响应式系统(reactivity system)。模型层(model)只是普通JS对象,修改它则更新视图(view)。这会让状态管理变得非常简单且直观,不过理解它的工作原理以避免一些常见的问题也是很重要的。
全栈程序员站长
2022/09/02
1.6K0
Vue.js-深入响应式原理
hello,各位宝宝,最近还好吗?最近生活平静吗?还是有惊喜?不管怎样,心态要平和。不管谁来,不管谁走,都是命运的安排~
用户3258338
2019/07/19
1.5K0
Vue.js-深入响应式原理
[Vue] v-model 绑定对象不实时更新
在最近参与的一个项目中,前端用到了 vue.js 框架,期间有个功能需要动态的向一个被绑定的对象中添加属性。但是在实际应用中问题出现了:在向对象中添加属性后,与对象绑定的组件内容却未发生变化,必须要再次刷新组件,其内容才会变为更改后的内容
做棵大树
2022/09/27
2.4K0
[Vue] v-model 绑定对象不实时更新
前端面试题Vue答案
1.vue的原理? image.png 关键词: 虚拟DOM树+访问器属性 解释一下:响应式原理? 当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历
酷走天涯
2021/03/04
2.4K0
腾讯二面vue面试题总结
对象内部通过 defineReactive 方法,使用 Object.defineProperty 来劫持各个属性的 setter、getter(只会劫持已经存在的属性),数组则是通过重写数组7个方法来实现。当页面使用对应属性时,每个属性都拥有自己的 dep 属性,存放他所依赖的 watcher(依赖收集),当属性变化后会通知自己对应的 watcher 去更新(派发更新)
bb_xiaxia1998
2022/11/18
7320
19道高频vue面试题解答(上)
子组件不可以直接改变父组件的数据。这样做主要是为了维护父子组件的单向数据流。每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。如果这样做了,Vue 会在浏览器的控制台中发出警告。
bb_xiaxia1998
2022/10/10
1.2K0
Vue基础:条件渲染、列表渲染、事件处理
那么在上面的代码中切换 loginType 将不会清除用户已经输入的内容。因为两个模板使用了相同的元素,<input> 不会被替换掉——仅仅是替换了它的 placeholder。
奋飛
2019/08/15
1.9K0
vue 中 $set与$delete的使用
Vue无法检测property的添加或移除,由于Vue会在初始化实例时对property执行getter/setter转换,所以propterty必须在data对象上存在才能让Vue将它转换为响应式的。例如
tianyawhl
2020/06/22
1.1K0
面试官:Vue中给对象添加新属性界面不刷新?
然后给botton标签绑定点击事件,我们预期点击按钮时,数据新增一个属性,界面也新增一行
@超人
2021/02/26
2.8K0
面试官:Vue中给对象添加新属性界面不刷新?
Vue的数据响应式原理
“响应式”,是指当数据改变后,Vue 会通知到使用该数据的代码。例如,视图渲染中使用了数据,数据改变后,视图也会自动更新。
刘亦枫
2020/03/19
8150
vue组件引用传值的最佳实践
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。
奋飛
2020/05/28
1.8K0
Vue.js-自定义事件例子 原
一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。model 选项可以用来避免这样的冲突:
tianyawhl
2019/04/04
1.7K0
8种vue组件通信方式详细解析实例
对于vue来说,组件是非常常见的,有很多平台都封装了了属于自己一套的组件,如element ui、we ui等等。同时组件之间的消息传递也是非常重要的,下面是我对组件之间消息传递的各种方式的总结,共有8种方式。如有不足之处,可以留言补充,互相学习。
Javanx
2019/09/04
7670
8种vue组件通信方式详细解析实例
Vue自定义组件如何使用v-model
我们在使用vue的时候如果想实现双向数据绑定,就会使用v-model,代码如下:
挥刀北上
2019/07/19
3.3K0
用vue实现模态框组件
基本上每个项目都需要用到模态框组件,由于在最近的项目中,alert组件和confirm是两套完全不一样的设计,所以我将他们分成了两个组件,本文主要讨论的是confirm组件的实现。 组件结构 <tem
对角另一面
2017/12/27
3.6K0
2023前端二面高频vue面试题集锦1
可以看到,组件内部只有一个动态节点,剩余一堆都是静态节点,所以这里很多 diff 和遍历其实都是不需要的,造成性能浪费
bb_xiaxia1998
2023/01/02
1.2K0
vue中的v-model刨根问底
关于v-model用过vue的应该都知道,用着那是相当的丝滑,但很多人可能并没有深究过其原理,而且随着vue版本的更新,也有些新的用法被大家遗漏,所以就有了这一篇对v-model的刨根问底。
人人都是码农
2023/11/16
3080
vue通信、传值的多种方式(详细)
朋友们可以百度下 Session Storage(程序退出销毁) 和 Local Storage(长期保存) 的区别。
全栈程序员站长
2022/06/28
9870
vue通信、传值的多种方式(详细)
Vue.js 父组件向子组件传值和子组件向父组件传值
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134784.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/18
5.5K0
Vue.js 父组件向子组件传值和子组件向父组件传值
相关推荐
Vue基础:响应式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文