数组侦听器

侦听器的基本结构

作用:用来侦听数据有没有变化,一旦有变化就调用函数
语法:在和data、methods这些平级的位置写一个watch

 <script>
        // 【侦听器】
        new Vue({
            el:'',
            data:{},
            methods:{
            },
            // 侦听器
            watch:{
                // 参数一:改变后的值。
                // 参数二:改变前的值。
                要侦听的数据(newValue,oldValue){                    
                }
            }
        })
    </script>
对数组进行侦听
【对数组进行侦听】
数组是引用类型,存在比较复杂的侦听规则。
从理论上说,修改一个数组的内容,比如修改数组中某个元素的值,或者给数组添加新的元素,都不会修改数组本身的地址。
为此,Vue.js对数组做了特殊处理,使得使用标准的数组操作方法对数组所做的修改,都可以被侦听到。

1.Vue不能检测以下数组的变动:

a.当你利用索引值直接设置一个数组时,如vm.items[indexOfItem] = newValue
b.当你修改数组的长度时,例如: vm.items.length = newLength

2.使用标准方法修改数组可以被侦听到

push() 尾部添加
pop() 尾部删除
unshift() 头部添加
shift() 头部删除
splice() 删除、添加、替换
sort() 排序
reverse() 逆序

在这里插入图片描述

### Vue3 中使用 `watch` 侦听数组长度变化 在 Vue3 中,可以通过监听数组本身的值来捕获其长度的变化。由于数组是一个引用类型的数据结构,因此需要特别关注其实现细节以确保能够正确捕捉到长度的变化。 #### 基本实现 以下代码展示了一个典型的场景:当数组的长度发生变化时(即有新增或删除操作),触发回调函数,并判断当前长度是否大于零: ```javascript import { ref, watch } from 'vue'; const items = ref([]); // 定义一个空数组作为响应式数据 // 设置 watcher 来监视数组本身 watch( () => items.value.length, // 获取数组长度作为一个计算属性 (newLength) => { if (newLength > 0) { console.log('数组长度已变为', newLength); } } ); // 测试用例 items.value.push('item1'); // 数组长度增加至1,触发回调 ``` 在这个例子中,我们并没有直接监听整个数组对象,而是通过访问它的 `.length` 属性创建一个新的 getter 函数[^1]。这样做的好处是可以更精确地控制何时触发观察者逻辑。 --- #### 解决潜在问题——直接修改数组不会触发 Watcher 需要注意的是,某些特定的操作可能无法正常触发动态监测机制。例如,如果你尝试通过索引来更改现有元素,则该变动通常不会被检测到[^4]。为了避免这种情况发生,建议始终采用那些能显式改变集合大小的方法,如 `push()` 或 `splice()` 等标准APIs来进行更新。 另外一种解决办法就是利用 `reactive` 而不是 `ref` 创建复杂数据结构实例: ```javascript import { reactive, watch } from 'vue'; const state = reactive({ list: [] }); watch( () => state.list.length, (newLen) => { if(newLen > 0){ console.log(`list length is now greater than zero`); } } ) state.list.push("element"); ``` 这里采用了 `reactive` 方式定义状态管理容器,同样实现了对内部字段数量敏感性的监控效果[^2]. --- #### 使用 `watchEffect` 替代方案 除了传统的 `watch`, 还可以考虑运用简化版工具 —— `watchEffect`. 它会在每次依赖项重新评估期间自动运行关联的动作序列而无需指定明确的目标表达式或者额外参数配置. ```javascript import { ref, watchEffect } from 'vue'; let myArray = ref([]); watchEffect(() => { if(myArray.value && myArray.value.length > 0 ){ console.warn("myArray has elements!"); } }) setTimeout(()=>{ myArray.value=[1]; },1000) ``` 上述片段演示了如何基于条件语句快速构建起一套即时反馈系统[^3]. --- ### 总结 综上所述,在 Vue3 应用程序里要有效地跟踪数组尺寸上的动态调整情况,既可以选择传统意义上的 `watch` 结合自定义获取器模式,也可以选用更为便捷高效的 `watchEffect` 技术路线达成目的。无论采取哪种策略都需要牢记遵循框架最佳实践原则从而保障最终成果兼具高性能表现力与良好的可维护性特征。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值