vue3 watch监听响应式数组失效问题

const pageData = reactive({
  checkedNodeList: []
  })


const colspanDisabled = ref(false);

watch(() => {
  return pageData.checkedNodeList
}, (newValue, oldValue) => {
  if (newValue.length > 0) {
    colspanDisabled.value = true;
  } else {
    colspanDisabled.value = false;
  }
}, {immediate: true});

如上代码中当,对数组进行splice操作,监听会失效

pageData.checkedNodeList.splice(index, 1);

解决方法:

1、使用   deep: true

watch(() => {
  return pageData.checkedNodeList
}, (newValue, oldValue) => {
  if (newValue.length > 0) {
    colspanDisabled.value = true;

  } else {
    colspanDisabled.value = false;
  }
}, {immediate: true, deep: true});

补充说明:

vue官方中说明了侦听数组的改变方法,若是使用索引去改变数组的参数则不会触发vue的watch事件以及渲染。例如↓三种方式都是不会触发vue的监听以及渲染的。

1.通过索引直接设置数组的某个值,

this.objArr[index] = newValue;

2.通过索引直接设置数组中对象的某个属性,

this.objArr[index].pro = newValue;

3.通过修改数组的长度,

this.objArr.length = newLength;
解决方法
官方文档中说明了:​

Vue 能够侦听响应式数组的变更方法,并在它们被调用时触发相关的更新。这些变更方法包括:

push()
pop()
shift()
unshift()
splice()
sort()
reverse()

举例1,数组的值的变化侦听
this.arr[index] = newValue;通过索引直接设置数组的某个值,是不会触发watch以及视图更新。
那我们就用他给的方法:splice()

this.arr.splice(index,1,newValue)
//这样就会触发vue的watch以及视图的更新。

2、使用 watchEffect

watchEffect(()=>{
  if(pageData.checkedNodeList.length > 0){
    colspanDisabled.value = true;
  }else {
    colspanDisabled.value = false;
  }
});

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值