vue watch监听数据变化的案例详解

 更新时间:2023年07月06日 10:14:01   作者:不掉头发!  
监听数据变化,在Vue中是通过侦听器来实现的,你也可以将它理解为监听器,时刻监听某个数据的变化,本文将通过代码示例为大家详细的介绍一下vue watch如何监听数据变化,需要的朋友可以参考下

watch的基本用法

这一次我们要添加的是watch属性。下面我们先来眼熟一下侦听器的添加位置:

<script>
    export default {
        name: "app",
        // 数据
        data() {
            return {};
        },
        // 方法
        methods:{},
        // 侦听器
        watch:{}
    };
    </script>

一个简单的例子:

 <template>
       <p>你点击按钮的次数是: {{ count }} </p>
       <button @click="add" v-model="count">点击</button>
   </template>
   <script>
   export default {
       name: "app",
       data(){
           return {
               count:0
           }
       },
       methods:{
           add(){
               this.count++;
           }
       },
       watch:{
           // 被侦听的变量count
           count(){
               console.log('count 发生了变化');
           }
       }
   };
   </script>

侦听器更多的是用在异步操作中,所谓异步操作就是数据返回有所延迟的操作,比如说我们要请求后端的接口,接口会返回给我们数据,然后我们再将数据渲染在页面上。

从请求接口到返回数据,这中间需要一定的时间,此时我们就可以用侦听器来侦听返回的数据,当数据返回以后,我们再触发渲染。

模拟一个伪异步操作:

    <template>
        <input type="text" v-model="inputValue">
        <p>从输入框中获取到的数据:{{ passedInputValue }}</p>
    </template>
    <script>
    export default {
        name: "app",
        data(){
            return {
                inputValue: '',
                passedInputValue: ''
            }
        },
        watch:{
            inputValue() {
                // 当inputValue数据发生变化以后,延迟三秒赋值给passedInputValue
                setTimeout(() => {
                    this.passedInputValue = this.inputValue;
                }, 3000)
            }
        }
    };
    </script>

此时你就会发现,当你在input输入框中输入文字以后,p标签内的数据不是立马改变,而是过三秒才会去渲染

获取前一次的值

在某些场景中,我们会需要上一次的数据,此时,侦听器就可以给我们两个值,旧值和新值

在上一个案例的基础上,我们只需要添加一个参数,即可获取旧值,代码如下:

watch:{
        inputValue(value,oldValue) {
            // 第一个参数为新值,第二个参数为旧值,不能调换顺序
            console.log(`新值:${value}`);
            console.log(`旧值:${oldValue}`);
        }
    }

handler方法和immediate属性

前面我们已经知道,当我们侦听的值没有发生改变的时候,是不会触发侦听器的,并且,页面第一次渲染的时候也不会触发侦听器。

但是现在我有个需求就是要让页面第一次渲染的时候就去触发侦听器呢?
此时就要用到一个方法和一个属性:immediate

    <template>
        <p>FullName: {{fullName}}</p>
        <p>FirstName: <input type="text" v-model="firstName"></p>
    </template>
    <script>
    export default {
        name: "app",
        data(){
            return {
                firstName: 'Su',
                lastName: 'Junyang',
                fullName: ''
            }
        },
        watch:{
            firstName: {
                handler(newName, oldName) {
                    this.fullName = newName + ' ' + this.lastName;
                },
                // 如果设置了false,那么在页面第一次渲染以后不会触发侦听器
                immediate: true
            }
        }
    };
    </script>

deep 深度侦听

所谓深度侦听就是侦听对象内部属性的值。

我们之前用的侦听器都只能侦听一个变量的变化,(重点看一下代码中的注释)例如:

data:{
    return {
        // 字符串发生变化,可以侦听
        firstName: 'Su',
        room:{
            name:"大床房",
            // 当房号发生变化的时候,侦听器并不能侦听到。
            // 因为侦听器只侦听到room,不能侦听number或者name
            number: 302
        }
    }
},

此时我们就需要深度侦听,深度侦听在代码上并不难实现,只需要在handler的基础上添加一个deep属性,代码如下:

watch:{
    room:{
        handler(newRoom,oldRoom){
            console.log("房间号发生了变化")
        },
        deep: true
    }
}

案例:使用侦听器和定时器实现伪模糊搜索

 <template>
      <div class="search">
        <input type="text" v-model="inputValue" />
        <div class="search-block" v-for="(element, index) in results" :key="index">
          {{ element }}
        </div>
      </div>
    </template>
    <script>
    export default {
      name: 'app',
      data() {
        return {
          results: [],
          mockData: [
            '浙江大学',
            '中国人民大学',
            '清华大学',
            '清华大学附属中学',
            '浙江理工大学',
            '浙江工业大学'
          ],
          inputValue: ''
        };
      },
      watch: {
        inputValue(value) {
          if (!!value) {
            setTimeout(() => {
              this.results = this.mockData.filter(el => {
                console.log(value);
                return el.indexOf(value) !== -1;
              });
            }, 300);
          }
        }
      }
    };
    </script>

到此这篇关于vue watch监听数据变化的案例详解的文章就介绍到这了,更多相关vue watch监听数据变化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)

    vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)

    这篇文章主要介绍了vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用) ,需要的朋友可以参考下
    2018-11-11
  • 详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)

    详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)

    本篇文章主要介绍了详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • Vue中的侦听器及使用场景

    Vue中的侦听器及使用场景

    Vue中的侦听器是一种响应式机制,可以对指定的数据进行监听,并在数据变化时执行相应的回调函数。常用于监听复杂数据类型的变化,如对象和数组。通过侦听器,可以实现数据的自动更新和逻辑处理等功能,提高代码的可读性和可维护性
    2023-05-05
  • VueJs 搭建Axios接口请求工具

    VueJs 搭建Axios接口请求工具

    axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端。今天我们来介绍VueJs 搭建Axios接口请求工具,需要的朋友参考下本文吧
    2017-11-11
  • 浅析vue3的setup的使用和原理

    浅析vue3的setup的使用和原理

    setup是Vue3中引入的一个新的组件选项,是Vue3中函数式组件的核心部分,它提供了一种新的方式来编写组件逻辑,下面就来和大家讲讲它的使用和原理
    2023-08-08
  • Avue实现动态查询与数据展示的示例代码

    Avue实现动态查询与数据展示的示例代码

    Avue是一个基于Vue.js的前端框架,它是由阿里云开发的一款企业级UI组件库,旨在提供一套全面、易用且高性能的界面解决方案本文介绍了Avue实现动态查询与数据展示的示例,需要的朋友可以参考下
    2024-08-08
  • vue前后分离调起微信支付

    vue前后分离调起微信支付

    这篇文章主要为大家详细介绍了vue前后分离调起微信支付,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • vue中导出Excel表格的实现代码

    vue中导出Excel表格的实现代码

    项目中我们可能会碰到导出Excel文件的需求,这篇文章主要介绍了vue中导出Excel表格的实现代码,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • 浅谈vuex actions和mutation的异曲同工

    浅谈vuex actions和mutation的异曲同工

    这篇文章主要介绍了浅谈vuex actions和mutation的异曲同工 ,详细的介绍了actions和mutation的使用和区别,非常具有实用价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • vue2.0的虚拟DOM渲染思路分析

    vue2.0的虚拟DOM渲染思路分析

    vue2.0采用了虚拟DOM来代替对真实DOM的操作,最后通过某种机制来完成对真实DOM的更新,渲染视图。这篇文章主要介绍了vue2.0的虚拟DOM渲染,需要的朋友可以参考下
    2018-08-08

最新评论