Исходный код на гитхабе:vue-next
предисловие
Поскольку vue не совместим с демо в тексте после обновления, позвольте мне еще раз объяснить, что все содержание этой статьи основано на3.0.0-alpha.1
Версия написана, друзья, обратите внимание на следующую версию при изучении
Какие изменения в Vue3 по сравнению с Vue2?
- Object.defineProperty => Proxy
- Рефакторинг виртуального DOM
- OptionApi => Composition API
Как отлаживать (пропустите, чтобы создать проект с помощью vite [2020.6.1])
Сначала загрузите последний код на GitHub.
$ git pull https://github.com/vuejs/vue-next.git
$ cd vue-next && yarn
После завершения загрузки откройте код и откройте исходную карту.
1. tsconfig.json
Измените поле sourceMap наtrue
rollup.config.js
В середине типаoutput.sourcemap = true
3.yarn dev
4. Создайте демонстрационный каталог в корневом каталоге для хранения примера кода и создайте файлы html и js в демонстрационном каталоге и импортируйте созданный файл vue.
Первый Привет Мир! ! !
/demo/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.container {
text-align: center;
font-size: 24px;
padding: 32px;
}
</style>
<script src="../packages/vue/dist/vue.global.js"></script>
</head>
<body>
<div id="app"></div>
</body>
<script src="./index.js"></script>
</html>
/demo/index.js
const { reactive } = Vue
var App = {
template: `
<div class="container">
{{message}}
</div>`,
setup() {
const state = reactive({message: "Hello World!!!"})
return {
...state
}
}
}
Vue.createApp().mount(App, '#app')
Открываем написанный нами html файл в браузере,
Серверная среда здесь используетserve
Создано библиотекой, если интересно, можете посмотреть на нееserve
в любом случае, давайте посмотрим наши/demo/index.js
файл, как видите, мы использовалиsetup, reactive
и другие функции, это то, что делает Vue3Composition API
, по сравнению с компонентами Vue2, 3 позволяет нам легко создавать отзывчивое веб-приложение на основе Vue3, комбинируя API. Ниже я подробно объясню эти API в демонстрациях одну за другой.
Далее, давайте реализуем демонстрацию двусторонней привязки! ! !
Демонстрация двусторонней привязки
const { reactive } = Vue
let App = {
template: `
<div class="container">
<input v-model="state.value"/>{{state.value}}
</div>`,
setup() {
const state = reactive({ value: '' })
return { state }
}
}
Vue.createApp().mount(App, '#app')
setupДля чего это? ?setup на самом деле является точкой входа компонента, он запускается при создании экземпляра компонента, после определения свойства props, он фактически эквивалентен версии 2.beforeCreate
а такжеCreated
эти два жизненных цикла.
setup принимает два параметра, первый параметрprops, другой параметрcontext, так что когда вы используете 2.0, вы привыкли кthisСпособ получения атрибутов ниже, в vue3.0, становится:
setup(props, ctx) {
console.log(props, ctx)
}
Однако вы все равно можете использовать значение свойства props прямо в шаблоне, например:
let Child = {
template: `<div>{{title}}</div>`,
setup(props, context) {
console.log(props)
}
}
let App = {
template: `
<div class="container">
<Child title="test props"/>
</div>`,
components: { Child }
}
Vue.createApp().mount(App, '#app')
Этоreactive? ? ? использовался раньшеdataШерстяная ткань? ? ?В Vue3 мы можем превращать данные в реагирующие объекты посредством реактивной обработки, которые используются для данных рендеринга шаблонов, Конечно, обратная совместимость Vue по-прежнему позволяет нам использовать данные, но поскольку у Vue3 есть новый способ записи, почему бы не попробовать?
Демонстрация счетчика
const { reactive, toRefs } = Vue
let App = {
template: `
<div class="container">
count: {{count}}
<button @click="handlerCountAdd"> Click ++ </button>
</div>`,
setup() {
const state = reactive({ count: 0 })
const handlerCountAdd = () => {
state.count++
}
return { ...toRefs(state), handlerCountAdd }
}
}
Vue.createApp().mount(App, '#app')
этоtoRefsДа? ? ? ? ? ? ? ? ? ? ?Перед этим я хотел бы сказать, что в соответствии с предложением ref, ref vue3 дает нам возможность создать единый отзывчивый объект, после чего возврат в функцию настройки может быть доступен непосредственно в шаблоне, например:
const App = {
template: `
<div class="container">
{{value}}
</div>`,
setup() {
const value = ref(1)
return { value }
}
}
Vue.createApp().mount(App, '#app')
Вы можете видеть, что vulue был отображен на странице.
упомянутое вышеreactive
Если созданный адаптивный объект доступен в шаблоне, вам необходимоstate.xxx
, пример:
const App = {
template: `
<div class="container">
{{state.value}}
</div>`,
setup() {
const state = reactive({ value: 'reactive' })
return { state }
}
}
Vue.createApp().mount(App, '#app')
Доступ к свойствам таким образом, предоставляемый vue3, немного проблематичен.toRefs
Именно для того, чтобы решить эту проблему для нас, toRefs разбивает набор реактивных объектов на один реактивный объект, доступ к которому можно получить непосредственно в шаблоне, и:
const App = {
template: `
<div class="container">
{{value}}
</div>`,
setup() {
const state = reactive({ value: 'reactive' })
return toRefs(state)
}
}
Vue.createApp().mount(App, '#app')
демонстрация обратной строки
let App = {
template: `
<div class="container">
value: <input v-model="value"/>
<br/>
rvalue: {{rvalue}}
</div>`,
setup() {
const state = reactive({
value: '',
rvalue: computed(() =>
state.value
.split('')
.reverse()
.join('')
)
})
return toRefs(state)
}
}
Vue.createApp().mount(App, '#app')
В этой демонстрации мы используемcomputed
Вычисляемые свойства реализуют функцию обращения строк.Хотя эта функция проста, она очень мощная.Как сказано на официальном сайте Vue: для любой сложной логики вы должны использовать вычисляемые свойства.
данные реагируют
Как мы все знаем, решение, реагирующее на данные, в Vue 3 было заменено Proxy из Object.defineProperty в Vue 2. Выше я упомянул некоторые API, реагирующие на данные, но до сих пор нет упоминания об эффекте и наблюдении. важная часть отзывчивости, часы и вычисления основаны на эффекте, давайте взглянем на код ниже
let App = {
template: `
<div class="container">
count: {{count}}
<button @click="handlerCountAdd"> Click ++ </button>
</div>`,
setup() {
const state = reactive({ count: 0, value: 1 })
const handlerCountAdd = () => {
state.count++
}
watch(
() => state.count,
val => {
console.log('watch', state.count)
console.log('watch', state.value)
}
)
effect(() => {
console.log('effect', state.count)
console.log('effect', state.value)
})
return { ...toRefs(state), handlerCountAdd }
}
}
Vue.createApp().mount(App, '#app')
Код реализован на основе приведенной выше демонстрации счетчика. Вы можете видеть, что когда мы нажимаем кнопку ++, как эффект, так и часы могут отслеживать изменения наших данных, чтобы выполнять соответствующие операции в соответствии с бизнесом. Когда вы видите это, у вас может возникнуть вопрос, то есть, поскольку и эффект, и часы могут отслеживать изменения данных, в чем разница между ними?
Во-первых, эффект будет выполняться при изменении реагирующих данных, а количество исполнений зависит от количества реагирующих данных, например
let App = {
template: `
<div class="container">
<button @click="handlerCountAdd"> Click ++ </button>
</div>`,
setup() {
const r = ref(1)
const s = ref(1)
const t = ref(1)
const handlerCountAdd = () => {
r.value *= 1
s.value *= 2
t.value *= 3
}
effect(() => {
console.log('effect', [r.value, s.value, t.value])
})
return { handlerCountAdd }
}
}
Vue.createApp().mount(App, '#app')
Как показано на рисунке выше: Мы нажимаем один раз, чтобы обновить три ссылки одновременно, и эффект будет выполнен три раза.
Часы затем щелкните один раз, это только запускает выполнение
let App = {
template: `
<div class="container">
<button @click="handlerCountAdd"> Click ++ </button>
</div>`,
setup() {
const state = reactive({ count: 0, value: 1 })
const r = ref(1)
const s = ref(1)
const t = ref(1)
const handlerCountAdd = () => {
r.value *= 1
s.value *= 2
t.value *= 3
}
watch([r, s, t], val => {
console.log('watch', val)
})
return { handlerCountAdd }
}
}
Vue.createApp().mount(App, '#app')
Исходный код vue3 Watch находится вздесьЗаинтересованные партнеры могут изучить
Хорошо, vue3Composition Api
Некоторые из часто используемых функций используются в демонстрации выше.Далее давайте сравним изменения в функциях жизненного цикла 2 и 3.
Vue2 | Vue3 |
---|---|
beforeCreate | установка (альтернативный вариант) |
created | установка (альтернативный вариант) |
beforeMount | onBeforeMount |
mounted | onMounted |
beforeUpdate | onBeforeUpdate |
updated | onUpdated |
beforeDestroy | onBeforeUnmount |
destroyed | onUnmounted |
errorCaptured | onErrorCaptured |
Советы: почему бы не запускать yarn dev напрямую, а сначала включить sourceMap?
Хотя Vue официально говорит, что вы можете напрямую запустить run dev для его отладки, но после запуска этой команды это сгенерированный код, а исходный код ts, написанный ею, не может быть отлажен.
После того, как исходная карта включена, соответствующий файл исходной карты будет сгенерирован во время компиляции, а затем вы можете с радостью использовать точки останова в браузере для отладки исходного кода Vue.Thank You
Объем очень большой.Спасибо за терпение.Если есть ошибки в тексте прошу поправить меня.
я
Colin
, вы можете отсканировать QR-код ниже, чтобы добавить меня в WeChat, комментарии и обмены.
благодарныйH5 зверь супер эволюция передний конец куриный зверьИсправьте ошибку в статье