1 # Vue3 计算属性与监视
2 # 1.computed函数:与Vue2.x中的computed配置功能一致
3 inport {ref,computed,watch} from 'vue';
4 setup(){
5 let person = {
6 firstName: '张',
7 lastName: '三'
8 };
9 // 计算属性——简写
10 let fullName = computed(()=>{
11 return person.firstName + person.lastName;
12 });
13 // 计算属性完整写法(这里你也可以直接:person.fullName = computed(...))
14 let fullName = computed({
15 get(){return person.firstName+person.lastName},
16 set(value){
17 const nameArr = value.split('-');
18 person.firstName = nameArr[0];
19 person.lastName = nameArr[1];
20 }
21 });
22 }
23 # 2.watch与watchEffect
24 <template>
25 <h2>sum的值:{{sum}}</h2>
26 <button @click="sum+=1">点我+1</button>
27 <hr>
28 <h3>{{msg}}</h3>
29 <button @click="msg+='!'">点我+!</button>
30 <hr>
31 <h3>姓名:{{person.name}}</h3>
32 <h3>年龄{{person.age}}</h3>
33 <h3>薪资:{{person.job.j1.salary}}K</h3>
34 <button @click="person.name+='~'">修改姓名</button>
35 <button @click="person.age++">年龄增长</button>
36 <button @click="person.job.j1.salary++">涨薪</button>
37 </template>
38
39 <script>
40 import {ref, reactive, computed, watch, watchEffect} from 'vue'
41 export default {
42 name: 'HelloWorld',
43 setup(props, context){
44 let sum = ref(0);
45 let msg = ref('你好啊');
46 let person = reactive({
47 name: '张三',
48 age: 18,
49 job:{
50 j1:{
51 salary: 30
52 }
53 }
54 });
55
56 // 情况一:监视ref所定义的一个响应式数据
57 watch(sum, (newValue, oldValue)=>{
58 console.log('sum的值变化了!',newValue, oldValue);
59 },{immediate:true});
60
61 // 情况二:监视ref所定义的多个响应式数据
62 watch([sum,msg], (newValue, oldValue)=>{
63 console.log('sum或msg的值变化了!',newValue, oldValue);
64 },{immediate:true});
65
66 /*
67 情况三:监视reactive所定义的一个响应式数据的全部属性
68 1.注意:吃出无法正确的获取oldValue
69 2.注意:强制开启了深度监视(deep=false配置无效)
70 */
71 watch(person, (newValue, oldValue)=>{
72 console.log('person的值变化了!',newValue, oldValue);
73 },{deep:true}); // 此处deep配置无效
74
75 // 情况四:监视reactive所定义的一个响应式数据中的某个属性
76 watch(()=>person.name, (newValue, oldValue)=>{
77 console.log('person.name的值变化了!',newValue, oldValue);
78 });
79
80 // 情况五:监视reactive所定义的多个响应式数据中的某个属性。newValue和oldValue会以数组形式呈现新旧值
81 watch([()=>person.name, ()=>person.age], (newValue, oldValue)=>{
82 console.log('person.name或person.age的值变化了!',newValue, oldValue);
83 });
84
85 // 特殊情况:监视reactive所定义的对象数据,需要开启deep监视,不然对象属性不会被监视(注意:odlValue也不正常)
86 watch(()=>person.job, (newValue, oldValue)=>{
87 console.log('person.job的值变化了!',newValue, oldValue);
88 }, {deep:true});
89
90 /**
91 * watchEffect函数:
92 * watch的套路是:既要知名监视的属性,也要知名监视的回调。
93 * watchEffect的套路是:不用知名监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。
94 * watchEffect有点想computed:
95 * .但computed注重是计算出来的值(回调函数的返回值),所以必须要写返回值
96 * .而watchEffect更注重的是过称(回调函数的函数体),所以不用写返回值
97 */
98 // watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调
99 watchEffect(()=>{
100 const x1 = sum.value;
101 console.log('watchEffect被调用了0');
102 });
103
104 watchEffect(()=>{
105 const x2 = person.job.j1.salary;
106 console.log('watchEffect被调用了1');
107 });
108
109 return {
110 sum,
111 msg,
112 person
113 }
114 }
115 }
116 </script>