vue监听数据变化

简介: vue监听数据变化

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

watch的基本用法

在之前我们在js中添加了data、methods,这一次我们要添加的是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属性

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

但是现在我有个需求就是要让页面第一次渲染的时候就去触发侦听器呢?

此时就要用到一个方法和一个属性。

<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
        }
    }
},

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

<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>


目录
相关文章
|
3天前
|
缓存 监控 JavaScript
探讨优化Vue应用性能和加载速度的策略
【5月更文挑战第17天】本文探讨了优化Vue应用性能和加载速度的策略:1) 精简代码和组件拆分以减少冗余;2) 使用计算属性和侦听器、懒加载、预加载和预获取优化路由;3) 数据懒加载和防抖节流处理高频事件;4) 图片压缩和选择合适格式,使用CDN加速资源加载;5) 利用浏览器缓存和组件缓存提高效率;6) 使用Vue Devtools和性能分析工具监控及调试。通过这些方法,可提升用户在复杂应用中的体验。
10 0
|
3天前
|
JavaScript 前端开发
vue(1),小白看完都会了
vue(1),小白看完都会了
|
3天前
|
JavaScript 开发工具 git
Vue 入门系列:.env 环境变量
Vue 入门系列:.env 环境变量
10 1
|
3天前
|
JavaScript
vue知识点
vue知识点
11 0
|
4天前
|
JavaScript 前端开发 定位技术
Vue使用地图以及实现轨迹回放 附完整代码
Vue使用地图以及实现轨迹回放 附完整代码
Vue使用地图以及实现轨迹回放 附完整代码
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
992 0
|
4天前
|
JavaScript 数据库
ant design vue日期组件怎么清空 取消默认当天日期
ant design vue日期组件怎么清空 取消默认当天日期
|
4天前
|
JavaScript C++
vue高亮显示组件--转载
vue高亮显示组件--转载
9 0
|
4天前
|
JavaScript
Vue中避免滥用this去读取data中数据
Vue中避免滥用this去读取data中数据
|
4天前
|
JavaScript
vue中使用pinia及持久化
vue中使用pinia及持久化
6 0