File tree Expand file tree Collapse file tree 2 files changed +236
-0
lines changed Expand file tree Collapse file tree 2 files changed +236
-0
lines changed Original file line number Diff line number Diff line change 89
89
});
90
90
```
91
91
92
+ ---
93
+
92
94
## watch(监听)
93
95
96
+ Vue 提供了对单个属性的监听器,当该属性发生改变的时候,自动触发,当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的,但是此项使用不当会影响性能,所以慎用。
97
+
98
+ - 普通监听
99
+
100
+ ```html
101
+ <div id =" app" >
102
+ <input type =" text" v-model =" watchVal" />
103
+ <p >旧的值:{{ov}}</p >
104
+ <p >新的值:{{nv}}</p >
105
+ </div >
106
+ ```
107
+
108
+ ```js
109
+ var app = new Vue({
110
+ el: "#app",
111
+ data() {
112
+ return {
113
+ watchVal: 1,
114
+ ov: null,
115
+ nv: null,
116
+ };
117
+ },
118
+ watch: {
119
+ watchVal(nv, ov) {
120
+ this.ov = ov;
121
+ this.nv = nv;
122
+ },
123
+ },
124
+ });
125
+ ```
126
+
127
+ - 当然监听到变化可以做一些事情
128
+
129
+ ```html
130
+ <div id =" app" >
131
+ <input type =" text" v-model =" watchMethods" />
132
+ </div >
133
+ ```
134
+
135
+ ```js
136
+ var app = new Vue({
137
+ el: "#app",
138
+ data() {
139
+ return {
140
+ watchMethods: 1,
141
+ };
142
+ },
143
+ methods: {
144
+ alert() {
145
+ alert("监听到变化触发了我");
146
+ },
147
+ },
148
+ watch: {
149
+ watchMethods(v) {
150
+ if (v || v === "") this.alert();
151
+ },
152
+ },
153
+ });
154
+ ```
155
+
156
+ - 深度监听(deep)
157
+
158
+ watch 里面还有一个属性 deep,默认值是 false,代表是否深度监听,比如我们 data 里有一个 obj 属性
159
+
160
+ ```html
161
+ <div id =" app" >
162
+ <p >a的值:{{obj.a}}</p >
163
+ <button @click =" obj.a = 2" >改变a得值</button >
164
+ </div >
165
+ ```
166
+
167
+ ```js
168
+ var app = new Vue({
169
+ el: "#app",
170
+ data() {
171
+ return {
172
+ obj: { a: 1 },
173
+ };
174
+ },
175
+ watch: {
176
+ //方法1,运用deep
177
+ obj: {
178
+ handler() {
179
+ console.log("deep,a的值监听到变化了");
180
+ },
181
+ deep: true,
182
+ },
183
+ //方法2,字符串形式监听
184
+ "obj.a": {
185
+ handler() {
186
+ console.log("字符串形式监听,a的值监听到变化了");
187
+ },
188
+ //deep:true 此处的deep可以不写
189
+ },
190
+ },
191
+ });
192
+ ```
193
+
194
+ - immediate 属性
195
+
196
+ 一句话很好理解,申明了后立即执行 handle 方法,但是如果想着要在什么情境下使用,什么样的需求需要使用。举个例子,有个需求,点击这个按钮,出现一个列表,列表的数据是后端数据渲染的
197
+
198
+ ```html
199
+ <div id =" app" >
200
+ <button @click =" show = true" >点我出列表</button >
201
+ <div v-if =" show" >
202
+ <span
203
+ style =" background : #ccc ; margin-right : 10px ;"
204
+ v-for =" item in list"
205
+ >
206
+ {{item}}
207
+ </span >
208
+ </div >
209
+ </div >
210
+ ```
211
+
212
+ > 常规做法
213
+
214
+ 在 create 生命周期调取接口改变 list
215
+
216
+ ```js
217
+ var app = new Vue({
218
+ el: "#app",
219
+ data() {
220
+ return {
221
+ list: [],
222
+ show: false,
223
+ };
224
+ },
225
+ created() {
226
+ this.init();
227
+ },
228
+ methods: {
229
+ init() {
230
+ this.list = [1, 2, 3];
231
+ },
232
+ },
233
+ });
234
+ ```
235
+
236
+ > immediate 写法
237
+
238
+ 这样就会在初始化立即执行。
239
+
240
+ ```js
241
+ var app = new Vue({
242
+ el: "#app",
243
+ data() {
244
+ return {
245
+ list: [],
246
+ show: false,
247
+ };
248
+ },
249
+ methods: {
250
+ init() {
251
+ this.list = [1, 2, 3];
252
+ },
253
+ },
254
+ watch: {
255
+ list: {
256
+ handler: "init",
257
+ immediate: true,
258
+ },
259
+ },
260
+ });
261
+ ```
262
+
263
+ ---
264
+
94
265
## computed(计算属性)
Original file line number Diff line number Diff line change 18
18
点击处理val
19
19
</ button >
20
20
< span > {{val}}</ span > < br /> < br />
21
+ <!-- watch -->
22
+ <!-- 普通监听 -->
23
+ < input type ="text " v-model ="watchVal " />
24
+ < p > 旧的值:{{ov}}</ p >
25
+ < p > 新的值:{{nv}}</ p >
26
+ <!-- 监听到变化触发事件 -->
27
+ < input type ="text " v-model ="watchMethods " />
28
+ <!-- 深度监听 -->
29
+ < p > a的值:{{obj.a}}</ p >
30
+ < button @click ="obj.a = 2 "> 改变a得值</ button > < br /> < br />
31
+ <!-- immediate使用 -->
32
+ < button @click ="show = true "> 点我出列表</ button >
33
+ < div v-if ="show ">
34
+ < span
35
+ style ="background: #ccc; margin-right: 10px; "
36
+ v-for ="item in list "
37
+ > {{item}}</ span
38
+ >
39
+ </ div >
40
+
41
+ <!-- 计算属性 -->
21
42
</ div >
22
43
</ body >
23
44
</ html >
30
51
num : 0 ,
31
52
num_event : 0 ,
32
53
val : 0 ,
54
+ watchVal : 1 ,
55
+ ov : null ,
56
+ nv : null ,
57
+ watchMethods : 1 ,
58
+ obj : { a : 1 } ,
59
+ list : [ ] ,
60
+ show : false ,
33
61
} ;
34
62
} ,
63
+ created ( ) {
64
+ // this.init();
65
+ } ,
35
66
methods : {
36
67
onClick ( ) {
37
68
console . log ( this ) ;
50
81
e . target . setAttribute ( "disabled" , true ) ;
51
82
}
52
83
} ,
84
+ alert ( ) {
85
+ alert ( "监听到变化触发了我" ) ;
86
+ } ,
87
+ init ( ) {
88
+ this . list = [ 1 , 2 , 3 ] ;
89
+ } ,
90
+ } ,
91
+ watch : {
92
+ watchVal ( ov , nv ) {
93
+ this . ov = ov ;
94
+ this . nv = nv ;
95
+ } ,
96
+ watchMethods ( v ) {
97
+ if ( v || v === "" ) this . alert ( ) ;
98
+ } ,
99
+ // 深度监听方法1,deep
100
+ obj : {
101
+ handler ( ) {
102
+ console . log ( "deep,a的值监听到变化了" ) ;
103
+ } ,
104
+ deep : true ,
105
+ } ,
106
+ // 深度监听方法2
107
+ "obj.a" : {
108
+ handler ( ) {
109
+ console . log ( "字符串形式监听,a的值监听到变化了" ) ;
110
+ } ,
111
+ //deep:true 此处的deep可以不写
112
+ } ,
113
+
114
+ list : {
115
+ handler : "init" ,
116
+ immediate : true ,
117
+ } ,
53
118
} ,
54
119
} ) ;
55
120
</ script >
You can’t perform that action at this time.
0 commit comments