文章目录
前言
在实际开发中,我们会遇到一些情况,比如我们可能需要对数据进行一些转化后再显示,或将多个数据结合起来进行显示;如果把这些逻辑直接写在template
中,这样就会使得UI里放逻辑,就违背了vue
设计的愿景, 这个时候compute
计算属性就产生了
一、computed 计算属性
对于任何响应式数据的复杂逻辑,都应该放在使用computed
计算属性
将被混入到组件实例中。所有getter和setter的上下文自动绑定为组件实例
data() {
return {
firstName: "Kobe",
lastName: "Bryant",
score: 80,
message: "Hello World"
}
},
computed: {
// 定义了一个计算属性叫fullname
fullName() {
return this.firstName + " " + this.lastName;
},
result() {
return this.score >= 60 ? "及格": "不及格";
},
reverseMessage() {
return this.message.split(" ").reverse().join(" ");
}
}
二、watch 监听器
监听器watch
的配置选项:
-
watch
只是在侦听info的引用变化,对于内部属性的变化说不会做出相应的,我们可以使用选项deep
进行更深层的侦听; -
另外一个属性,是希望一开始就会立即执行一次:
-
- 这个时候我们使用
immediate选项
- 这个时候无论后面的数据是否有变化,侦听的函数都会有限执行一次;
- 这个时候我们使用
watch: {
// 默认情况下我们的侦听器只会针对监听的数据本身的改变(内部发生的改变是不能侦听)
// info(newInfo, oldInfo) {
// console.log("newValue:", newInfo, "oldValue:", oldInfo);
// }
// 深度侦听/立即执行(一定会执行一次)
info: {
handler: function(newInfo, oldInfo) {
console.log("newValue:", newInfo.nba.name, "oldValue:", oldInfo.nba.name);
},
deep: true, // 深度侦听
// immediate: true // 立即执行
},
//也可以监听info的属性
'info.name': function(){
console.log(this.info.name, 'info.name');
}
},
三、v-model的用法
v-model
指令可以在表单input
,textarea
以及select
元素上创建双向数据绑定,- 它会根据控件类型自动选择正确的方法来更新元素
v-model
本质上是语法糖,它负责监听用户的输入事件来更新数据,并在极端场景下进行一些特殊处理;
v-model
的原理 :两个操作
v-bind
绑定value
属性的值;v-on
绑定input
事件监听到函数中,函数会获取最新的值赋值到绑定的属性中
//绑定textarea article是一个字符串
<textarea v-model="article"> </textarea>
//绑定checkbox -单个勾选框 isAgree是一个布尔值
<input id='agreement' type="checkbox" v-model="isAgree" />
//绑定checkbox -多个复选框 hobbies是一个数组
<label for="basketball">
<input id="basketball" type="checkbox" v-model="hobbies" value="basketball"> 篮球
</label>
<label for="football">
<input id="football" type="checkbox" v-model="hobbies" value="football"> 足球
</label>
<label for="tennis">
<input id="tennis" type="checkbox" v-model="hobbies" value="tennis"> 网球
</label>
//radio gender是一个字符串 是input的value
<label for="male">
<input id="male" type="radio" v-model="gender" value="male">男
</label>
<label for="female">
<input id="female" type="radio" v-model="gender" value="female">女
</label>
// 绑定select fruit是一个字符串的时候就是单选,如果是一个数组就是多选
<select v-model="fruit" multiple size="2">
<option value="apple">苹果</option>
<option value="orange">橘子</option>
<option value="banana">香蕉</option>
</select>