Vue.js从入门到跑路-方法、计算属性和侦听器

方法

要为组件添加一个方法,我们可以用到 method 选项

1
2
3
//用于声明要混入到组件实例中的方法。
methods: {
}

我们来实现一个显示全名

1
{{ getFullName }}
1
2
3
4
5
6
7
8
9
10
11
data() {
return {
firstName: 'John',
lastName: 'Doe',
};
},
methods: {
getFullName() {
return this.firstName + ' ' + this.lastName;
},
},

注解

@是指令 v-on 的简写,可以给元素绑定事件侦听器

方法中的 this` 指向当前活跃的组件实例

计算属性

我们用 computed 选项来声明要在组件实例上暴露的计算属性。

1
2
computed: {
}

我们同样实现一个显示全名

1
{{ fullName }}
1
2
3
4
5
computed: {
fullName() {
return this.firstName + ' ' + this.lastName;
},
},

注意事项:计算属性的 getter 而没有任何其他的副作用,避免直接修改计算属性值

Watch 侦听器

使用 watch 选项在每次响应式属性发生变化时触发一个函数。

1
watch:{}

我们来实现一个侦听名字变化

1
2
3
4
<h1>Full Name: {{ fullName }}</h1>
<button @click="changeFirstName">Change First Name</button>
<button @click="changeLastName">Change Last Name</button>
<p>Last Name: {{ lastName }}</p>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
data() {
return {
firstName: 'John',
lastName: 'Doe',
};
},
methods: {
changeFirstName() {
this.firstName = 'Jane';
},
changeLastName() {
this.lastName = 'Smith';
},
},
watch: {
firstName(newVal, oldVal) {
console.log(`Watch: First Name changed from ${oldVal} to ${newVal}`);
},
lastName(newVal, oldVal) {
console.log(`Watch: Last Name changed from ${oldVal} to ${newVal}`);
},
},
});

可以看到当我们点击按钮,改变了firstNamelastName的值,控制台就提示了

watch 默认是浅层的:被侦听的属性,仅在被赋新值时,才会触发回调函数——而嵌套属性的变化不会触发。如果想侦听所有嵌套的变更,你需要深层侦听器:

1
2
handler() {},
deep: true,

handler 设置一个回调函数,侦听属性变化,deep 设置为 true,vue 会侦听所有属性的变化

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
data() {
return {
person: {
firstName: 'John',
lastName: 'Doe',
},
};
},
methods: {
changePerson() {
this.person.firstName = 'Jane';
this.person.lastName = 'Smith';
},
},
watch: {
person: {
handler(newVal, oldVal) {
console.log('Watch: Person changed');
console.log('New Value:', newVal);
console.log('Old Value:', oldVal);
},
deep: true,
},
},

这样,无论你修改了 person 对象中的哪个属性,都会触发深层侦听器的回调函数。

另外还有几个属性

1
immediate: true

设置为 true 会强制立即执行回调,即在组件实例创建时会立即调用

1
once: true

设置为 true 时,回调函数只在属性变化时触发一次

1
flush: 'post'

使侦听器回调中能访问被 Vue 更新之后的所属组件的 DOM

1
flush: 'sync'

在 Vue 进行任何更新之前触发

1
unwatch()

停止侦听器
我们可以使用$watch()方法来命令式地创建一个侦听器
上文的代码可以改写如下

1
2
3
4
5
this.$watch('person', (newVal, oldVal) => {
console.log('Watch: Person changed');
console.log('New Value:', newVal);
console.log('Old Value:', oldVal);
}, { deep: true });

计算属性和方法的区别

我们在上文的示例的计算属性和方法中都添加一个 console.log

观察浏览器控制台我们可以发现

计算属性fullName使用console.log来打印一条消息,以验证其是否被调用。每当firstNamelastName发生更改时,计算属性会自动重新计算并更新相应的文本。

方法getFullName同样使用console.log来打印一条消息,但它只有在模板中调用时才会执行。

同一个函数用计算属性和方法的不同之处

在于计算属性值会基于其响应式依赖被缓存。一个计算属性仅会在其响应式依赖更新时才重新计算。

计算属性适合做简单的操作,而方法适合做复杂的操作,通常作为事件侦听和公共业务逻辑使用。

计算属性和 watch 的区别

计算属性适合简单的业务逻辑,而 watch 适合耗时的操作

计算属性有返回值而 watch 没有

方法和 watch 的区别

方法可以在 watch 中调用而 watch 不行

方法可以有返回值而 watch 没有

Vue.js从入门到跑路-方法、计算属性和侦听器

http://wxory.com/archives/19615.html

作者

Wxory

发布于

2024-03-08

更新于

2024-03-11

许可协议

CC BY 4.0

评论