Взгляните на новую структуру кода Vue3
Цель этой статьи — познакомить людей, уже имеющих опыт работы с Vue2, с тем, как писать Vue3.
Поэтому в этой статье предполагается, что вы уже знакомы с ядром Vue, и мы познакомим вас только с тем, что вам нужно знать для написания кода Vue3.
Три способа написания скрипта в Vue3
Во-первых, Vue3 представляет новую функцию под названием Composition API, которая предоставляет новый способ организации логики внутри компонентов. В результате теперь есть три способа написания кода в теге <script>
в Vue3:
1. Самый простой синтаксис Vue2.
<template> <div>{{ count }}</div> <button @click="onClick"> add 1 </button> </template> <script> export default { data() { return { count: 1, }; }, methods: { onClick() { this.count += 1; }, }, } </script>
2. настройка()
<template> <div>{{ count }}</div> <button @click="onClick"> add 1 </button> </template> <script> import { ref } from 'vue'; export default { setup() { let count = ref(1); const onClick = () => { count.value += 1; }; return { count, onClick, }; }, } </script>
3. <script setup>
<template> <div>{{ count }}</div> <button @click="onClick"> add 1 </button> </template> <script setup> import { ref } from 'vue'; const count = ref(1); const onClick = () => { count.value += 1; }; </script>
Как видите, как с точки зрения длины кода, так и простоты кода метод <script setup>
является самой простой формой. Если вы знакомы с Vue, я рекомендую использовать метод <script setup>
. Такой подход сделал Vue3 моим любимым фреймворком для интерфейса.
Если вы новичок во фронтенд-разработке, рекомендую начать с первого способа. Это требует меньшей кривой обучения, и вы можете сначала изучить основы использования Vue, а затем быстро изучить наиболее важный контент в Vue3 на основе моей статьи.
Первый метод такой же, как и в Vue2, поэтому мы не будем вдаваться в подробности. Второй метод требует, чтобы все объекты и методы были возвращены до того, как их можно будет использовать, что может быть многословным. За исключением старых проектов, я не рекомендую изучать этот метод лично. Пока не планирую углубляться в эту часть.
Поэтому мы в основном сосредоточимся на <script setup>
, который является синтаксисом для понимания в этом подходе. Обратите внимание, что <script setup>
по сути является синтаксическим сахаром для второго метода, поэтому, если вы освоите этот подход, вы, по сути, сможете использовать и второй метод.
Как писать компоненты с помощью ‹настройки скрипта›
Изучение Vue3 не означает, что вам нужно изучать новую технологию. Философия разработки, лежащая в основе Vue3, ничем не отличается от философии Vue2.
Разница между Vue3 и Vue2 — это то же самое, что сказать одно и то же на другом языке или диалекте.
Итак, нам нужно позаботиться о том, как для записи контента в Vue2 способом Vue3.
1. data
— единственное, что требует внимания
Единственное, что вам нужно помнить обо всей data
части, это вот что.
Свойства, которые ранее создавались в данных, теперь все объявляются с помощью ref()
.
Используйте его непосредственно в шаблоне и не забудьте добавить .value
к сценарий.
Я написал простой пример в начале, так что давайте сравним его напрямую.
1). Сравнение методов записи vue2 и vue3
// Vue2 way of writing code. <template> <div>{{ count }}</div> <button @click="onClick"> add 1 </button> </template> <script> export default { data() { return { count: 1, }; }, methods: { onClick() { this.count += 1; }, }, } </script> // Vue3 way of writing code. <template> <div>{{ count }}</div> <button @click="onClick"> add 1 </button> </template> <script setup> import { ref } from 'vue'; // Declare in this way const count = ref(1); const onClick = () => { // Remember to add .value when using count.value += 1; }; </script>
2).Notes — API умственного бремени композиции
Ref
и Reactive
В Vue3 также есть API под названием reactive
. Тем не менее, мое предложение состоит в том, что вам не нужно заботиться об этом. В большинстве случаев ref
достаточно.
Когда использовать обертку ref()
, а когда нет. Использовать или нет ref
зависит от того, нужно ли обновлять страницу при изменении значения этой переменной. Конечно, можно совершенно не заботиться об этом, как и о записи данных в прошлом. Однако при его использовании нужно постоянно использовать .value
.
Не используйте деструктурирование. При его использовании не пишите, как в следующем примере, иначе вы потеряете реактивность. Другими словами, значение обновляется, но страница не обновляется.
// Vue3 way of writing code. <template> <div>{{ count }}</div> <button @click="onClick"> add 1 </button> </template> <script setup> import { ref } from 'vue'; const count = ref(1); const onClick = () => { // Don't write like that! const { value } = count; value += 1; }; </script>
Примечание. Изучение Vue3 увеличивает стоимость обучения, поскольку приходится думать о подобных вещах. На самом деле, эти умственные нагрузки могут быть полностью устранены в процессе обучения.
Вот почему я рекомендую новичкам сначала изучить, как написан Vue2.
2. методы
Чтобы объявить метод события, нам просто нужно создать объект метода в теге скрипта.
Остальное так, как было написано на Vue2, и Vue3 написано так же.
Вью2:
<template> <div @click="onClick"> this is vue2 </div> </template> <script> export default { methods: { onClick() { console.log('clicked') }, }, } </script>
Vue3:
<template> <div @click="onClick"> this is vue3 </div> </template> <script setup> // Note this section const onClick = () => { console.log('clicked') } </script>
3. реквизит
Для объявления props
можно использовать defineProps()
, подробности смотрим в коде.
Вью2:
<template> <div>{{ foo }}</div> </template> <script> export default { props: { foo: String, }, created() { console.log(this.foo); }, } </script>
Vue3:
<template> <div>{{ foo }}</div> </template> <script setup> // Note here const props = defineProps({ foo: String }) //use in the script tag console.log(props.foo) </script>
Примечание. При использовании реквизита снова будьте осторожны, чтобы не использовать деконструкцию.
<script setup> const props = defineProps({ foo: String }) // Don't write like this const { foo } = props; console.log(foo) </script>
4. генерирует событие
Как и в случае с props
, для объявления emits
мы можем использовать defineEmits()
, подробности смотрим в коде.
Вью2:
<template> <div @click="onClick"> this is vue2 </div> </template> <script> export default { emits: ['click'], methods: { onClick() { this.$emit('click'); }, }, } </script>
Vue3:
<template> <div @click="onClick"> this is vue3 </div> </template> <script setup> // note here const emit = defineEmits(['click']); const onClick = () => { emit('click') } </script>
5. вычислено
Вью2:
<template> <div> <span>{{ value }}</span> <span>{{ reversedValue }}</span> </div> </template> <script> export default { data() { return { value: 'this is a value', }; }, computed: { reversedValue() { return value .split('').reverse().join(''); }, }, } </script>
Vue3:
<template> <div> <span>{{ value }}</span> <span>{{ reversedValue }}</span> </div> </template> <script setup> import {ref, computed} from 'vue' const value = ref('this is a value') const reversedValue = computed(() => { // Using ref requires .value return value.value .split('').reverse().join(''); }) </script>
6. смотреть
В этом разделе нам нужно знать, что есть два способа записи watch
в Vue3. Один заключается в использовании watch
напрямую, а другой — в использовании watchEffect
.
Разница между этими двумя подходами заключается в том, что
watch
требует, чтобы вы явно указали переменные, от которых вы зависите, чтобы выполнить watchEffect
.
С другой стороны, watchEffect
автоматически реализует эффект часов на основе используемых вами переменных.
Использовать часы напрямую
Вью2:
<template> <div>{{ count }}</div> <div>{{ anotherCount }}</div> <button @click="onClick"> add 1 </button> </template> <script> export default { data() { return { count: 1, anotherCount: 0, }; }, methods: { onClick() { this.count += 1; }, }, watch: { count(newValue) { this.anotherCount = newValue - 1; }, }, } </script>
Vue3:
<template> <div>{{ count }}</div> <div>{{ anotherCount }}</div> <button @click="onClick"> add 1 </button> </template> <script setup> import { ref, watch } from 'vue'; const count = ref(1); const onClick = () => { count.value += 1; }; const anotherCount = ref(0); // Note: Here, you need to explicitly specify that the dependency is on the count variable watch(count, (newValue) => { anotherCount.value = newValue - 1; }) </script>
используйте watchEffect
Вью2:
<template> <div>{{ count }}</div> <div>{{ anotherCount }}</div> <button @click="onClick"> add 1 </button> </template> <script> export default { data() { return { count: 1, anotherCount: 0, }; }, methods: { onClick() { this.count += 1; }, }, watch: { count(newValue) { this.anotherCount = newValue - 1; }, }, } </script>
Vue3:
<template> <div>{{ count }}</div> <div>{{ anotherCount }}</div> <button @click="onClick"> add 1 </button> </template> <script setup> import { ref, watchEffect } from 'vue'; const count = ref(1); const onClick = () => { count.value += 1; }; const anotherCount = ref(0); watchEffect(() => { // The following action is automatically triggered based on the change in count.value anotherCount.value = count.value - 1; }) </script>
7. Жизненный цикл
В Vue3, помимо переименования двух хуков уничтожения в unmount
, единственное, что следует отметить, это то, что хуки beforeCreate
и created
нельзя использовать в <script setup>
.
Если вы знакомы со связанными хуками жизненного цикла, просто не забудьте использовать on
в качестве префикса и сделать первую букву в setup
заглавной.
API на основе опций:
<template> <div></div> </template> <script> export default { beforeCreate() {}, created() {}, beforeMount() {}, mounted() {}, beforeUpdate() {}, updated() {}, // Vue2: beforeDestroy beforeUnmount() {}, // Vue2: destroyed unmounted() {}, // The other hooks are not commonly used, so they are not listed. } </script>
API композиции:
<template> <div></div> </template> <script setup> import { onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted, } from 'vue' onBeforeMount(() => {}) onMounted(() => {}) onBeforeUpdate(() => {}) onUpdated(() => {}) onBeforeUnmount(() => {}) onUnmounted(() => {}) </script>
Краткое содержание
Что ж, в принципе этого достаточно, чтобы освоить Vue3.
Эта статья сама по себе не может помочь вам понять все о Vue3, но она поможет вам освоиться с тем, как написан Vue3.
Если вы хотите иметь хорошее представление о том, что такое Vue3, вам нужно самостоятельно прочитать официальную документацию по Vue3. Если вам интересны мои статьи, подпишитесь на меня, чтобы следить за серией технических статей о Vue3.