Первоначально скрыть первую группу в повторяемой группе Vue-Formulate
Я использую повторяющиеся группы Vue-Formulate. Для моих требований:
- Группу добавлять необязательно
- Если для добавления группы нажимается кнопка, то поля в группе должны быть проверены.
- Форма не должна изначально отображать группу; он должен показать кнопку для добавления группы
Например, желаемый исходный вид показан на следующем снимке экрана, который я создал после нажатия кнопки "удалить" / X в связанном поле кодов:
Я смоделировал это в codeandbox здесь: Vue Formulate Group с кнопкой для запуска
Это возможно? Если да, то как?
Исследования - Документы Vue-Formulate
В документации Vue-Formulate поinput
с участием type="group"
реквизита и слотов, естьminimum
опора Я установил его на ноль, но это не меняет первоначального вида. Я вижу несколько слотов, но я не совсем уверен, какой из них использовать, и могу ли я использовать любой из них для достижения того, чего хочу; кажется, чтоdefault
, grouping
, а также repeatable
может быть полезно для предотвращения первоначального отображения первой группы.
Исследования - тесты Vue-Formulate
я вижу это FormulateInputGroup.test.js
тесты, которые it('repeats the default slot when adding more'
, Итак default
слот - это контент, который повторяется. Согласно документам,default
слот также получает index
в качестве опоры слота, так что это может быть полезно.
Исследования - Vue Debugger
Элемент, который я хочу изначально удалить, находится по адресу FormulateInputGroup > FormulateGrouping > FormulateRepeatableProvider > FormulateRepeatable > FormulateInput
:
Когда я удаляю исходный элемент, чтобы он соответствовал желаемому исходному макету, иерархия групп изменяется на:
<FormulateInput><!-- the input type="group" -->
<FormulateInputGroup>
<FormulateGrouping/>
<FormulateAddMore>...</FormulateAddMore>
</FormulateInputGroup>
</FormulateInput>
Исходя из этого изменения, я ожидал, что мне нужно изменить FormulateGrouping
чтобы получить желаемый исходный вид, но я не нашел в источнике, какие предметы мне там доступны.
Исследование: хак, который, кажется, работает
В смонтированном хуке, когда я впервые визуализирую форму, я могу погрузиться в самоанализ. formValues
перешел к v-model
чтобы увидеть, не хватает ли группе начальных элементов, которые заполняются. Если да, то я могу воспользоваться ссылкойmsgs
на FormulateInput
группы типов для последующего вызова this.$refs.msgs.$children[0].$children[0].removeItem()
, который запускает первоначальное удаление (пустого) элемента. Это супер хаки, поэтому я бы предпочел способ получше, но он вроде работает. Единственная проблема заключается в том, что он проверяет поля при нажатии на кнопку до того, как был введен какой-либо ввод.
3 ответа
Это справедливый вопрос, и Vue Formulate использовался для поддержки поведения простого использования пустого массива для начала, однако стало ясно, что пользователей сбивает с толку то, что их поля не отображаются без пустого объекта. [{}]
когда они связывают модель, поэтому было внесено изменение, чтобы рассматривать начальное значение пустого массива как "пустое" поле и предварительно гидратировать его значением. Однако как только эта начальная гидратация будет завершена, вы можете легко переназначить ее обратно в пустой массив, и все готово. Это легко сделать вmounted
крючок жизненного цикла:
...
async mounted () {
await this.$nextTick()
this.formData.groupData = []
}
...
Вот вилка вашей песочницы кода: https://codesandbox.io/s/vue-formulate-group-with-button-to-start-forked-32jly?file=/src/components/Reproduction.vue
Предоставленные решения не работали для меня, но благодаря предыдущему ответу мне удалось найти это:
mounted(){
Vue.set(this.formData, "groupData", [])
},
который имеет тот же эффект, что и
data(){
formData: {
groupData: [],
},
},
mounted(){
this.formData.groupData = []
},
mounted() {
this.$el.querySelector('.formulate-input-group-repeatable-remove').click();
}
Также работает вместо всей этой штуки со слотами/ссылками - при условии, что в компоненте есть только одна повторяющаяся группа.