1. 程式人生 > 其它 >Vue 計算屬性 && 監視屬性

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                 'numbers.a':{ // 監測多層次結構中某個屬性的變化
64                     handler(newValue, oldValue){
65                         console.log('numbers.a被修改了!');
66                     }
67                 },
68                 numbers:{   
69                     deep: true, // 監測多層次結構的所有變化,該值預設為false不監視
70                     handler(newValue, oldValue){
71                         console.log('numbers被修改了!');
72                     }
73                 }
74             }
75         });
76         // 另一種新增監視屬性的方式
77         // 好處:可以根據使用者的行為從而決定監視哪個屬性
78         vm.$watch('isHot',{
79             immediate: true, // 初始化時自動呼叫一下handler
80             handler(newValue, oldValue){ // 當isHot發生改變時呼叫
81                 console.log(newValue, oldValue);
82                 console.log('isHot被修改了!');
83             }
84         })
85     </script>
86 </html>