Я не нашел хорошего ресурса по расширению компонентов Vue.js.В каждом проекте, над которым я работал, независимо от используемой библиотеки компонентов пользовательского интерфейса, есть базовые компоненты приложения, которые расширяют компоненты библиотеки пользовательского интерфейса для обеспечения соблюдения стандартов и стандартов компании / приложения.
Я пытаюсь расширитьVue-Multiselect: https://vue -multiselect.js.org / , который имеет около 30 реквизитов и 12 слотов.Компонент, который я расширяю, не имеет значения - я упоминаю об этом только потому, что в идеале я не хочу повторять 30 пропов и 12 слотов в моей реализации.
Я просто хочу внести два изменения вПоведение компонента:
Сделать disabled
более умным для поддержки
Компонент Vue-Multiselect имеет стандартную disabled
поддержку, которая работает как положено:
<Multiselect :disabled="isDisabled" ...>
В нашем приложении у нас есть глобальное состояние в Vuex, которое определяет, доступно ли приложение только для чтения.Чего я хочу избежать, так это требовать, чтобы разработчики передавали это состояние в каждое поле формы:
<Multiselect :disabled="readOnly || isDisabled" ...>
<OtherComponent :disabled="readOnly || someOtherCondition" ...>
...
Таким образом, пользователь моего базового компонента должен заботиться только о своем локальном состоянии пользовательского интерфейса, которое влияет на отключенное состояние:
<BaseCombo :disabled="!emailValid" ...>
Это будет обрабатывать 90% полей форм, которые заблокированы, когда приложение доступно только для чтения, и я могу использовать дополнительную опору для случаев, когда мы хотим игнорировать глобальный статус только для чтения..
<BaseCombo :disabled="!emailValid" :ignoreReadOnly="true" ...>
Укажите значения по умолчанию
Во-вторых, я просто хочу переопределить некоторые значения проп по умолчанию.Этот пост посвящен вопросу предоставления значений по умолчанию:
https://stackoverflow.com/a/52592047/695318
И это прекрасно работало, пока я не попытался изменить поведение отключенного пропеллера, о котором я упоминал ранее.
Моя попытка решить эту проблему состояла в том, чтобы либо обернуть, либо расширить компонент.Я действительно хотел бы избежать повторного выделения всех реквизитов, если это возможно.
<template>
<Multiselect
:disabled="myCustomDisabled"
:value="value"
@input="$emit('input', $event)"
:options="options"
:label="label"
:track-by="trackBy"
:placeholder="placeholder"
... repeat for all 30 options
<script>
import Multiselect from 'vue-multiselect'
export default {
name: "BaseCombo",
extends: Multiselect, // extend or simply wrap?
computed: {
myCustomDisabled() {
this.props.disabled || ... use disabled from Vuex state
}
},
props: {
disabled: Boolean,
placeholder: {
type: String,
default: 'My Default Value',
},
... repeat for all props
Проблема, с которой я столкнулся, заключается в том, что я не знаю, как обращаться с слотами .Пользователь этого BaseCombo должен все еще иметь возможность использовать все 12 слотов в компоненте VueMultiselect.
Есть ли лучшее решение для расширения компонентов?