Исходный код на гитхабе: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
yarn dev
Первый Привет Мир! ! !
/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')
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')
const App = {
template: `
<div class="container">
{{value}}
</div>`,
setup() {
const value = ref(1)
return { value }
}
}
Vue.createApp().mount(App, '#app')
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')
Хорошо, 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, написанный ею, не может быть отлажен.
Thank You
Объем очень большой.Спасибо за терпение.Если есть ошибки в тексте прошу поправить меня.
я
Colin, вы можете отсканировать QR-код ниже, чтобы добавить меня в WeChat, комментарии и обмены.
благодарныйH5 зверь супер эволюция передний конец куриный зверьИсправьте ошибку в статье