Vue监听器watch的基本用法

1. 作用

监视数据变化,执行一些业务逻辑或异步操作。

2. 格式

监听器 watch 内部以 key :value 的形式定义,key 是 data 中的属性名,value 是监听到 key 变化后执行的回调函数。value 可以是字符串,可以是函数,可以是对象。

  • value 如果为字符串,字符串为方法名称,需要通过 methods 定义好;
  • value 如果为函数,通过函数可以获取到监听对象更新前和更新后的值;
  • value 如果为对象,对象内可以包含回调函数的其他选项,例如是否初始化时进行监听 immediate : true,或是否执行深度遍历 deep : true。

如 value 为函数,watch 格式为:

watch: {
	// 该方法会在数据变化时,触发执行
	// data 中属性的名称为数据属性名
	// : function 可以省略。数据属性名 : function (newValue, oldValue) 可简写为 数据属性名 (newValue, oldValue)
	数据属性名 : function (newValue, oldValue) {
	一些业务逻辑 或 异步操作。
	},
	// data 中对象数据的属性需要写为 对象.属性名
	'对象.属性名' : function (newValue, oldValue) {
	一些业务逻辑 或 异步操作。
	}
}

如 value 为对象,watch 格式为:

watch: {
	数据属性名 : {
		deep: true, // 深度监视(针对复杂类型)
		immediate: true, // 是否立刻执行一次handler
		handler (newValue) {
			console.log(newValue)
		}
	}
}
3. 示例
3.1 value 值为字符串
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-size: 18px;
      }
      #app {
        padding: 10px 20px;
      }
      .box {
        display: flex;
      }
      textarea {
        width: 300px;
        height: 160px;
        font-size: 18px;
        border: 1px solid #dedede;
        outline: none;
        resize: none;
        padding: 10px;
      }
      textarea:hover {
        border: 1px solid #1589f5;
      }
      .tip-box span {
        flex: 1;
        text-align: center;
      }
      .query span {
        font-size: 18px;
      }

      .input-wrap {
        position: relative;
      }
      .input-wrap span {
        position: absolute;
        right: 15px;
        bottom: 15px;
        font-size: 12px;
      }
      .input-wrap i {
        font-size: 20px;
        font-style: normal;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <div class="box">
        <div class="input-wrap">
          <textarea v-model="words"></textarea>
        </div>
      </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
      
      const app = new Vue({
        el: '#app',
        data: {
          words: ''
        },
        methods:{
          changewords(){
            console.log(this.words)
          }
        },
        watch: {
          words : 'changewords' // 注意单引号不要漏掉
        }
      })
    </script>
  </body>
</html>

执行结果:
在这里插入图片描述

3.2 value 值为函数

将上面代码改写成 value 值为函数的格式:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-size: 18px;
      }
      #app {
        padding: 10px 20px;
      }
      .box {
        display: flex;
      }
      textarea {
        width: 300px;
        height: 160px;
        font-size: 18px;
        border: 1px solid #dedede;
        outline: none;
        resize: none;
        padding: 10px;
      }
      textarea:hover {
        border: 1px solid #1589f5;
      }
      .tip-box span {
        flex: 1;
        text-align: center;
      }
      .query span {
        font-size: 18px;
      }

      .input-wrap {
        position: relative;
      }
      .input-wrap span {
        position: absolute;
        right: 15px;
        bottom: 15px;
        font-size: 12px;
      }
      .input-wrap i {
        font-size: 20px;
        font-style: normal;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <div class="box">
        <div class="input-wrap">
          <textarea v-model="words"></textarea>
        </div>
      </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
      
      const app = new Vue({
        el: '#app',
        data: {
          words: ''
        },
        watch: {
          words (newvalue, oldvalue) {
            console.log(newvalue)
          }
        }
      })
    </script>
  </body>
</html>

执行结果:
在这里插入图片描述

3.3 value 值为对象

将上面代码改写成 value 值为对象的格式:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-size: 18px;
      }
      #app {
        padding: 10px 20px;
      }
      .box {
        display: flex;
      }
      textarea {
        width: 300px;
        height: 160px;
        font-size: 18px;
        border: 1px solid #dedede;
        outline: none;
        resize: none;
        padding: 10px;
      }
      textarea:hover {
        border: 1px solid #1589f5;
      }
      .tip-box span {
        flex: 1;
        text-align: center;
      }
      .query span {
        font-size: 18px;
      }

      .input-wrap {
        position: relative;
      }
      .input-wrap span {
        position: absolute;
        right: 15px;
        bottom: 15px;
        font-size: 12px;
      }
      .input-wrap i {
        font-size: 20px;
        font-style: normal;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <div class="box">
        <div class="input-wrap">
          <textarea v-model="words.cat"></textarea>
        </div>
      </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
      
      const app = new Vue({
        el: '#app',
        data: {
          words: {
            cat : '奶牛猫',
            dog : '哈士奇',
          }
        },
        watch: {
           // '对象.属性名'的单引号不要漏掉
          'words.cat' : {
            deep : true,
            immediate : true,  // 立刻执行一次handler
            handler (newvalue) {
              console.log(newvalue)
            }
          }
        }
      })
    </script>
  </body>
</html>

执行结果:
在这里插入图片描述
因为设置了 immediate : true,所以首次打开页面会打印出 “奶牛猫” 字样。

4. 与计算属性对比

计算属性的结果会缓存,只有依赖属性发生变化才会重新计算,且必须返回一个数据,主要用来进行数据计算。
监听器主要监听某个数据的变化,从而执行回调业务,不仅仅局限于返回数据,比如数据变化时执行异步发送Ajax请求或开销较大的操作时,采用监听器较好。

  • 25
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js中的监听器watch是一个用于监听Vue实例中数据变化的功能。通过使用watch选项,我们可以指定要监听的数据属性,并在它们发生变化时执行特定的操作。 watch选项可以是一个对象,其中每个属性都是要监听的数据属性,而值可以是一个函数或一个对象。 当值是一个函数时,它会接收两个参数:新值和旧值。在函数内部,我们可以根据需要执行任何操作,比如发送异步请求、计算属性、触发其他方法等。 当值是一个对象时,我们可以使用不同的钩子函数来定义要在特定情况下执行的操作。常用的钩子函数包括: - immediate:在监听开始之后立即执行一次回调函数。 - handler:回调函数,当监听的属性发生变化时触发。 - deep:深度监听,当监听的属性内部发生变化时也会触发回调函数。 - immediate和deep可以一起使用。 下面是一个使用watch的示例: ```javascript data() { return { message: '', count: 0 } }, watch: { message(newVal, oldVal) { console.log('message changed:', newVal, oldVal); }, count: { handler(newVal, oldVal) { console.log('count changed:', newVal, oldVal); }, immediate: true, deep: true } } ``` 在上面的示例中,我们监听了message和count两个属性。当message发生变化时,会执行相应的回调函数。而对于count属性,我们使用了一个对象来定义监听,设置了immediate为true,表示在监听开始之后立即执行一次回调函数;设置了deep为true,表示深度监听count属性内部的变化。 总的来说,watch是一个非常有用的功能,可以帮助我们在数据变化时执行相应的操作,实现更精细的控制和逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值