指南
计算属性与监听器
了解 Vue2.0 响应式原理,掌握计算属性和侦听器的实用技巧
🎯 引言
学会这篇文章后,你能够理解 Vue2.0 中响应式数据的基本原理,并且掌握如何用计算属性和侦听器来让你的页面更智能、更高效。这对刚入门前端的小伙伴来说非常重要,能帮你写出更简洁、性能更好的代码。
🧱 Vue2.0 响应式是什么?
说到 Vue,你肯定听过“响应式”这个词。简单来说,响应式就是数据变化后,页面能自动更新。就像你在表单里输入内容,旁边的展示区能跟着变,这背后就是响应式在工作。
Vue2.0 是通过数据劫持和发布订阅模式实现响应式的。当你改变数据时,Vue 会通知所有使用该数据的地方,自动帮你更新视图。
⚙️ 响应式中的计算属性(computed)
计算属性是 Vue 响应式中的“聪明助手”。它们会基于已有数据计算出一个新的值,并且具有缓存功能。只有当相关数据变化时,计算属性才会重新计算。
计算属性的优势:
- 不用写重复代码,逻辑集中
- 自动缓存,性能更好
- 绑定在模板里使用更方便
示例:计算属性的简单用法
example.vue
<template>
<div>
<p>原始消息:{{ message }}</p>
<p>大写消息(计算属性):{{ uppercaseMessage }}</p>
</div>
</template>
<script>
export default {
data() {
return {
message: 'hello vue',
};
},
computed: {
uppercaseMessage() {
// 只有当 message 变化时,才会重新计算
return this.message.toUpperCase();
},
},
};
</script>
计算属性适合用于基于现有数据衍生出新的数据,且需要缓存的场景。
👂 侦听器(watch)
侦听器就像是数据变化的监听器,你可以对某个数据进行“监听”,一旦这个数据变化了,侦听器里定义的函数就会执行。
侦听器适合处理异步操作或者执行开销较大的逻辑,比如请求接口等。
侦听器的应用示例
example.vue
<template>
<div>
<input v-model="question" placeholder="请输入你的问题" />
<p>答案:{{ answer }}</p>
</div>
</template>
<script>
export default {
data() {
return {
question: '',
answer: '请输入问题,稍等...',
};
},
watch: {
question(newQuestion) {
if (newQuestion.indexOf('?') === -1) {
this.answer = '问题通常需要问号哦?';
return;
}
this.answer = '正在思考...';
this.getAnswer();
},
},
methods: {
getAnswer() {
setTimeout(() => {
this.answer = '这是一个模拟的答案。';
}, 1000);
},
},
};
</script>
侦听器适合监听数据变化后执行异步操作,或者需要手动调用函数的场景。
🔍 计算属性 VS 侦听器
两者看起来都能“响应”数据变化,但适用场景不太一样。
- 计算属性:用于基于数据生成新值,且有缓存。
- 侦听器:用于观察数据变化后,执行复杂或异步操作。
想象一下,计算属性就像是一个自动计算器,侦听器则像是一个警报器,数据变化时触发特定动作。
🧾 小节总结
- Vue2.0 响应式让数据变化自动反应到视图上
- 计算属性适合基于数据生成新值,并且有缓存,性能更优
- 侦听器适合数据变化后执行异步或复杂操作
❓ 知识问答(Q&A)
Q:计算属性和侦听器的主要区别是什么?
A:计算属性是基于数据计算新值且带缓存的属性,侦听器是对数据变化做出响应执行函数,尤其适合异步处理。
Q:什么时候用计算属性,什么时候用侦听器?
A:如果需要衍生新数据,且性能要求高,选计算属性;如果需要在数据改变时执行副作用逻辑,选侦听器。
🧪 小练习
练习1
实现一个输入框,输入数字后,显示它的平方,使用计算属性完成。
<template>
<div>
<input v-model="num" type="number" placeholder="输入数字" />
<p>平方结果:{{ square }}</p>
</div>
</template>
<script>
export default {
data() {
return {
num: 0,
};
},
computed: {
// 在这里写计算属性 square
},
};
</script>
练习2
实现一个输入框,输入文字时,如果文字长度超过 10,显示警告提示,使用侦听器完成。
<template>
<div>
<input v-model="text" placeholder="请输入内容" />
<p v-if="warning" style="color: red;">内容过长!</p>
</div>
</template>
<script>
export default {
data() {
return {
text: '',
warning: false,
};
},
watch: {
// 侦听 text,实现长度判断和设置 warning
},
};
</script>
🎉 恭喜你已经掌握 Vue2.0 响应式、计算属性和侦听器技能啦!
