Я предполагаю, что вы уже правильно установили желаемый класс 'need-to-fill'
.
Создайте disabled
переменную, которая определяет, будет ли кнопка отключена или нет:
data: () => ({
disabled: true,
}),
И установите индикатор на кнопку,и ссылка на элемент формы ref="form"
:
<form ref="form">
// ...
<button :disabled="disabled">Submit</button>
</form>
Примечание: это не обязательно должно быть form
, это может быть div
или что-то еще, если оно содержит всю вашу формувходы.
Создать функцию, которая проверяет, содержит ли какой-либо потомок вашего элемента формы нужный класс:
const descendantContainsClass = (el, className) => {
let elements = Array.from(el.getElementsByTagName('*'))
let hasClass = false
for(let el of elements) {
if(el.classList.contains(className)) {
hasClass = true
break;
}
}
return hasClass
}
Зависит от того, как вы сохраняете данные формы (т.е. ваши входные значения v-модели), создаете наблюдателя (илинаблюдатели) и вызывайте функцию каждый раз, когда изменяются данные:
watch: {
form: {
deep: true,
handler(v) {
this.$nextTick(() => {
// we pass form element, and desired class to check against
this.disabled = descendantContainsClass(this.$refs.form.$el, 'need-to-fill')
})
}
}
},
В зависимости от вашей формы вам может не потребоваться наблюдатель, а просто вызвать функцию (то же, что в handler
) после, например,change
или input
событий.