предисловие
Связанная грамматика, связанная с Vue2, я считаю, что все уже знают грамматику, и теперь они имеют2020Спустя годы Vue стал настолько популярным интерфейсным фреймворком, почему бы вам не изучить тот, который подходит для фронтенда? Хахахаха 🤣🤣🤣.
Меня начало бросать всю дорогу. Это было мучительное путешествие. Я не знаю, что я испытал до сих пор.vue3.xТут же началось снова, поэтому я тоже сначала протестировал воду и сыграл волну родственной грамматики.
Не говорите чушь, просто зайдите в код и запишите его (т.к. я им не пользовалсяTSТак осуществляется сES6провести)
Начинать
- существует
vue-cli3.0установить подcomposition-apinpm install @vue/composition-api --save # OR yarn add @vue/composition-api - используя любой
@vue/composition-apiПрежде чем предоставлять возможность, ее необходимо установить через Vue.use().
После завершения установки вы можете использовать связанные проекты в проектеimport Vue from 'vue' import VueCompositionApi from '@vue/composition-api' Vue.use(VueCompositionApi)composition-apiРазвивались
Настройка (функция ввода)
setup()функцияvue3, новые свойства, предоставленные специально для компонентов, кажутся такими жеvue2.xсерединаdataтакже необходимо вернутьObjectсодержит самоопределяемыеfunction, computed, watchА также имущество и жизненный цикл.
-
Функция настройки будет выполнена после beforeCreate и до создания.
setup(props, context) { const state = reactive({count: 0}) // 创建数据 return state // 返回页面中使用 } -
перенимать
propsданные- существует
propsОпределите имена параметров, которые текущий компонент позволяет передавать внешнему миру:props: { name: String } - пройти через
setupПервый параметр функции, которая получает данные реквизита:setup(props) { console.log(props.name) }
- существует
-
параметр контекста
setupВторой параметр функции — объект контекста, которыйvue2.xсерединаthis,существуетvue 3.x, они доступны следующим образомsetup(props, context) { context.slots context.emit context.refs }
реактивный и ref (отзывчивые источники данных)
-
reactive()Функция принимает простой объект и возвращает объект данных ответа.Это эквивалентно
vue2.xсерединаVue.observable()функция,vue3.xЗатем есть объект данных, который можно создать непосредственно с помощью функции reactive().-
Импорт по требованию
reactiveсвязанные функцииimport { reactive } from '@vue/composition-api' -
существует
setup()функция называетсяreactive()функция для создания соответствующего отзывчивого объекта данныхsetup() { // 这个类似于vue2中的data()返回的响应式对象 const state = reactive({ count: 0 }) return state } -
существует
templateДоступ к реагирующим данным в<template> <span>当前的count值为:{{count}}</span> </template>
-
-
ref()Функция используется для создания реактивного объекта данных на основе заданного значения,ref()Возвращаемое значение вызова функции — это объект, который содержит только одинvalueАтрибуты.-
Связанный импорт
refсвязанные функцииimport { ref } from '@vue/composition-api' -
Создание реактивных объектов
setup() { const count = ref(0) return { count, name: ref('vue') } } -
существует
templateДоступ к реагирующим данным в<template> <span>{{count}}--- {{name}}</span> </template>
-
-
isRefиспользование ,isRef()Функция в основном используется для определения того, является ли значениеref()Создано из объектов; сценарии: когда нужно расширить возможностьref()Стоит создать, например:import { isRef } from '@vue/composition-api' const fooData = isRef(foo) ? foo.value : foo -
toRefsиспользование,toRefs()функция может бытьreactive()Созданный отзывчивый объект преобразуется в обычный объект, но все узлы атрибутов этого объекта имеют видref()Типы, такие как данные, наиболее распространенные сценарии примененияimport { toRefs, reactive } from '@vue/composition-api' setup() { // 定义响应式数据对象 const state = reactive({ count: 0 }) // 定义页面上可用的事件处理函数 const increment = () => { state.count++ } // 在 setup 中返回一个对象供页面使用 // 这个对象中可以包含响应式的数据,也可以包含事件处理函数 return { // 将 state 上的每个属性,都转化为 ref 形式的响应式数据 ...toRefs(state), // 自增的事件处理函数 increment } }существует
templateможно использовать непосредственно вcountсвойства и соответствующиеincrementметод, если он не используетсяroRefsвозвращаться напрямуюstateтогда вам нужно пройтиstate.xxдля доступа к данным<template> <div> <span>当前的count值为:{{count}}</span> <button @click="increment">add</button> </div> </template>
вычисляемые и наблюдаемые (вычисляемые свойства и мониторинг)
-
computed()используется для создания вычисляемых свойств,computed()Возвращаемое значение функции является экземпляром ref. использоватьcomputedПеред необходимостью импорта по требованию:import { computed } from '@vue/composition-api'-
Создайте вычисляемое свойство только для чтения при вызове
computed()функция, передать вfunctionдля получения вычисляемого свойства, доступного только для чтения.// 创建一个响应式数据 const count = ref(1) // 根据count的值创建一个响应式的计算属性, 它会根据ref自动计算并且返回一个新的ref const computedCount = computed(() => count.value + 1 ) console.log(computedCount.value) // 打印 2 computedCount.value++ //报错 -
Создание вычисляемого свойства для чтения и записи
вызов
computed()При передаче функции, содержащейgetа такжеsetобъект, вы можете получить доступное для чтения и записи вычисляемое свойство.// 创建一个响应式数据 const count = ref(1) // 根据count的值创建一个响应式的计算属性, 它会根据ref自动计算并且返回一个新的ref const computedCount = computed({ get: () => count.value + 1, set: (val) => count.value = val - 1 } ) computedCount.count = 6 console.log(count.value) // 打印 5
2.
watch()Функция используется для отслеживания изменений данных, сvue2.xто же самое вcomputedМетод использования такой же, как и при импорте.apiметодимпортировать перед использованием
import { watch } from '@vue/composition-api'-
Основное использование
const count = ref(0) // 定义watch只要count的值变化,就会触发watch的回调 // watch 会在创建的时候自动调用一次 watch(() => console.log(count.value)) setTimeout(() => { count.value++ }, 1000) -
Мониторинг указанных данных
/ 定义reactive数据源 const state = reactive({ count: 0 }) // 监视 state.count 这个数据节点的变化 watch(() => state.count, (now, prev) => { console.log(now, prev) }) / 定义ref数据源 const count = ref(0) // 监视count这个数据的变化 watch(count, (now, prev) => { console.log(now, prev) })
-
Крючки жизненного цикла
Жизненный цикл в новой версии должен быть импортирован по требованию и может быть записан толькоsetup()в функции.
использоватьonBeforeMount, onMounted, updatedСвязанный жизненный цикл, связанный с импортом перед использованиемapiметод
import { onBeforeMount, onMounted, updated } from '@vue/composition-api'
setup () {
onBeforeMount(() => {
console.log('onBeforeMount!')
})
onMounted(() => {
console.log('onMounted!')
})
updated(() => {
console.log('updated!')
})
}
К каждому методу жизненного цикла относится передачаfunctionфункция.
vue2.xс новой версией Composition APIОтображение отношений между
-
beforeCreate->setup -
created->setup -
beforeMount->onBeforeMount -
mounted->onMounted -
beforeUpdate->onBeforeUpdate -
updated->onUpdated -
beforeDestroy->onBeforeUnmount -
destroyed->onUnmounted -
errorCaptured->onErrorCaptured
предоставлять и вводить (обмен данными)
provide()а такжеinject()Возможна передача данных между вложенными компонентами. Эти две функции можно использовать только вsetup()используется в функции. используется в родительском компонентеprovide()Функции могут передавать данные вниз, используемые в подкомпонентахinject()Прием данных с верхнего уровня.
Код реализации:
корневой компонент (родительский компонент)parent.vue
<template>
<div>
<child-one></child-one>
<child-two></child-two>
</div>
</template>
<script>
import { provide } from '@vue/composition-api'
import ChildOne from '@/components/Child'
import ChildTwo from '@/components/Child'
export default {
components: {
ChildOne,
ChildTwo
},
setup() {
// provide('要共享的数据名称', 被共享的数据)
provide('globalName', 'vue')
}
}
</script>
подкомпонент 1ChildOne.vue
<template>
<div>
<!--页面展示数据globalName -->
{{globalName}}
</div>
</template>
<script>
import { inject } from '@vue/composition-api'
export default {
name: 'ChildOne',
setup() {
const globalName = inject('globalName') 调用 inject 函数时,通过指定的数据名称,获取到父级共享的数据
return {
globalName
}
}
}
</script>
подкомпонент 2ChildTwo.vue
<template>
<div>
<!--页面展示数据globalName -->
{{globalName}}
</div>
</template>
<script>
import { inject } from '@vue/composition-api'
export default {
name: 'ChildTwo',
setup() {
const globalName = inject('globalName') 调用 inject 函数时,通过指定的数据名称,获取到父级共享的数据
return {
globalName
}
}
}
</script>
provideДанные, совместно используемые функциями, могут сделатьrefа такжеreactiveОпределены адаптивные данные, использование аналогично
ссылки на шаблоны (компоненты элементов)
мы знаем, что вvue2.xПолучить элемент страницыDOMв состоянии пройтиrefнаписано на элементе страницы, а затем вjsпрошедший$refs.xчтобы получить текущий элементDOMинформация об элементе, работаDOM,существуетcomposition-apiв котором мы предоставляемrefметод проходит черезnullи определено в элементе страницы с помощьюrefСоответствующий.
Код:
<template>
<div>
<h1 ref="h1Ref">Hello Word</h1>
</div>
</template>
<script>
import { ref, onMounted } from '@vue/composition-api'
export default {
setup() {
// 创建一个 DOM 引用
const h1Ref = ref(null)
// 在 DOM 首次加载完毕之后,才能获取到元素的引用
onMounted(() => {
// 为 dom 元素设置字体颜色
// h1Ref.value 是原生DOM对象
console.log(h1Ref.value)
})
// 把创建的引用 return 出去
return {
h1Ref
}
}
}
</script>
конец
Чувствоватьcomposition-apiВсе они используются в виде импорта, который непосредственно не чувствуется.vue2.xУдобно использовать прямо в 😂. Хотя говорят, что он импортируется по запросу, используйте метод, который вы хотите использовать. по сравнению сvue2.xОчень неудобно внезапно разворачиваться и писать различные методы данных вsetupЕго можно использовать на странице только в том случае, если он экспортирован в функцию ввода. несмотря на то чтоvue2.xОпределенные данные также должны пройтиdataФункция возвращает значение, а затем использует его на странице, но метод не используется, и мониторинг вычисляемых свойств не используется. Может быть, он привыкает к этомуvue2.xРазнообразные методы письма, чувствовать себя разнообразно здорово в использовании. переход кvue3.xэто сейчасcomposition-apiЕще нужно какое-то время.
В конце концов, у меня все еще есть проблема, которую я не решил. Может ли кто-нибудь дать мне идею? Как написать связь между дочерним и родительским компонентами? Предыдущая версия прошла через$emitВыполнил, я нашел этоsetupРодительский компонент, записанный в функции, не может быть получен.
Вставить наконецcomposition-apiофициальная документация