Изучайте знание Vue каждый день
Особенности функционального компонента:
- никакое состояние не управляется
- Не прослушивание переданного ему состояния
- нет методов жизненного цикла
- Это просто функция, которая получает некоторые реквизиты
Отмечаем как функциональные такие компоненты:
- нет статуса==Нет данных ответа
- нет экземпляра==нет этого контекста
Преимущества функциональных компонентов:
- Низкие накладные расходы на рендеринг, потому что функциональные компоненты — это просто функции;
Базовое написание функциональных компонентов:
{
functional: true,
// Props 是可选的
props: {
// ...
},
// 为了弥补缺少的实例
// 提供第二个参数作为上下文
render: function (createElement, context) {
// ...
}
}
Все, что вам нужно, передается через параметр Context, который представляет собой объект, содержащий следующее поле:
- реквизит: объект, предоставляющий все реквизиты
- Children: массив дочерних узлов VNode
- слоты: функция, которая возвращает объект, содержащий все слоты
- scoptedSlots: (2.6.0) Объект, отображающий переданные слоты с областью видимости, а также обычные слоты как функцию.
- данные: передать весь компонент компонентаобъект данных, переданный в компонент как второй параметр createElement
- parent: ссылка на родительский компонент
- listeners:(2.3.0+) Объект прослушивателя событий, который содержит: все родительские компоненты являются предками текущего компонента, который является псевдонимом data.on
- инъекции: (2.3.0+) Если используется опция инъекции, объект содержит: свойства, которые должны быть внедрены;
Сценарий использования 1: Компоненты-оболочки
-
Вместо этого программно выберите один из нескольких компонентов для рендеринга;
-
Манипулировать дочерними элементами, реквизитами, данными перед передачей их дочерним компонентам; Вот пример компонента смарт-списка, который отображает более конкретные компоненты от имени переданного значения реквизита:
var EmptyList = { /* ... */ } var TableList = { /* ... */ } var OrderedList = { /* ... */ } var UnorderedList = { /* ... */ } Vue.component('smart-list', { functional: true, props: { items: { type: Array, required: true }, isOrdered: Boolean }, render: function (createElement, context) { function appropriateListComponent () { var items = context.props.items if (items.length === 0) return EmptyList if (typeof items[0] === 'object') return TableList if (context.props.isOrdered) return OrderedList return UnorderedList } return createElement( appropriateListComponent(), context.data, context.children ) } })
Сравнение slots() и дочерних элементов
анализировать:
Это очевидно из буквального значения:
-
детей, вы можете получить все дочерние узлы текущего узла компонента;
-
Функция slots() возвращает все объекты слотов; Пример:
<my-functional-component> <p v-slot:foo> first </p> <p>second</p> </my-functional-component>
Для приведенного выше примера компонента:
- дети дадут вам два тега абзаца;
- slots().default будет передавать только второй анонимный тег абзаца
- slots().foo передаст первый именованный тег абзаца
Суммировать:
- Вы можете использовать slots(), чтобы компоненты знали о механизме слотов, или просто передавать дочерние элементы другим компонентам для обработки.