Skip to content

Commit 86b0427

Browse files
新增watch
1 parent 5f11d75 commit 86b0427

File tree

2 files changed

+236
-0
lines changed

2 files changed

+236
-0
lines changed

Vue-options/README.md

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,177 @@
8989
});
9090
```
9191

92+
---
93+
9294
## watch(监听)
9395

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+
94265
## computed(计算属性)

Vue-options/index.html

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,27 @@
1818
点击处理val
1919
</button>
2020
<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+
<!-- 计算属性 -->
2142
</div>
2243
</body>
2344
</html>
@@ -30,8 +51,18 @@
3051
num: 0,
3152
num_event: 0,
3253
val: 0,
54+
watchVal: 1,
55+
ov: null,
56+
nv: null,
57+
watchMethods: 1,
58+
obj: { a: 1 },
59+
list: [],
60+
show: false,
3361
};
3462
},
63+
created() {
64+
// this.init();
65+
},
3566
methods: {
3667
onClick() {
3768
console.log(this);
@@ -50,6 +81,40 @@
5081
e.target.setAttribute("disabled", true);
5182
}
5283
},
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+
},
53118
},
54119
});
55120
</script>

0 commit comments

Comments
 (0)