Предисловие:
Я никогда не был в контакте с Vue3. Во время предыдущих летних каникул я воспользовался этой возможностью, чтобы хорошо его изучить. Эта статья представляет собой заметки, которые я сделал перед изучением Vue3. С одной стороны, ведение заметок позволяет мне лучше понять и освоить знание новых возможностей.С другой стороны, я также надеюсь, что вы можете начать работу с Vue3, и вы заработаете, если изучите его самостоятельно.В эпилоге укажите справочные материалы.
Введение в Vue3
проблема, с которой мы сталкиваемся: код сложных компонентов становится сложно поддерживать по мере роста функциональности,Vue3
следует,TypeScript
все больше и больше используется,Vue3
этоTS
Написано, чтобы лучше поддерживатьTypeScript
Это так просто представить здесь
vue2
Подавляющее большинство характеристикVue3
ведь можно использоватьVue
Это прогрессивно
Используйте принцип отзывчивостиProxy
выполнить,v-model
Вы можете передавать параметры и т. д. новые функции
основная работа
использоватьVue3
, то вы должны создатьVue3
проект
Установить vue-кли
# npm
npm install -g @vue/cli
# yarn
yarn global add @vue/cli
Создать проект
использоватьcreate
создание командной строки или с помощьюui
Визуальное создание
для каждогоVue
Они используются так долго, что я не буду говорить, как их создать один за другим.
# create
vue create 项目名
# 可视化
vue ui
Конечно, вы также можете выбратьvite
,vite
Скорость создания немного выше, чем у вышеописанного метода
npm init vite-app 项目名
cd 项目名
npm install
npm run dev
Начало работы с Vue3
Composition API
Vue3
придумалComposition API
существуетVue2.Xмы используемOptionAPIЕсть знакомыеdata
,computed
,methods
,watch
...
существуетVue3
, мы все еще можем использоватьOptionAPIКатегорически не рекомендуется иVue3
смешанное использование
существуетVue2
, мы реализуем функцию, чтобы забивать в разные места, помещаем данные вdata
,computed
метод вmethods
Внутри слишком разрозненно разделение, немного функций ладно, десятки или сотни, это немного...
такVue3
придумалComposition API, это может поставить一个逻辑的代码都收集在一起
писать в одиночкуhook
, а затем повторно представить это, чтобы он не распределял повсюду, и он выглядит очень грязным
Fragment
существует
template
Оболочка корневого элемента больше не требуется в
<template>
<img alt="Vue logo" src="./assets/logo.png" />
<HelloWorld msg="Welcome to Your Vue.js + TypeScript App" />
</template>
На самом деле несколько тегов будут содержаться внутри одного.Fragment
в виртуальном элементе
Преимущества: Уменьшите количество меток, уменьшите использование памяти.
script
разница
приди и посмотри
script
иVue2
разница
<script lang="ts">
import { defineComponent} from 'vue'
export default defineComponent({
name: 'App',
setup() {
return {
// 这里的属性 和 方法 会合并到 data 函数 和 methods 对象里
}
},
})
</script>
- может снова
script
использоватьts
Просто установитеlang
Просто -
defineComponent
метод создания компонента -
export default
Непосредственный экспорт компонента
setup
setup
даComposition API
Вход
setup
исполнительный лист
это вbeforeCreate
выполнить один раз перед,beforeCreate
Задача этого хука — инициализироваться и выполниться перед ним, затемthis
не инициализированthis = undefined
это не пройдетthis
для вызова методов и получения свойств
setup
возвращаемое значение
setup
возвращаетобъект, свойства этого объекта будут такими же, как и в компонентеdata
Объект, возвращаемый функцией,сливаться, метод, который возвращает иmethods
Слияние, его можно использовать прямо в шаблоне после слияния, если есть повторяющееся имя, оно будет использованоsetup
возвращениеАтрибутыиметод,methods
иdata
может получитьsetup
Методы в должны быть объединены, в противном случаеsetup
Не могу получить их свойства и методы, потому что на этот разthis
= undefined
Suspense
компоненты
setup
использоватьasync
/await
нам нужноsetup
возвращает данные, то их точно нельзя использоватьasync
Изменено, это возвращаетpromise
заключается в том, что мы не хотим видеть ситуацию, если мы настаиваемasync
Модификация, мы должны использовать вложенный во внешнем слое его родительского компонентаsuspense
(Не уверен) Встроенные компоненты, которые размещают какие-то неопределенные операции, например, мы можем поставить в него асинхронные компоненты
1. Подкомпоненты
<template>
{{ res }}
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
name: 'Son',
async setup() {
const res = await axios.get('地址')
return {
res,
}
},
})
</script>
2. Родительский компонент
<template>
<Suspense>
<!-- 子组件-->
<Son></Son>
</Suspense>
</template>
setup
параметр
setup
(props
,context
)
setup
Первый параметр в функцииprops
. Он получает значение, переданное родительским компонентом, да, это информация, переданная родительским и дочерним компонентами.props
Второй параметрcontext
Он содержит 3 свойства{ attrs, slots, emit }
, вы должны знать, что представляют собой эти три атрибута, глядя на названия.this.$attrs
,this.$slots
,this.$emit
-
attrs
: Кромеprops
другие объекты в -
slots
: Объект, который родительский компонент передает в содержимое слота -
emit
: и используется для связи между родительскими и дочерними компонентами.
ref
Определить/превратить в реактивный
наверхуsetup
письменные данныене отвечает, измените данные, представление не будет обновляться
существуетVue3
Есть два способа определить адаптивные данные, давайте сначала представимref
Импортироватьref
метод
import { defineComponent, ref } from 'vue'
- Вы можете сначала объявитьбазовый типпеременная как
ref
Формальные параметры проходят через - или непосредственно в
ref
входящий
setup() {
// 方式一
let number1 = ref(10)
let num = 0
// 方式二
let number2 = ref(num)
return {}
},
прийти проверить этоnumber1
что это
То, что можно увидеть,number1
ЯвляетсяRef
объект, мы устанавливаем10
Это значение находится в этом объектеvalue
атрибут
То есть, когда мы модифицируем, мы должны модифицироватьnumber1.value
Даваяvalue
атрибут добавленgetter
/setter
украсть данные
Но когда вы используете его в шаблоне, вам не нужно писатьnumber1.value
написать напрямуюnumber1
Просто
Он автоматически добавляется при компиляции шаблона.value
<template>
{{ number1 }}
<button @click="updateNum">+</button>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue'
export default defineComponent({
name: 'Son',
setup() {
let number1 = ref(10)
// 修改 number1
function updateNum() {
number1.value++
}
return {
number1,
updateNum,
}
},
})
</script>
Это не проблема использовать
просто подчеркнулref
Получать данные базовых типов, может ли он принимать сложные типы,object
типа и т.д., конечно
даватьref
Передача в сложном типе, по сути, это вызовreactive
достигать
reactive
будет упомянуто ниже
ref
получить элемент
такой жеref
Вы также можете использовать элемент get
каждыйVue2.X
Как его получить, сначала определите его на этикетке:ref='XXX'
потомthis.$refs.XXX
получить
существуетVue3
Это немного отличается, чтобы получить элементы на
1. Сначала на элементе шаблона
ref='XXX'
здесь не нужноv-bind
<template>
<div id="haha" ref="haha"></div>
</template>
2. В
setup
середина
должен датьref
Укажите типHTMLElement
setup() {
let haha = ref<HTMLElement|null>(null)
console.log(haha)
return {
haha,
}
},
Если вам нужно использовать в компонентеhaha
, Это должно бытьhaha
return
выйти и слитьсяdata
Посмотрим что напечатают
То, что можно увидеть,haha
ЯвляетсяRef
объект,value
Значение — это элемент, который мы хотим получить
Тогда мы можемhaha
этоDOM
Элемент для работы, такой как этот
haha.style.fontSize = '20px'
reactive
reactive
Реактивный, который принимает простой объект и возвращает этот простой объект代理对象
Верно, нижний слой его использоватьProxy
прокси
Просто напишите адаптивный пример Vue3, чтобы обсудить
Proxy
new Proxy(target, handler)
-
target
: нужно использоватьProxy
Обернутый целевой объект (может быть объект любого типа, включая собственные массивы, функции или даже другой прокси) -
handler
: объект, который обычно имеет функции в качестве атрибутов, и функции в каждом атрибуте определяют прокси при выполнении различных операций.p
// 模拟 Vue data
let data = {
msg: '',
age: '',
}
// 模拟 Vue 的一个实例
// Proxy 第一个
let vm = new Proxy(data, {
// get() 获取值
// target 表示需要代理的对象这里指的就是 data
// key 就是对象的 键
get(target, key) {
return target[key]
},
// 设置值
// newValue 是设置的值
set(target, key, newValue) {
// 也先判断下是否和之前的值一样 节省性能
if (target[key] === newValue) return
// 进行设置值
target[key] = newValue
document.querySelector('#app').textContent = target[key]
},
})
reactive
Основное использование
Импортировать, конечно, при написании,vscode
автоматически импортирует для вас
import { defineComponent, reactive } from 'vue'
Простой в использовании
setup() {
let obj = reactive({
name: '小浪',
age: 21,
})
return {
obj,
}
}
увидеть возвращениеProxy
объект
данные находятся вtarget
середина,
В шаблоне используйте прямой{{obj.name}}
Просто
Изменить непосредственно изменитьobj[name]
=
‘xxx’
При работе с прокси-объектом соответственно изменятся и данные в obj, в то же время, если вы хотите повторно обновить и отрисовать интерфейс при работе с данными, он также является рабочим прокси-объектом.
Отзывчивые данные глубокие (рекурсивный глубокий отклик)
Также реагирует на несколько уровней вложенных данных
setup() {
let obj = reactive({
name: '小浪',
age: 21,
phone: {
p_name: '小米',
p_apps: {
app_name: '小米运动',
},
},
})
function upadateName() {
obj.phone.p_apps.app_name = '掘金'
}
console.log(obj)
return {
obj,
upadateName,
}
},
shallowReactive
Это простой реактив, только объекты на первом слое изменены на реактивные, поэтому я не буду здесь говорить больше.
использовать
ref
входящий объект
setup() {
let obj = ref({
name: '小浪',
age: 21,
})
console.log(obj)
return {
obj,
}
}
в действительностиref
использоватьreactive
работать
toRefs
Этот метод можетreactive
Отзывчивый объект, преобразованный в обычный объект, каждое свойство нормального объектаRef
объект, что гарантируетreactive
Каждое свойство . по-прежнему является адаптивным, и мы также можем декомпозировать каждое свойство для использования, чтобы не было необходимости использовать его в компоненте.объект [свойство], объем кода уменьшен, yyds
setup() {
const user = reactive({
name: '小浪',
age: 21,
})
let userObj = toRefs(user)
console.log(userObj)
return {}
}
может видетьname
иage
сталRef
объект
мы можем разобратьname
иage
Использовать отдельно
setup() {
const user = reactive({
name: '小浪',
age: 21,
})
let userObj = toRefs(user)
return {
...userObj,
}
}
toRef
есть еще одинtoRef
Метод, его роль иtoRefs
Почти, но он может конвертировать только реактивные объекты/обычные объектыопределенныйсобственность становитсяRef
объект
Может использоваться для исходных реактивных объектов на
property
секс создаетref
. Тогда вы можете поставитьref
пройти, тем самым сохранив свой источникproperty
отзывчивое соединение.
export default {
setup(props) {
useSomeFeature(toRef(props, 'foo'))
}
}
function useSomeFeature(foo: Ref) {
// ...
}
Копирует новое значение данных и работает отдельно, и не влияет друг на друга при обновлении
когда ты хочешьprop
изref
При передаче в составную функциюtoRef
Очень полезно
Как видно из официальной документации, используется для передачи данных перед компонентом изprops
выиграть'foo'
атрибуты составных функций, составные функцииuseSomeFeature
, полученный параметрfoo
заRef
тип, достаточно, чтобы использоватьtoRef
для преобразования
Решение
Несколько способов определить, какой вид реактивного создания
1.isRef
: проверить, является ли значение объектом ссылки
let ref1 = ref(1)
console.log(isRef(ref1)) // true
2.isReactive
: Проверить, создан ли объектreactive
Создал реактивный прокси
let ref2 = reactive({name: '小浪'})
console.log(isReactive(ref2)) // true
3.isReadonly
: Проверить, создан ли объектreadonly
Создан прокси только для чтения
let ref3 = readonly({name: '小浪'})
console.log(isReadonly(ref3)) // true
4.isProxy
: Проверить, создан ли объектreactive
илиreadonly
Прокси, созданный по методу
let ref2 = reactive({name: '小浪'})
console.log(isProxy(ref2)) // true
let ref3 = readonly({name: '小浪'})
console.log(isProxy(ref3)) // true
customRef
так много упоминалось вышеRef
Все это встроено в Vue для нас.
мы можем пройтиcustomRef
реализовать наши собственныеRef
Создайте пользовательскую ссылку с явным контролем над ее отслеживанием зависимостей и инициированием обновлений. Требуется фабричная функция, которая получает
track
иtrigger
функция в качестве параметра и должна возвращатьget
иset
Объект.
В официальном документе приведен пример антишейка, напишем и его
<template>
<h2>App</h2>
<input v-model="keyword"/>
<p>{{keyword}}</p>
</template>
<script lang="ts">
import {
customRef
} from 'vue'
// 不确定类型所以这里使用泛型
function useDebouncedRef<T>(value: T, delay = 200) {
// 定时器
let timeout: number
return customRef((track, trigger) => {
return {
get() {
// 告诉Vue追踪数据
track()
return value
},
set(newValue: T) {
clearTimeout(timeout)
timeout = setTimeout(() => {
value = newValue
// 告诉Vue去触发界面更新
trigger()
}, delay)
}
}
})
}
export default {
setup () {
const keyword = useDebouncedRef('')
return {
keyword
}
},
}
</script>
shallowRef
иshallowReactive
Неглубокая отзывчивость, как правило, мало используется, мы используемref
иreactive
более
shallowReactive
Структура объекта вложена в несколько слоев, но нам нужно изменить только самый внешний слой данных, и нам не нужно преобразовывать вложенную структуру внутри в адаптивную.Таким образом, неглубокая отзывчивость используется для повышения производительности и реагирует только самый внешний слой.
Это проще понять, я не буду приводить здесь пример.
shallowRef
мы сказали раньшеref
Вы также можете передать объект, но на самом деле вызватьreactive
возвращениеProxy
Прокси-объект, если во внутреннем слое есть объекты, все равно используйтеreactive
обрабатывать
ref({ name: '小明' })
// 实际上是调用 reactive 去完成的,把 ref的 value 当作 key ,value的值,当作 key 的值 给 reactive
reactive({ value: { name: '小明' } })
такой жеshallowRef
обрабатывать тип объекта, передатьshallowReactive
заканчивать
shallowRef({ name: '小明' })
// 实际上是调用 reactive 去完成的,把 ref的 value 当作 key ,value的值,当作 key 的值 给 reactive
shallowReactive({ value: { name: '小明' } })
Таким образом, мы поймем, зачем иметь дело только сvalue
отзывчивый, без возраженийreactive
Обработка данных, которые будут заменены
【注意】
:shallowRef
Создаватьref
, будет отслеживать егоvalue
изменить операцию, но это не влияет на измененнуюvalue
Сделать реактивное преобразование прокси
setup() {
let info1 = ref({
name: '小浪',
notebook: {
name: '小米笔记本',
},
})
let info2 = shallowRef({
name: '小明',
notebook: {
name: '小米笔记本',
},
})
console.log(info1, info2)
return {
info1,
info2,
}
},
Давайте напечатаем следующие два объекта
То, что можно увидеть,Ref
изvalue
значение используетсяreactive
возвращениеProxy
объект,
shallowRef
изvalue
это обычный объект
readonly
иshallowReadonly
readonly
только глубокое чтение
Установите обычные объекты или реагирующие объекты как доступные только для чтения и не могут быть изменены. Вы можете увидеть глубину, посмотрев на имя выше. Все знают концепцию глубины. Рекурсивно установите каждый атрибут внутреннего слоя только для чтения и продолжите модификацию операция сообщит об ошибке, что повышает безопасность
Основное использование:
Импортируйте то, что вы используете
import { defineComponent, readonly } from 'vue'
Конечно же, он выдал ошибку перед компиляциейError
: 无法分配到 "name" ,因为它是只读属性
И внутренний, и внешний слои доступны только для чтения и глубоко обнаруживаются.
shallowReadonly
мелкий только для чтения
Если он неглубокий, то только для самого внешнего слоя и не заботится о внутреннем слое.
Вы можете увидеть пример ниже, только внешний слойname
Сообщить об ошибке, ошибки при изменении внутреннего слоя нет
toRaw
иmarkRaw
Эти два используются меньше
Я просто пройдусь по этому здесь
toRaw
: преобразовать реактивный объект в обычный объект.
Простой в использовании:
setup() {
let info1 = reactive({
name: '小浪',
notebook: {
name: '小米笔记本',
},
})
const rawInfo = toRaw(info1) // 返回普通对象
console.log(info1)
console.log(rawInfo)
return {}
},
Два распечатаны, один реактивный объект, черезtoRaw
После превращения в обычный объект
markRaw
: пометить объект, чтобы он никогда не превратился в реактивный объект, возвращаемое значение само
Например: некоторые неизменяемые данные, мертвые данные и некоторые экземпляры сторонних классов не нужно преобразовывать в реагирующие объекты для повышения производительности.
Простой в использовании:
Здесь используются два одинаковых объекта, один дляmarkRaw
обработка, никто не продолжаетmarkRaw
иметь дело с
затем используйте тот жеreactive
реагировать
setup() {
let obj = {
name: '小浪',
notebook: {
name: '小米笔记本',
},
}
// 进行标记
let markRawObj = markRaw(obj)
// 尝试转为响应式
let reactObj = reactive(markRawObj)
let obj2 = {
name: '小浪',
notebook: {
name: '小米笔记本',
},
}
// 转为响应式
let reactObj2 = reactive(obj2)
console.log(reactObj)
console.log(reactObj2)
return {}
}
Вы можете посмотреть распечатанные, отмеченныеobj
не превратился вProxy
реактивный прокси-объект
computed
вычисляемое свойство
существуетVue3
используется вcomputed
иVue2.X
что-то другое, здесьcomputed
это метод
Сначала вам нужно импортировать
computed
метод
import { defineComponent, computed } from 'vue'
Параметр является обратным вызовом, по умолчанию
get
<template>
<div class="box">
<input type="text" v-model="name" />
<br />
<input type="text" v-model="age" />
<br />
<input type="text" v-model="getInfo" />
</div>
</template>
setup() {
let name = ref('小浪')
let age = ref(21)
//计算属性
let getInfo = computed(() => {
return `我的名字:${name.value},今年${age.value},请多多指教`
})
return {
name,
age,
getInfo,
}
}
здесь не реализованоset
метод, поэтому изменение следующего бесполезно
параметр являетсяобъектПишите здесь
get
set
Шаблон тот же, что и выше
setup() {
let name = ref('小浪')
let age = ref(21)
let getInfo = computed({
// get 方法
get() {
return `${name.value},${age.value}`
},
// set 方法
set(val: string) {
let arr = val.split(',')
name.value = arr[0]
age.value = parseInt(arr[1])
},
})
return {
name,
age,
getInfo,
}
watch
слушатель
Аналогично использованию Watch в Vue2.X.
вводить
watch(data,handler,object)
-
data
: может быть возвращаемым значениемgetter
функция илиref
-
handler
:Перезвони -
object
: необязательный элемент конфигурации{ immediate: true }
вводить
import { defineComponent, watch } from 'vue'
data
дляref
Аргументы функции обратного вызова (новое значение, старое значение)
setup() {
let name = ref('小浪')
let age = ref(21)
let watchName = ref('')
watch(name, (newName, oldName) => {
watchName.value = `我是新姓名${newName}
我是老姓名${oldName}`
})
return {
name,
age,
watchName,
}
},
Видно, что третья колонка страницы не отображается, т.к.name
Значение не изменилось, поэтому менять его не нужно,watch
Третий параметр — это объект конфигурации, которому мы можем задать выполнение сразу{ immediate: true }
будет выполнен один раз, конечно на этот разoldName
заundefined
watch(
name,
(newName, oldName) => {
watchName.value = `我是新姓名${newName}
我是老姓名${oldName}`
},
{ immediate: true }
)
data
дляgetter
watch(()=>haha,(newName, oldName)=>{
// 处理...
})
()=> haha
возвращает значение напрямую, эквивалентноеgetter
стенография,haha
могут быть не отвечающие данные
data
для несколькихref
Шаблон тот же, что и раньше
<template>
<div class="box">
<input type="text" v-model="name" />
<br />
<input type="text" v-model="age" />
<br />
<input type="text" v-model="getInfo" />
</div>
</template>
Мы можем поставить несколькоref
в массив
newNameAndAge
,oldNameAndAge
содержит новое и старое [имя, возраст] для массива
setup() {
let name = ref('小浪')
let age = ref(21)
let watchName = ref('')
watch(
[name, age],
(newNameAndAge, oldNameAndAge) => {
watchName.value = `new: ${newNameAndAge}
old: ${oldNameAndAge}`
},
{ immediate: true }
)
return {
name,
age,
watchName,
}
},
data
заreactive
setup() {
let user = reactive({
name: '小浪',
age: 21,
})
let watchInfo = ref('')
watch(
user,
(newInfo, oldInfo) => {
console.log(newInfo === oldInfo) // true
}
)
}
Вот объект, который пойдет не так, сразу после выполнения,
Если добавлено, выполнить немедленно, за исключением первого разаnewInfo
за{name: '小浪',age: 21}
oldInfo
заundefined
,послевсегда возвращает текущее значение этого объекта
такnewInfo
= oldInfo
Для этой проблемы мы должны добавить объект конфигурации{deep: true}
Проведите глубокую проверку
Обнаружение глубины также может определять множественное вложение
watch(
user,
(newInfo, oldInfo) => {
console.log(newInfo === oldInfo) // false
},
{ deep: true }
)
watchEffect
Это также используется для мониторинга изменений данных, оно будет выполнено один раз по умолчанию, поэтому здесь не требуется никакой настройки, и не нужно указыватьdata
, какие ответные данные использовать для мониторинга
let user = reactive({
name: '小浪',
age: 21,
})
// 只有 user.name 发生改变这个就会执行
watchEffect(() => {
console.log(user.name)
});
provide / inject
Предоставление и введение просты для понимания
Реализовать связь между межуровневыми компонентами (внуками)
Используется в многоуровневых вложенных компонентах, нет необходимости передавать данные вниз слой за слоем
Может реализовать межуровневую коммуникацию компонентов
в родительском компоненте
setup() {
const info = reactive({
title: 'Vue3学习'
date: '2021/7/23'
})
// 提供数据 提供的数据名,数据值
provide('info', info)
return {
info
}
}
Его можно получить, используя инъекцию в компоненте уровня потомка.
setup() {
//获取对应数据的值
const color = inject('info')
return {
info
}
}
Teleport
компонент доставки
Этот компонент особенно интересен, вы можете перенести компонент
<teleport v-if="flag" to=".test">
<div class="dog">狗子</div>
</teleport>
to
это адрес целиbody
, #XXX
, .XXX
все этоcss
Селектор
Напишите пример ниже и вы все поймете
шаблон
<template>
<ul>
<li class="li_1"></li>
<li class="li_2"></li>
<li class="li_3"></li>
</ul>
<teleport :to="target">
<img src="https://img0.baidu.com/it/u=3077713857,1222307962&fm=26&fmt=auto&gp=0.jpg" />
</teleport>
<div class="btnGroup">
<button @click="target = '.li_1'">传送1</button>
<button @click="target = '.li_2'">传送2</button>
<button @click="target = '.li_3'">传送3</button>
</div>
</template>
setup
setup() {
// target
let target = ref('.li_1')
return {
target,
}
},
Управление нажатием кнопкиteleport
отображать ли,teleport
После рендеринга он будет запущен вli
под
Vue3
жизненный цикл
Vue2.X
соответствоватьVue3
Объединение API
Vue2.X |
Vue3 |
|
---|---|---|
beforeCreate | ---> | setup() |
created | ---> | setup() |
beforeMount | ---> | onBeforeMount |
mounted | ---> | onMounted |
beforeUpdate | ---> | onBeforeUpdate |
updated | ---> | onUpdated |
beforeDestroy | ---> | onBeforeUnmount |
destroyed | ---> | onUnmounted |
activated | ---> | onActivated |
deactivated | ---> | onDeactivated |
errorCaptured | ---> | onErrorCaptured |
onRenderTriggered | ||
onRenderTracked |
Как можно видеть
beforeCreate
иcreated
Его все еще можно нормально использовать в Vu3, в Vue3 мы можем использовать лучше и быстрее.setup
заменять
on
Начало жизненного цикла должно пройтиimport
импорт, вsetup
используется в функции
Vue3
коэффициент жизненного циклаVue2.X
быстрый жизненный цикл
Например:onBeforeMount
СравниватьbeforeMount
быстрый другой такой же
Есть также еще два крючка:
-
onRenderTriggered
Вызывается при отслеживании повторного рендеринга виртуальной модели DOM. -
onRenderTracked
Вызывается, когда запускается повторный рендеринг виртуального DOM.
ГлобальныйAPI
перечислить
Vue2.X
серединаVue
Глобальный API выше, например, пользовательские директивыVue.directive
, глобальная компонентаVue.component
Изменения были внесены в Vue3 и больше не доступныVue
, но предоставитьapp
Конкретные изменения можно увидеть ниже
Vue2.X | Vue3 |
---|---|
Vue.config | app.config |
Vue.config.productionTip | Удалить |
Vue.config.ignoredElements | app.config.isCustomElement |
Vue.component | app.component |
Vue.directive | app.directive |
Vue.mixin | app.mixin |
Vue.use | app.use |
Vue.prototype | app.config.globalProperties |
new Vue().$mount('#app') | createApp(App).mount('#app') |
Эпилог
На данный момент мы в основном знаемVue3
некоторые особенности
- Новый инструмент для строительных лесов
vite
- существует
Vue3
все еще поддерживаетсяVue2
большинство функций в -
Vue
комбинацияAPi
вместоVue2
серединаoption API
, та же логика централизована, а переиспользование сильнее -
Vue3
использоватьTS
Напишите лучше поддержку ТС -
Vue3
использоватьProxy
вместоVue2
серединаObject.defineProperty()
Внедряйте принципы гибкости - Введены новые компоненты:
Fragment
Teleport
Suspense
здесь не упоминаетсяVue3
переписанныйвиртуальный DOM, что повышает производительность
Я надеюсь, что эта заметка поможет вам.Если я не понимаю, что я написал, я должен прочитать подробности.官方文档
yyds, школа недавно началась, и в школе много дел...
(о゜▽゜)о☆
Использованная литература: