Что такое функциональный компонентОн не управляет никаким состоянием, он не прослушивает переданное ему состояние и не имеет методов жизненного цикла, это просто функция, которая принимает некоторые реквизиты. Проще говоря一个无状态和无实例的组件
Основное письмо:
Vue.component('my-component', {
functional: true,
// Props 是可选的
props: {
// ...
},
// 为了弥补缺少的实例
// 提供第二个参数作为上下文
render: function(createElement, context) {
// ...
}
})
.vue однофайловая запись компонента
<template functional>
...
</template>
Поскольку функциональные компоненты неthis, параметр зависит отcontextДля прохождения объект со следующими полями:
-
props: предоставить всеpropОбъект -
children:VNodeмассив дочерних узлов -
slots: функция, которая возвращает объект, содержащий все слоты -
scopedSlots: (2.6.0+) Объект, раскрывающий переданный слот с областью действия. Также предоставляет обычные слоты как функции. -
data: передать весь объект данных компонента, какcreateElementВторой параметр входящего компонента -
parent: ссылка на родительский компонент -
listeners: (2.3.0+) Объект, содержащий все прослушиватели событий, зарегистрированные родительским компонентом для текущего компонента. Этоdata.onпсевдоним . -
injections: (2.3.0+) Если используется опция вставки, этот объект содержит свойства, которые должны быть вставлены.
навыки и умения
Следующее резюме основано на использовании<template>Проблемы, возникающие при разработке функциональных компонентов с тегами
attr и использование слушателя
Обычно, когда мы разрабатываем компоненты, мы будем использовать свойства и события для передачи операций.v-bind="$attrs"а такжеv-on="$listeners". Способ написания функциональных компонентов отличается.attrsсвойства интегрированы вdataсередина.
<template functional>
<div v-bind="data.attrs" v-on="listeners">
<h1>{{ props.title }}</h1>
</div>
</template>
привязка класса и стиля
При введении функциональных компонентов непосредственное связывание внешнего слояclassимя класса иstyleНедопустимый стиль.data.classУказывает на динамическую привязкуclass, data.staticClassэто означает, что привязка является статическойclass, data.staticStyleпривязан к встроенным стилям
TitleView.vue
<template functional>
<div :class="[data.class, data.staticClass]" :style="data.staticStyle">
<h1>{{ props.title }}</h1>
</div>
</template>
Test.vue
<template>
<title-view
:class="{title-active: isActive}"
style="{ color: red }"
title="Hello Do"
/>
</template>
введение компонента
Функциональные компоненты представляют другие компоненты следующими способами, для специальной справки:GitHub.com/vUEJS/vUE/i…
<template functional>
<div class="tv-button-cell">
<component :is="injections.components.TvButton" type="info" />
{{ props.title }}
</component>
</div>
</template>
<script>
import TvButton from '../TvButton'
export default {
inject: {
components: {
default: {
TvButton
}
}
}
}
</script>
$options вычисляемое свойство
иногда нужно модифицироватьpropисточник данных, использованиеVueкоторый предоставил$optionsсвойство, вы можете получить доступ к этому специальному методу.
<template functional>
<div v-bind="data.attrs" v-on="listeners">
<h1>{{ $options.upadteName(props.title) }}</h1>
</div>
</template>
<script>
export default {
updateName(val) {
return 'hello' + val
}
}
</script>
Суммировать
Хотя скорость и производительность являются преимуществами функциональных компонентов, это не означает, что ими можно злоупотреблять, поэтому ее нужно выбирать и взвешивать в соответствии с реальной ситуацией. Например, в некоторых компонентах дисплея. Например,buttons,tags, cards, или если страница представляет собой статический текст, то функциональные компоненты хорошо подходят.