虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的 watcher 。这是为什么 Vue 提供一个更通用的方法通过 watch
选项,来响应数据的变化。当你想要在数据变化响应时,执行异步操作或昂贵操作时,这是很有用的。
例如:
<div id="watch-example">
<p>
Ask a yes/no question:
<input v-model="question">
</p>
<p>{{ answer }}
</p>
</div>
|
<script src="https://unpkg.com/axios@0.12.0/dist/axios.min.js">
</script>
<script src="https://unpkg.com/lodash@4.13.1/lodash.min.js">
</script>
<script>
var watchExampleVM =
new Vue({
el:
'#watch-example',
data: {
question:
'',
answer:
'I cannot give you an answer until you ask a question!'
},
watch: {
question:
function (newQuestion) {
this.answer =
'Waiting for you to stop typing...'
this.getAnswer()
}
},
methods: {
getAnswer: _.debounce(
function () {
var vm =
this
if (
this.question.indexOf(
'?') ===
-1) {
vm.answer =
'Questions usually contain a question mark. ;-)'
return
}
vm.answer =
'Thinking...'
axios.get(
'https://yesno.wtf/api')
.then(
function (response) {
vm.answer = _.capitalize(response.data.answer)
})
.catch(
function (error) {
vm.answer =
'Error! Could not reach the API. ' + error
})
},
500
)
}
})
</script>
|
另:_.debounce方法需要加载lodash.js
<script src="https://unpkg.com/lodash@4.13.1/lodash.min.js"></script>