Предисловие:
Я никогда не был в контакте с 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метод, поэтому изменение следующего бесполезно
параметр являетсяобъектПишите здесь
getset
Шаблон тот же, что и выше
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()Внедряйте принципы гибкости - Введены новые компоненты:
FragmentTeleportSuspense
здесь не упоминаетсяVue3переписанныйвиртуальный DOM, что повышает производительность
Я надеюсь, что эта заметка поможет вам.Если я не понимаю, что я написал, я должен прочитать подробности.官方文档yyds, школа недавно началась, и в школе много дел...
(о゜▽゜)о☆
Использованная литература: