【VUE】对data数据的深度监听(多层嵌套数据)

博客指出由于 JavaScript 限制,Vue 视图层不能检测利用索引直接设置数组项、修改数组长度这两种变动。给出了利用索引设置项的解决办法,还提到 splice() 方法可修改数组。同时结合项目案例,说明 form 中 categoryMenuUids 变化需添加监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先举个栗子

var vm = new Vue({
  data: {
    items: ['a', 'b', 'c']
  }
})
vm.items[1] = 'x' // 视图层不更新值的变化
vm.items.length = 2 // 视图层不更新值的变化

由于 JavaScript 的限制,Vue视图层不能检测以上变动的数组

当你利用索引直接设置一个项时

例如:vm.items[indexOfItem] = newValue
解决办法:

// Vue.set
Vue.set(vm.items, indexOfItem, newValue);

或者

// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue);

你也可以使用 vm.$set实例方法,该方法是全局方法 Vue.set 的一个别名:

vm.$set(vm.items, indexOfItem, newValue)

当你修改数组的长度时

例如:vm.items.length = newLength

// Array.prototype.splice
vm.items.splice(newLength)

注:splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。

我在项目中是这样解决的

data() {
    return {
      form: {
        uid: null,
        roleName: '',
        summary: '',
        categoryMenuUids: [] // 
      }

form.categoryMenuUids值变化后,发现数据并没有更新。

handleEdit: function(row) {
  ...
  this.form.categoryMenuUids = newValue;
}

因为这个是属于form中的 categoryMenuUids 的变化,并不能使vue监听到变化,所以就不能改变。所以需要添加监听,deep = true

watch: {
  'form': {
    handler(newVal, oldVal) {
      console.log('value changed', newVal, oldVal);
    },
    deep: true
  }
}
Vue 中,父组件向子组件传值可以使用 props,而子组件向父组件传值可以使用事件。但是多层组件嵌套时,可能需要跨越多个组件级别进行数据传递。这时可以使用事件总线或 Vuex 管理状态来实现。 1. 使用事件总线 事件总线是一个空的 Vue 实例,它可以用来跨组件传递事件和数据。在创建事件总线时,我们需要在 Vue 实例中定义一个空的 Vue 实例,然后在需要传递数据的组件中引入该实例并触发事件,其他组件中再监听该事件并接收数据。 ```javascript // 创建事件总线 const bus = new Vue() // 在需要传递数据的组件中触发事件 bus.$emit('eventName', data) // 在其他组件中监听事件并接收数据 bus.$on('eventName', (data) => { // 处理数据 }) ``` 2. 使用 Vuex 管理状态 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 在使用 Vuex 进行多层组件嵌套数据传递时,我们可以将需要传递的数据存储在 Vuex 的状态树中,并通过 mutations 或 actions 来修改和获取数据。 ```javascript // store.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { data: '' }, mutations: { setData(state, data) { state.data = data } }, actions: { setData({ commit }, data) { commit('setData', data) } } }) // 子组件中通过 $store.state.data 获取数据 this.$store.state.data // 子组件中通过 $store.commit('setData', data) 修改数据 this.$store.commit('setData', data) // 子组件中通过 $store.dispatch('setData', data) 异步修改数据 this.$store.dispatch('setData', data) ``` 以上两种方法都可以实现多层组件嵌套数据传递,具体使用哪种方法需要根据项目实际情况和需求进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值