Vuejs динамически добавляет строку таблицы — проблема с сохранением строки

#vue.js #appendchild

#vue.js #appendchild

Вопрос:

Я добавляю <tr> элементы в свою таблицу до тех пор, пока Add Button щелкнут. При нажатии кнопки Добавить я создаю 7 <input type="text"> для ввода для соответствующих столбцов. У меня также есть Delete Delete All функции и, и все они работают хорошо. Вот моя таблица;

 <tr v-for="(table, index) in table" :key="index">
              <td>
                <span class="sidebar-icons">unfold_more</span>
              </td>
              <td>
                <input v-model="table.test1" placeholder="Test1" />
              </td>
              <td>
                <input v-model="table.test2" placeholder="Test1" />
              </td>
              <td>
                <input v-model="table.test3" placeholder="Test1" />
              </td>
              <td>
                <input v-model="table.test4" placeholder="Test1" />
              </td>
              <td>
                <input v-model="table.test5" placeholder="Test1" />
              </td>
              <td>
                <input v-model="table.test6" placeholder="Test1" />
              </td>
              <td>
                <input v-model="table.test7" placeholder="Test1" />
              </td>
              <td>
                <button @click="deleteRow(index)" type="button">Delete</button> 
                <button @click="applyRow()" type="button">Apply</button> 
              </td>
            </tr>
 

И вот мои методы;

  data(){
      return {
        table: []
      }
    },
    components: {
    methods: {
      deleteAll() {
        this.table = [];
      },
      addRow() {
        this.table.push({
          test1: "",
          test2: "",
          test3: "",
          test4: "",
          test5: "",
          test6: "",
          test7: "",
        });
      },
      deleteRow(index){
        this.table.splice(index, 1);
      },
      applyRow(){
        
      }
    }
 

И вот мой вопрос: когда я нажимаю кнопку добавить, я запускаю AddRow() методы (я не ставил здесь кнопки Добавить и удалить все, они не имеют отношения к вопросу.)

Когда запускается addRow, создаются входные данные, и я могу вводить в них данные, но, как вы можете видеть, applyRow() функция пуста. Что я хочу сделать, так это то, что при нажатии кнопки применить я хочу, чтобы тексты отображались <p></p> , другими словами, при нажатии кнопки Применить я больше не хочу их видеть <input type=text> . Я хочу, чтобы они рассматривались как абзацы. Я хочу видеть входные данные только при нажатии кнопки добавить, чтобы добавить новую строку. Как я могу создать этот applyRow() метод?

введите описание изображения здесь

Комментарии:

1. Вы хотите иметь возможность создавать несколько строк одновременно? или только по одному за раз?

2. Я добавляю только одну строку одновременно.

Ответ №1:

Вы можете добиться этого, создав флаг при добавлении новой строки

  addRow() {
        this.table.push({
          test1: "",
          test2: "",
          test3: "",
          test4: "",
          test5: "",
          test6: "",
          test7: "",
          applied: false,
        });
      },
 

и ваш метод applyRow() должен выглядеть следующим образом

 applyRow(index){
       this.table[index].applied = true; 
}
 

и измените свой шаблон следующим образом

 <tr v-for="(table, index) in table" :key="index">
              <td>
                <span class="sidebar-icons">unfold_more</span>
              </td>
              <td>
                <input v-if="!table.applied" v-model="table.test1" placeholder="Test1" />
                <p v-else>table.test1</p>
    enter code here
              </td>
              <td>
                <input v-if="!table.applied" v-model="table.test2" placeholder="Test1" />
                <p v-else>table.test2</p>
              </td>
              <td>
                <input v-if="!table.applied" v-model="table.test3" placeholder="Test1" />
                <p v-else>table.test3</p>
              </td>
              <td>
                <input v-if="!table.applied" v-model="table.test4" placeholder="Test1" />
                <p v-else>table.test4</p>
              </td>
              <td>
                <input v-if="!table.applied" v-model="table.test5" placeholder="Test1" />
                <p v-else>table.test5</p>
              </td>
              <td>
                <input v-if="!table.applied" v-model="table.test6" placeholder="Test1" />
                <p v-else>table.test6</p>
              </td>
              <td>
                <input v-if="!table.applied" v-model="table.test7" placeholder="Test1" />
                <p v-else>table.test7</p>
              </td>
              <td>
                <button @click="deleteRow(index)" type="button">Delete</button> 
                <button v-if="!table.applied" @click="applyRow(index)" type="button">Apply</button> 
              </td>
            </tr>
 

Комментарии:

1. Я сделал почти то же самое, но забыл поместить индекс внутри функции applyRow, и он показывал и скрывал каждую строку. Теперь все идеально. Спасибо за ваш ответ.

2. Что мне делать, если я хочу скрыть кнопку применить после ее нажатия? Я имею в виду, когда я заполняю все 7 входных данных, я нажимаю Применить, и строка вставляется. На этом этапе мне не нужна кнопка Apply, чтобы ее можно было увидеть.

3. также добавьте v-if для этой кнопки

4. Хорошо, последний вопрос 🙂 У меня также есть перетаскиваемая функция в моей таблице, поэтому я могу перетаскивать строки, когда хочу, чтобы они были выше или ниже и т.д… Итак, если я помещу вторую строку выше, идентификатор первого будет равен 2, а второй строки будет равен 1. Как мне автоматически предоставить идентификационную информацию. Первая добавленная строка равна 1, вторая строка равна 2 и т.д. Я имею в виду, давайте запретим пользователю вводить идентификатор и указывать его заранее. Как мне это сделать?

5. добавьте:id=»index» в ваш <tr></tr>