vue js动态赋值后视图层(HTML)或者组件没有重新渲染

vue js动态赋值后视图层(HTML)或者组件没有重新渲染

v-for更新数据不重新渲染页面

前言

这个问题其实主要是要有一种解决问题的思路,通常做开发工作的都要有一种自己的思路,下面我会说一下我的解决方法。

一、查找问题

首先碰到这种问题你要知道是哪里出错了,下面为一些可能导致这个问题的原因:

1.数据渲染步骤问题

这个问题通常出现在页面刚进入的时候,大家知道vue有一个生命周期,通常我们页面初始化的数据都会在mounted(挂载后)调用,当然也会有一些在created(创建后)调用,这个没有什么对错,在mounted里面调用会对html和css的加载速度起到一定的帮助,但是也会出现一些问题,如果你页面中有一个子组件,需要你去调接口并传参那么在这里去调用就为时已晚了,以为子组件早已创建,所以最好在created里面调用为好。

2.代码逻辑问题

这个问题是很基本的,但是仍然会有很多人不会去排查自己写的代码当中到底哪里出错了,其实最简单的方法就是逐行去console.log一下,这样会快速定位到是哪一行出现了问题,然后盯着这一行的逻辑,去排查,比如说一些this指向性问题,或者闭包产生和for循环层级较多的各种问题都会导致赋值失败。

二、解决方法

1.强制刷新

当你检查问代码逻辑没有问题的时候,你首先可以在赋值之后强制刷新渲染页面一下,这种时候一般都是多层嵌套或者多层遍历导致的,这种方法只能在当前页面内起作用,如果你是给子组件赋值,就不行。

代码如下(示例):

this.$forceUpdate()

2.重新销毁创建

如果只改变了子组件的数据,但是子组件没有重新渲染,那么可以重新创建一下这个子组件,其实也就是v-if一下。

代码如下(示例):

this.show = false;//show 是组件的v-if
this.$nextTick(() => {
   this.show = true;
});

3.在原有对象上添加新的属性

在后端接口返回的对象中再添加一个新的属性,但是在添加属性过后。视图层却没有同步更新。

代码如下(示例):

data(){
    return {
        demoList:[{name:'jack',age:15},{name:'Cyril',age:23}]    }
},
methods:{
    domeListData(){
        this.demoList[0].name = 'jacks';//改变在data种已定义的属性,试图会渲染
        this.demoList[0].weight= '60kg';//在原有对象上新加属性,试图不会渲染
    }
}

//解决方法
如上所述,既然我们新添加的属性没有得到vue的getter/setter转化,那么我们可以自己去主动转化我们所添加的新属性。 
Vue 不允许在已经创建的实例上动态添加新的根级响应式属性(root-level reactive property)。
然而它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上: Vue.set(this.demolist[0], 'weight', '50kg') 
我们还可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名: 
this.$set(this.demolist[0], 'weight', '50kg')
 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue中,当父组件传递给子组件的值动态改变时,可以通过以下两种方式重新渲染组件。 第一种方式是在父组件中使用ref来声明子组件,并通过this.$refs来调用子组件中的方法来重新渲染。具体步骤如下: 1. 在父组件中使用ref属性声明子组件,例如ref="com"。 2. 在值改变的地方,通过this.$refs.com.method()来调用子组件中的方法,重新渲染组件。 3. 为了确保DOM更新后再重新渲染组件,需要在调用子组件方法的地方使用Vue.nextTick()方法。例如Vue.nextTick(() => { this.$refs.com.method() })。\[1\] 第二种方式是在子组件中使用watch来监听父组件传递过来的对象,并在监听回调函数中重新赋值。具体步骤如下: 1. 在子组件中添加watch来监听父组件传递过来的对象。例如watch(props.value, (newVal, oldValue) => { //重新赋值 })。 2. 在监听回调函数中重新赋值,更新子组件的数据。\[2\] 需要注意的是,在第二种方式中,为了确保DOM更新后再重新渲染组件,可以使用Vue.nextTick()方法。例如在监听回调函数中使用Vue.nextTick(() => { //重新赋值 })。\[3\] #### 引用[.reference_title] - *1* *3* [vue中父组件传值给子组件,父组件值改变,子组件重新渲染](https://blog.csdn.net/hukay22/article/details/123913499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [vue3父组件传值给子组件,子组件无法实时更新父组件传递值](https://blog.csdn.net/qq_44472790/article/details/121457306)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值