首页 > 编程笔记 > JavaScript笔记
阅读:32
Vue watch(监听器)详解
在 Vue.js 中,当需要在数据发生变化且需要执行异步代码或开销比较大的逻辑时,使用 compute 属性不合适,开发者可以自定义一个 watch 监听器,来监听数据的变化。
举个简单的例子:
在上面的代码中,定义了一个 question 监听器,用于监听 question 数据属性。当 question 数据属性发生变化时,会自动执行 question 监听器后面的函数内容。在 question 监听器的函数逻辑中执行的是一个异步延时代码。
虽然可以用 watch 监听器监听 firstName1 和 lastName1 的变化,但是用计算属性计算 fullName2 要简单得多,代码如下:
举个简单的例子:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>test Vue.js</title>
- <script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script>
- <script type="text/javascript" src="../static/js/Vue.js"></script>
- </head>
- <body>
- <div id="app">
- <p>
- 输入问题:
- <input v-model="question">
- </p>
- <p>{{ answer }}</p>
- </div>
- <script>
- const vm = new Vue({
- el: "#app",
- data: {
- question: '',
- answer: '输入问题,我才好给你答案'
- },
- watch: {
- // 监听question的变化,自动调用
- question: function () {
- this.answer = '等待你输入问题';
- this.debouncedGetAnswer();
- }
- },
- created: function () {
- // 500ms后调用getAnswer方法,控制调用频率
- this.debouncedGetAnswer = _.debounce(this.getAnswer, 500);
- },
- methods: {
- getAnswer: function () {
- this.answer = "思索中…";
- window.setTimeout(getResult, 500);
- }
- }
- });
- function getResult() {
- console.log("1111");
- vm.$data.answer = "答案是:" + (1 + Math.random());
- }
- </script>
- </body>
- </html>
计算属性和watch监听器的对比
watch 监听器是 Vue.js 提供的一种用来观察和响应 Vue.js 实例上的数据变动的一种方式,一般只用于变动的开销比较大或异步方法调用的情况。否则使用计算属性要比使用 watch 监听器合适。虽然可以用 watch 监听器监听 firstName1 和 lastName1 的变化,但是用计算属性计算 fullName2 要简单得多,代码如下:
- <div id="app">
- FirstName1 <input type="text" v-model="firstName1"> LastName1 <input type="text" v-model="lastName1"><br/>
- FullName1 {{ fullName1 }}<br/><br/>
- FirstName2 <input type="text" v-model="firstName2"> LastName2 <input type="text" v-model="lastName2"><br/>
- FullName2 {{ fullName2 }}<br/><br/>
- </div>
- <script type="text/javascript">
- const vm = new Vue({
- el: '#app',
- data: {
- firstName1: '',
- lastName1: '',
- fullName1: '', // This will be updated via watch
- firstName2: '',
- lastName2: ''
- },
- watch: {
- firstName1: function() {
- this.fullName1 = this.firstName1 + ' ' + this.lastName1;
- },
- lastName1: function() {
- this.fullName1 = this.firstName1 + ' ' + this.lastName1;
- }
- },
- computed: {
- fullName2: function() {
- return this.firstName2 + ' ' + this.lastName2;
- }
- }
- });
- </script>