Условный рендеринг на основе ввода флажка в Vue.js

Я пытаюсь условно визуализировать элементы формы на основе пользовательского ввода в Vue, и это не очень хорошо. Я знаю, как сделать это с помощью VanillaJS или jQuery, но я изо всех сил пытаюсь перевести эти знания в использование встроенных условных директив Vue. Я использую однофайловые компоненты с шаблоном веб-пакета от vue-cli.

От моего <template>:

<form autocomplete="off" name="loadDeets" id="loadDeets" class="loadDeets">
    <div class="form-group row">
       <label>Date</label>
       <flat-pickr v-model="date"
              :config="{dateFormat: 'l, F j'}"
                class="form-control" 
                placeholder="Select date"               
                name="date"></flat-pickr>
    </div>

    <div class="row">
        <div class="form-group col left">
           <label>Time</label>
           <flat-pickr v-model="time"
                :config="config"
                class="form-control" 
                placeholder="Select time"               
                name="time1"></flat-pickr>
        </div>

        <div class="form-group col right">
            <label>Time</label>
            <flat-pickr
                :config="config"
                class="form-control" 
                placeholder="Select time"               
                name="time2" v-show="document.getElementById('apptCheck').checked"></flat-pickr>
        </div>
    </div>

    <div class="form-check">
        <input class="form-check-input" type="checkbox" id="apptCheck">
        <label class="form-check-label" for="apptCheck">
           Appointment?
        </label>
    </div>
 </form>

Это полностью нарушает визуализацию компонента страницы. Тогда я попытался использовать v-модель на основе этой страницы из документации Vue. https://vuejs.org/v2/guide/forms.html

<div class="row">
   <div class="form-group col left">
      <label>Time</label>
      <flat-pickr v-model="time"
           :config="config"
            class="form-control" 
            placeholder="Select time"               
            name="time1"></flat-pickr>
    </div>

    <div class="form-group col right">
       <label>Time</label>
       <flat-pickr
           :config="config"
            class="form-control" 
            placeholder="Select time"               
            name="time2" v-show="vm.checked == true"></flat-pickr>
    </div>
 </div>

 <div class="form-check">
    <input class="form-check-input" type="checkbox" value="checked" id="apptCheck" v-model="checked">
    <label class="form-check-label" for="apptCheck">
        Appointment?
    </label>
 </div>

К сожалению, это также ломает страницу.

Я не совсем уверен, как действовать дальше. Я не думаю об этом правильно? Разве v-if/v-show не предназначен для использования с входными данными других элементов?

1 ответ

Решение

Ваш второй пример - правильный способ сделать это, вам никогда не нужно обращаться к элементу по идентификатору в Vue. У вас есть доступ ко всем переменным в вашем компоненте, поэтому вам не нужно vm., просто v-show="checked":

   <flat-pickr
       :config="config"
        class="form-control" 
        placeholder="Select time"               
        name="time2" v-show="checked"></flat-pickr>

Убедитесь, что вы создали экземпляр checked в вашей функции данных, а также. Вместо того, чтобы положить value="checked" на этом элементе, чтобы начать, вы можете установить его равным true в ваших исходных данных и v-model="checked" автоматически проверит это.

Другие вопросы по тегам