首页 > 编程笔记 > JavaScript笔记
阅读:64
Vue watch(监听器)详解
在 Vue.js 中,当需要在数据发生变化且需要执行异步代码或开销比较大的逻辑时,使用 compute 属性不合适,开发者可以自定义一个 watch 监听器,来监听数据的变化。
举个简单的例子:
虽然可以用 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>
在上面的代码中,定义了一个 question 监听器,用于监听 question 数据属性。当 question 数据属性发生变化时,会自动执行 question 监听器后面的函数内容。在 question 监听器的函数逻辑中执行的是一个异步延时代码。计算属性和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>
ICP备案:
公安联网备案: