vue watch监听数据变化

这篇具有很好参考价值的文章主要介绍了vue watch监听数据变化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


监听数据变化,在Vue中是通过侦听器来实现的,你也可以将它理解为监听器,时刻监听某个数据的变化

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属性,代码如下:文章来源地址https://www.toymoban.com/news/detail-517914.html

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监听数据变化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue watch监听多个数据

    项目驱动 在自己工作的某个项目中,之前基本都是使用watch监听单个数据。 但是后面在一个echarts的项目中,使用了三个echarts图表,而三个图表需要根据用户的选择条件同时更新,而后端传过来的数据我们需要分割成两个数组,这个时候,单独监听一个数组已经达不到项目需

    2024年02月15日
    浏览(36)
  • vue中使用watch监听同时监听两个数据

    使用场景,创建一个子组件,父组件会向子组件中穿递一个状态 - \\\"status\\\" ,子组件需要同时监听this.$route.params中的值和status,然后再去调方法,所以需要同时监听

    2024年02月11日
    浏览(44)
  • Vue 3 通过 watch 函数来进行侦听多个数据的变化

    Vue 3 通过  watch  函数来进行侦听数据的变化。在 Vue 3 中,我们可以使用以下方法来侦听多个数据源: 可以看到,在这个  watch  函数中,我们可以传递一个对象,对象的属性对应的是我们要侦听的数据源的名称,而属性的值则是数据源对应的属性名。此外,还可以传递一个

    2024年02月11日
    浏览(40)
  • vue3中用watch监听响应式数据的注意点

    如果你在vue3中使用reactive()方法创建响应式数据,然后又用torefs()方法将响应式数据解构成单一的ref响应式数据。 此时,如果你想用watch监听解构出来单一的响应式数据,watch不起作用。 此时,你需要用watch监听之前的reactive()方法创建的数据,这样是能监听到的,要开启深度监

    2024年02月13日
    浏览(39)
  • 微信小程序实现类Vue-watch数据监听

    参考链接

    2024年02月12日
    浏览(39)
  • Vue组件使用(父组件监听子组件数据变化,子组件使用父组件的数据,并监听父组件的数据变化)

    父组件声明变量 父组件向子组件传递数据 Vue 数据类型 type 有以下几种: String:字符串类型。例如:“hello world”。 Number:数字类型。例如:12,1.5。 Boolean:布尔类型。例如:true,false。 Object:对象类型。例如:{name: ‘Tom’, age: 20}。 Array:数组类型。例如:[1, 2, 3]。 Fun

    2024年02月14日
    浏览(45)
  • Vue3组件不发生变化,如何监听pinia中数据变化?

    在开发过程中,我们需要将一些跨组件使用的的数据在pinia中进行状态管理,组件在初始化的时候我们能通过onMounted,computed,watch,watchEffect获取到存储在pinia state中的内容,有一些特殊情况,在组件初始化之后我们无法通过以上四种情况获取state中的内容,这时候我们怎么做呢?

    2024年02月11日
    浏览(53)
  • vue子组件监听父组件数据变化并作出改变(亲测有效)

    1. 问题 1.1 封装组件时经常会遇到子组件需要根据父组件数据变化并执行对应的操作逻辑 1.2 监听方法中加了deep、immediate 等参数监听数组/对象还是没有生效 1.3 类型table组件需要根据父组件数据变化对表格数据进行更新 1.4 根据数据动态渲染组件需实时监听父组件变化 1.5 使用

    2023年04月08日
    浏览(41)
  • Vue2 Watch监听

    在Vue2中,我们可以使用watch来监听一个数据的变化,并且在数据变化时执行一些操作。这个特性是Vue2非常强大的一个功能,可以帮助我们监控一个或多个数据的变化,然后做出相应的反应。 要使用watch,我们需要在Vue组件的选项中声明一个watch对象,如下: watch对象的每个属

    2024年02月17日
    浏览(53)
  • JS 监听元素dom变化

    我们在开发中,会遇到一些需求,需要监听元素变化,比如元素属性变化,元素大小变化,今天,我们就来聊聊俩种常用实现监听的方案,其他的自行研究 一、ResizeObserver ResizeObserver 是来监听元素的大小位置发生变化,也可以说是回流(重排)时的变化 然后,我们创建监听器,

    2024年02月15日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包