Vue3弱化this
# Vue3弱化this
在Vue3中,setup
语法糖和组合式API的引入,的确改变了Vue的开发模式,使得this
的使用变得不再必要或推荐。this
通常在Vue2中用于访问组件实例的属性和方法,如data
、props
、computed
、methods
等等。而在Vue3中,这些内容的获取和使用方式发生了一些变化。
# 1. 访问 data
# Vue2 使用 this
访问 data
在Vue2中,你可以通过this
来访问data
中的响应式数据:
<template>
<div>
<p>Count: {{ count }}</p>
<button @click="increment">Increment</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0
};
},
methods: {
increment() {
this.count++;
}
}
};
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Vue3 中的 ref
和 reactive
在Vue3中,setup
语法中使用ref
或reactive
来定义响应式数据,然后直接在setup
返回值中暴露这些数据供模板使用。
<template>
<div>
<p>Count: {{ count }}</p>
<button @click="increment">Increment</button>
</div>
</template>
<script setup>
// 定义响应式数据
import { ref } from 'vue';
const count = ref(0);
// 定义方法
function increment() {
count.value++;
}
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
解释:
- Vue3中没有
this
的概念,你可以直接在setup
中定义并操作响应式数据,并在模板中直接使用这些数据。
# 2. 访问 props
# Vue2 使用 this
访问 props
在Vue2中,props
可以通过this
来访问:
<template>
<div>
<h1>{{ title }}</h1>
</div>
</template>
<script>
export default {
props: {
title: String
}
};
</script>
2
3
4
5
6
7
8
9
10
11
12
13
# Vue3 中的 defineProps
在Vue3中,使用defineProps
函数来获取props
,并且直接在setup
中使用,而不需要this
。
<template>
<div>
<h1>{{ title }}</h1>
</div>
</template>
<script setup>
// 获取 props
const props = defineProps({
title: String
});
</script>
2
3
4
5
6
7
8
9
10
11
12
解释:
- 在Vue3中,
props
通过defineProps
函数获取,并且可以直接在setup
中使用,而无需通过this
访问。
# 3. 访问 computed
# Vue2 使用 this
访问 computed
在Vue2中,计算属性通过this
来访问:
<template>
<div>
<p>Double Count: {{ doubleCount }}</p>
</div>
</template>
<script>
export default {
data() {
return {
count: 2
};
},
computed: {
doubleCount() {
return this.count * 2;
}
}
};
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Vue3 中的 computed
在Vue3中,使用computed
函数来定义计算属性,并在模板中直接使用。
<template>
<div>
<p>Double Count: {{ doubleCount }}</p>
</div>
</template>
<script setup>
// 使用 computed 定义计算属性
import { ref, computed } from 'vue';
const count = ref(2);
const doubleCount = computed(() => count.value * 2);
</script>
2
3
4
5
6
7
8
9
10
11
12
13
解释:
- 在Vue3中,计算属性不再需要通过
this
访问,而是直接通过computed
函数定义,并在模板中使用。
# 4. 访问 methods
# Vue2 使用 this
访问 methods
在Vue2中,方法可以通过this
来调用组件中的其他属性或方法:
<template>
<div>
<button @click="increment">Increment</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0
};
},
methods: {
increment() {
this.count++;
}
}
};
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Vue3 中的 setup
函数
在Vue3中,方法直接在setup
中定义,并且可以直接操作setup
中的数据。
<template>
<div>
<button @click="increment">Increment</button>
</div>
</template>
<script setup>
// 定义响应式数据和方法
import { ref } from 'vue';
const count = ref(0);
function increment() {
count.value++;
}
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
解释:
- 在Vue3中,方法直接在
setup
中定义,并可以操作setup
中定义的响应式数据,无需通过this
来访问。
# 5. 访问 watch
# Vue2 使用 this
访问 watch
在Vue2中,watch
用于监听响应式数据的变化,并通过this
访问这些数据:
<script>
export default {
data() {
return {
count: 0
};
},
watch: {
count(newValue, oldValue) {
console.log(`Count changed from ${oldValue} to ${newValue}`);
}
}
};
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
# Vue3 中的 watch
在Vue3中,watch
函数可以直接在setup
中使用,并且不需要this
。
<script setup>
// 定义响应式数据并使用 watch 监听
import { ref, watch } from 'vue';
const count = ref(0);
watch(count, (newValue, oldValue) => {
console.log(`Count changed from ${oldValue} to ${newValue}`);
});
</script>
2
3
4
5
6
7
8
9
10
解释:
- 在Vue3中,
watch
函数直接在setup
中使用,无需通过this
访问数据。
# 6. 访问生命周期钩子
# Vue2 使用 this
访问生命周期钩子
在Vue2中,生命周期钩子如created
、mounted
等,通过this
访问组件实例中的属性和方法。
<template>
<div>Check the console for lifecycle logs.</div>
</template>
<script>
export default {
data() {
return {
count: 0
};
},
created() {
console.log('Component created, count is:', this.count);
},
mounted() {
console.log('Component mounted');
}
};
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Vue3 中的生命周期钩子
在Vue3中,使用onMounted
、onCreated
等函数来注册生命周期钩子,不需要this
访问组件实例。
<template>
<div>Check the console for lifecycle logs.</div>
</template>
<script setup>
// 定义响应式数据和使用生命周期钩子
import { ref, onMounted, onCreated } from 'vue';
const count = ref(0);
onCreated(() => {
console.log('Component created, count is:', count.value);
});
onMounted(() => {
console.log('Component mounted');
});
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
解释:
- 在Vue3中,生命周期钩子使用特定的函数,如
onMounted
,这些函数直接操作setup
中的数据,无需this
。
总结
在Vue3中,this
的概念被大大削弱,取而代之的是直接在setup
函数中定义和使用响应式数据、计算属性、方法、props
、watch
等。这不仅简化了代码结构,也提升了可读性和维护性,同时消除了this
绑定问题,让开发者更专注于逻辑实现。