Vue 计算属性 && 监视属性

 

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8" />
 5         <title>Vue 计算属性</title>
 6         <script type="text/javascript" src="../js/vue.js"></script>
 7     </head>
 8     <body>
 9 <!-- 
10     Vue中的计算属性:
11         1.定义:要用的属性不存在,要通过已有属性计算得来。
12         2.原理:底层借助Object.defineproperty方法提供getter和setter。
13         3.get函数什么时候执行
14             .初次读取时会执行一次。
15             .当依赖的数据发生改变的时候会再次调用
16         4.优势:与通过methods实现计算属性相比,内部有缓存机制(复用),效率更高,调试方便。
17         5.备注:
18             .计算属性最终会出现在vm上,直接读取使用即可
19             .如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变
20 
21  -->
22         <div id="root">
23             姓:<input type="text" v-model="firstName" > <br />
24             名:<input type="text" v-model="lastName" > <br />
25             全名:<span>{{fullName}}</span>
26         </div>
27     </body>
28 
29     <script type="text/javascript" >
30         Vue.config.productionTip = false;//     阻止 vue 在启动时生成生产提示。
31         let vm = new Vue({
32             el: '#root',
33             data:{
34                 firstName: '',
35                 lastName: ''
36             },
37             computed:{
38                 fullName: {
39                     get(){ // get什么时候调用:1.初次读取fullName的时候,2.所依赖的数据发生变化的时候调用。3.其它都是直接从缓存中获取fullName的值
40                         return this.firstName + '-' + this.lastName
41                     },
42                     set(value){ // 当this.fullName='李-四'值修改的时候调用
43                         let arr = value.split('-');
44                         this.firstName = arr[0];
45                         this.lastName = arr[1];
46                     }
47                 },
48                 fullName1:function(){ // 计算属性简写(当计算属性只考虑读取才能简写,fullName1直接当做get)
49                     return this.firstName + '-' + this.lastName
50                 }
51             }
52         })
53     </script>
54 </html>

 

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8" />
 5         <title>Vue 监视属性</title>
 6         <script type="text/javascript" src="../js/vue.js"></script>
 7     </head>
 8     <body>
 9         <!-- 
10             监视属性watch:
11                 1.当被监视的属性变化时,回调函数自动调用,进行相关操作
12                 2.监视的属性必须存在,才能进行监视
13                 3.监视的两种写法:
14                     .new Vue时传入watch配置
15                     .通过vm.$watch添加监视属性
16                 4.深度监视:
17                     .Vue中的watch默认不监视对象内部值的改变(一层)
18                     .配置deep:true可以检测对象内部值的改变(多层)
19                     备注:
20                         .Vue自身可以检测对象内部值的改变,但Vue提供的watch默认不检测内部值的改变
21                         .使用watch时根据数据的具体结构,决定是否采用深度监视
22          -->
23         <div id="root">
24             <h2>今天天气很{{info}}</h2>
25             <button @click="changeWeather">切换天气</button>
26             <br />
27             <h3>a的值是:{{numbers.a}}</h3>
28             <button @click="numbers.a++">点我让a+1</button><br />
29             <h3>b的值是:{{numbers.b}}</h3>
30             <button @click="numbers.b++">点我让b+1</button><br />
31         </div>
32     </body>
33 
34     <script type="text/javascript" >
35         Vue.config.productionTip = false;//     阻止 vue 在启动时生成生产提示。
36         let vm = new Vue({
37             el: '#root',
38             data:{
39                 isHot: false,
40                 numbers: {
41                     a:1,
42                     b:1
43                 }
44             },
45             computed:{
46                 info(){
47                     return this.isHot ? '炎热' : '凉爽';
48                 }
49             },
50             methods:{
51                 changeWeather(e){
52                     this.isHot = ! this.isHot;
53                 }
54             },
55             watch:{
56                 // isHot:{ // 不仅可以监视data中的数据,还可以监控computed中的数据
57                 //     immediate: true, // 初始化时自动调用一下handler
58                 //     handler(newValue, oldValue){ // 当isHot发生改变时调用
59                 //         console.log(newValue, oldValue);
60                 //         console.log('isHot被修改了!');
61                 //     }
62                 // },
63                 // isHot(newValue, oldValue){ // 简写模式,缺点是没办法设置immediate、deep属性
64                 //     console.log(newValue, oldValue);
65                 // },
66                 'numbers.a':{ // 监测多层次结构中某个属性的变化
67                     handler(newValue, oldValue){
68                         console.log('numbers.a被修改了!');
69                     }
70                 },
71                 numbers:{   
72                     deep: true, // 监测多层次结构的所有变化,该值默认为false不监视
73                     handler(newValue, oldValue){
74                         console.log('numbers被修改了!');
75                     }
76                 }
77             }
78         });
79         // 另一种添加监视属性的方式
80         // 好处:可以根据用户的行为从而决定监视哪个属性
81         vm.$watch('isHot',{
82             immediate: true, // 初始化时自动调用一下handler
83             handler(newValue, oldValue){ // 当isHot发生改变时调用
84                 console.log(newValue, oldValue);
85                 console.log('isHot被修改了!');
86             }
87         })
88         // 简写模式,缺点是没办法设置immediate、deep属性
89         // vm.$watch('isHot',function(newValue, oldValue){ // 当isHot发生改变时调用
90         //         console.log(newValue, oldValue);
91         //         console.log('isHot被修改了!');
92         //     })
93     </script>
94 </html>

 

  

posted @ 2022-05-20 16:10  看一百次夜空里的深蓝  阅读(74)  评论(0编辑  收藏  举报