计算属性
<!-- 计算属性:
1.定义:要用的属性不存在,要通过已有属性计算得来。
2.原理:底层借助了Objcet.defineproperty方法提供的getter和setter。
3.get函数什么时候执行?
(1).初次读取时会执行一次。
(2).当依赖的数据发生改变时会被再次调用。
4.优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
5.备注:
1.计算属性最终会出现在vm上,直接读取使用即可。
2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。
<body>
<div id="root">
姓:<input type="text" v-model:value="firstName" /><br />
名:<input type="text" v-model:value="lastName" /><br />
姓名:<span>{{fullName}}</span>
</div>
</body>
<script>
const vm = new Vue({
el: "#root",
data: {
firstName: "张",
lastName: "三",
},
computed: {
fullName: {
get() {
const fullName = this.firstName + "-" + this.lastName;
return fullName;
},
set(value) {
const arr = value.split("-");
this.firstName = arr[0];
this.lastName = arr[1];
},
},
},
});
</script>
监视属性
<!--
监视属性watch:
1.当被监视的属性变化时, 回调函数自动调用, 进行相关操作
2.监视的属性必须存在,才能进行监视!!
3.监视的两种写法:
(1).new Vue时传入watch配置
(2).通过vm.$watch监视
<!--
深度监视:
(1).Vue中的watch默认不监测对象内部值的改变(一层)。
(2).配置deep:true可以监测对象内部值改变(多层)。
-->
<body>
<div id="root">
<h2>今天天气很{{info}}</h2>
<button @click="change">切换天气</button>
<hr />
<h3>a的值是:{{number.a}}</h3>
<button @click="number.a++">点我a++</button>
<h3>b的值是:{{number.b}}</h3>
<button @click="number.b++">点我b++</button>
</div>
</body>
<script>
const vm = new Vue({
el: "#root",
data: {
isHot: true,
number: {
a: 1,
b: 1,
},
},
computed: {
info() {
return this.isHot ? "炎热" : "凉爽";
},
},
methods: {
change() {
this.isHot = !this.isHot;
},
},
watch: {
isHot: {
immdiate: true,
handler(newValue, oldValue) {
console.log("isHot被修改了");
},
},
"number.a": {
handler() {
console.log("a被改变了");
},
},
number: {
deep: true,
handler() {
console.log("number被改变了");
},
},
},
});
</script>