Vue 监听属性(watch)

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 监听属性(watch)

目录

监听属性

监听值改变

使用watch实现

区别

总结


监听属性

通过watch来响应数据的变化。

虽然大多数情况计算属性都可以满足需要,但有时还是需要使用侦听器。当需要在数据发生变化时执行异步操作或者开销较大的操作时,就需要自定义监听器。

监听值改变

还是使用过滤应用的示例来做演示。

先绑定一个input事件。

示例如下:

<div id="box">
    <input type="text" @input="handleInput" v-model="mytext">
    <ul>
        <li v-for="item in datalist" :key="item">
            {{item}}
        </li>
    </ul>
</div>

同步情况下 使用计算属性可以完成

但是异步情况下,如果请求后端需要使用method方法。

示例如下:

<script>
    let vm = new Vue({
        el:'#box',
        data: {
            mytext:'',
            datalist:['aa', 'bb', 'cc', 'dd', 'ee', 'de'],
            originList:['aa', 'bb', 'cc', 'dd', 'ee', 'de'],
        },
        methods:{
            handleInput() {
                console.log("input", this.mytext)

                // 模拟异步情况 使用2秒后响应
                setTimeout(() => {
                    this.datalist = this.originList.filter(item => item.includes(this.mytext))
                }, 2000)
            }
        }
    })
</script>

使用watch实现

去掉input上的input事件,然后增加watch。

示例如下:

<script>
    let vm = new Vue({
        el:'#box',
        data: {
            mytext:'',
            datalist:['aa', 'bb', 'cc', 'dd', 'ee', 'de'],
            originList:['aa', 'bb', 'cc', 'dd', 'ee', 'de'],
        },
        watch: {
            mytext(newVal) {
                console.log("改变了", newVal)

                // 模拟异步情况 使用2秒后响应
                setTimeout(() => {
                    this.datalist = this.originList.filter(item => item.includes(this.mytext))
                }, 2000)
            }
        }
    })
</script>

区别

1.data => 状态,被拦截

2.方法 ==》 事件绑定,逻辑计算。可以不用return,没有缓存

3.计算属性(重视结果)=》 解决模版过重问题,必须有return,只求结果,有缓存,同步。

4.watch(重视过程),监听一个值的改变。不用返回值,异步同步。

总结

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 监听属性(watch)

Vue2中,watch属性用于监视数据的变化,当被监视的属性变化时,回调函数会自动调用以进行相关操作。使用watch属性需要注意,被监视的属性必须存在于`data`或`computed`中 [^2]。 ### 基本使用 可以监视`data`中的值,通过`watch`属性定义对某个属性的监视。当属性值发生改变时,`handler`函数会被调用,在这个函数里可以观察到旧值和新值的变化。还可以设置`immediate`为`true`,让`handler`在初始化时就调用一次。示例代码如下: ```vue <template> <span>{{isHot ? '炎热':'寒冷'}}</span> <button @click="onClick">切换天气</button> </template> <script> export default { data: { isHot: true }, methods: { onClick() { this.isHot = !this.isHot; } }, watch: { isHot: { immediate: true, handler(newValue, oldValue) { console.log('被调用了', newValue, oldValue); } } } }; </script> ``` ### 监听对象属性 #### 监听对象部分属性 可以直接监听对象中的某个属性,示例如下: ```javascript new Vue({ el: '#app', data: { user: { firstName: 'John', lastName: 'Doe' } }, watch: { 'user.firstName': { handler: function(newVal, oldVal) { console.log('First name changed:', newVal); } } } }); ``` #### 监听整个对象 Vue中的`watch`默认不监测对象内部值的改变(一层),配置`deep: true`可以监测对象内部值的改变(多层)。示例如下: ```vue <div id="app"> <div> <label for="a">A:</label> <input v-model="myObject.a" id="a"> </div> <div> <label for="b">B:</label> <input v-model="myObject.b" id="b"> </div> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2"></script> <script> new Vue({ el: '#app', data: { myObject: { a: 1, b: 2 } }, watch: { 'myObject.a': function(newVal, oldVal) { console.log('myObject.a changed:', newVal, oldVal); }, 'myObject.b': function(newVal, oldVal) { console.log('myObject.b changed:', newVal, oldVal); }, myObject: { handler(newVal, oldVal) { console.log('myObject changed:', newVal, oldVal); }, deep: true } } }); </script> ``` ### 其他配置项 - **`handler`**:其值是一个回调函数,即监听到变化时应该执行的函数 [^5]。 - **`deep`**:其值是`true`或`false`,确认是否深入监听。一般监听时不能监听到对象属性值的变化,设置为`true`可监听对象属性的改变(深度监听) [^5]。 - **`immediate`**:其值是`true`或`false`,确认是否以当前的初始值执行`handler`函数。若为`true`,该回调将会在侦听开始之后被立即调用 [^5]。 示例代码如下: ```javascript var vm = new Vue({ data: { a: 1, b: 2, c: 3, d: 4, e: { f: { g: 5 } } }, watch: { a: function (val, oldVal) { console.log('new: %s, old: %s', val, oldVal); }, b: 'someMethod', c: { handler: function (val, oldVal) { /* ... */ }, deep: true }, d: { handler: function (val, oldVal) { /* ... */ }, immediate: true }, e: [ function handle1 (val, oldVal) { /* ... */ }, function handle2 (val, oldVal) { /* ... */ } ], 'e.f': function (val, oldVal) { /* ... */ } } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值