-
computed函数
-
与Vue2.x中computed配置功能一致 -
写法:有两种形式 简写形式? 和完整写法 不管是那种写法我们都需要在组件中先引入computed方法在使用 -
引入computed 方法
import { computed } from 'vue' -
下面我们通过代码来具体演示它的用法?? -
我们在setup方法中声明了一个data对象,? 对象中我们提供了一个人的姓(firstName) 和 名(lastName) 然后我们通过计算属性计算出全名?并渲染到页面 -
简写形式(没有考虑计算属性被修改的情况) -
<template>
<div>
<p>姓:{{data.firstName}}</p>
<p>名:{{data.lastName}}</p>
<p>名:{{data.fullName}}</p>
</div>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
name: 'App',
setup() {
let data = reactive({
firstName: '张',
lastName: '三'
})
// 计算属性简写形式 计算全名
data.fullName = computed(() => {
// 将计算结果返回
return data.firstName + '-' + data.lastName
})
return {
data
}
}
}
</script>
在页面中我们可以看到 数据都被渲染出来了 -
? -
完整形式 (实现读写操作) -
我们在组件中将全名用双向数据绑定v-bind绑定在一个输入框中 通过修改输入框中的内容来实现写入操作? -
computed配置对象中配置set方法 和get方法 通过set方法是实现修改效果 当我们修改计算属性的值时就会触发配置对象中set方法 来修改对应数据 -
...
<input v-model="data.fullName" />
...
...
// 计算属性的完整写法
data.fullName = computed({
// 读取数据
get() {
return data.firstName + "-" + data.lastName;
},
// 修改数据
set(value) {
const nameArr = value.split("-");
data.firstName = nameArr[0];
data.lastName = nameArr[1];
},
});
... 在浏览器中 我们修改计算属性的值可以看到对应的数据也会发送相应的变化 -
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
-
watch函数
-
与Vue2.x中watch配置功能一致 -
两个小“坑”:
-
代码演示
-
在watch()方法中可以传递三个参数:
-
第一个参数是:要监视的属性 -
第二个参数是:要执行的函数 -
第三个参数是:监视属性的配置对象
-
监视ref定义的响应式数据 -
<template>
<div>
<h2>年龄:{{ age }}</h2>
<button @click="age++">点击年龄增加</button>
</div>
</template>
<script>
import { ref, reactive ,watch} from "vue";
export default {
name: "App",
setup() {
let age = ref(0)
watch(age, (newValue,oldValue) => {
console.log(`年龄发生变化---最新的年龄是${newValue} --- 修改之前的年龄是${oldValue}`);
},{immediate:true})
return {
age
};
},
};
</script>
通过监视属性监视age属性的变化 在浏览器中我们可以看到可以监视到age的变化 -
监视多个ref定义的响应式数据 -
setup() {
let age = ref(0)
let name = ref("张三")
watch([age, name], (newValue,oldValue) => {
console.log('属性变化了',newValue, oldValue)
},{immediate:true})
return {
age,
name
};
}, 如果要监视多个数据 可以使用数组的写法,将要监视的属性写在数组里,newValue,oldValue参数将也会变成数组 按被照监听属性的顺序排列 -
?监视reactive定义的响应式数据
-
setup() {
let person = reactive({
name : '张三',
age: 20
})
watch(person, (newValue,oldValue) => {
console.log('属性变化了',newValue, oldValue)
}, {deep: false}) // deep被强制开启 此处的deep配置不再奏效
return {
person
};
}, 在浏览器中打印oldValue 我们可以看到无法获得正确的值了 (正确age值应该为20) -
-
监视reactive定义的响应式数据中的某个属性? (因为监视的是一个属性是基本数值类型所以oldValue好用)?
-
定义的响应式数据中的某个属性 参数需要写成一个函数 并把要监视的属性返回? -
watch(()=> person.age, (newValue,oldValue) => {
console.log('属性变化了',newValue, oldValue)
}) ?
-
监视reactive定义的响应式数据中的某些属性
-
使用数组的方式传递监视属性的函数 -
watch([()=> person.age, ()=> person.name], (newValue,oldValue) => {
console.log('属性变化了',newValue, oldValue)
})
- 监视reactive定义的响应式数据中的属性值是对象形式 (需要开启深度监视)
- 我么在对象中添加了一个属性 属性值是一个对象 并定义了监听 我们之后修改对象内的属性 需要开启深度监视
-
<template>
<div>
<h2>姓名:{{ person.name }}</h2>
<h2>年龄:{{ person.age }}</h2>
<h2>年龄:{{ person.hobby.smoking.a }}</h2>
<button @click="person.age++">点击年龄增加</button>
<button @click="person.hobby.smoking.a += '~'">点击修改smoking</button>
</div>
</template>
<script>
import { ref, reactive ,watch} from "vue";
export default {
name: "App",
setup() {
let person = reactive({
name : '张三',
age: 20,
hobby: {
smoking: {
a: '黄鹤楼'
}
}
})
watch(() => person.hobby, (newValue,oldValue) => {
console.log('属性变化了',newValue, oldValue)
},{deep: true}) // 开启了深度监视
return {
person
};
},
};
</script>
如果不开启深度监视 将无法监视到该属性的修改? 开启后属性修改将被监视到 ?
-
watchEffect函数
|