我有一个HTML输入字段来输入一些信息:

<div id="fruitForm">
    <div class="inputArea">
        <label for="fruit0">Enter Fruit Name</label>
        <input id="fruit0"></input>
    </div>
</div>
<button @click="newInputField">Add More Fruit Input Fields</button>
<button @click="submit">Submit Fruit</button>

然后单击事件I处理:

export default {
    data() {
        return {

        }
    },
    methods: {
        newInputField() {
            //Create another input area for users to input fruits
        },
        submit() {
            //Do something here
        }
    }
}

当用户 Select Add More Fruit Input Fields按钮时,它应该创建一个新的输入区域,以便HTML如下所示:

<div id="fruitForm">
    <div class="inputArea">
        <label for="fruit0">Enter Fruit Name</label>
        <input id="fruit0"></input>
    </div>

    <div class="inputArea">
        <label for="fruit1">Enter Fruit Name</label>
        <input id="fruit1"></input>
    </div>
</div>
<button @click="newInputField">Add More Fruit Input Fields</button>
<button @click="submit">Submit Fruit</button>

现在,我一直在通过vanilla Javascript使用传统的DOM操作方法来实现这一点...诸如此类:

const inputArea = document.getElementsByClassName('inputArea');

然后我更改输入字段的id,然后使用appendChild将新的输入字段添加到DOM中.

问题:我的VUIshould是如何克隆的?我觉得我没有用这种方式来处理这件事.我应该像列表一样处理这个问题并使用v-for吗?还是别的什么?

推荐答案

避免使用Vue直接操作DOM.可以使用data属性作为模板的模型.答案是肯定的,你可以而且可能应该使用v-for进行你所说的克隆:

var demo = new Vue({
  el: '#demo',
  data: {
    counter: 0,
    inputs: [{
      id: 'fruit0',
      label: 'Enter Fruit Name',
      value: '',
    }],
  },
  methods: {
    addInput() {
      this.inputs.push({
        id: `fruit${++this.counter}`,
        label: 'Enter Fruit Name',
        value: '',
      });
    }
  }
});
<script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
<div id="demo">
  <div class="inputArea" v-for="input in inputs" :key="input.id">
    <label :for="input.id">{{input.label}}</label>
    <input :id="input.id" v-model="input.value"></input>
  </div>
  <button @click="addInput">Add input</button>
</div>

Vue.js相关问答推荐

VueJS使所有组件崩溃,而不是只有一个

将 html 文件移出 dist vite 中的 src 文件夹

vuejs:在确认提示之前更改 HTML

Vue CLI: 如何在一个vtextfield更改时让另一个vtextfield的值也同时更改,但同时又可以覆盖它?

我在表格中创建了一个包含信息的新行,但在 Cypress e2e 测试中我无法获得最后一行(新行)

如何在Vue js 3中根据API响应替换react 值

有没有办法初始化一个保留初始 HTML 的 Vue 对象

使用 Nuxt 动态获取文件夹中的图像路径

Vuetify 复选框:如何停止点击事件?

使用 vuex 更新数据

Vue cli 3项目,图像路径中的动态src不起作用

使用 azure devops 发布管道部署 Vue.js 应用程序

如何在不实例化根实例的情况下使用 vue 组件?

Nuxt:显示静态文件夹中的本map像

错误:[vuex] 期望字符串作为类型,但发现未定义

未捕获的类型错误:c.querySelectorAll 不是函数

npm run dev 和 npm run production 的区别

将 ref 的内容从子组件传递到另一个 VueJS 子组件

beforeCreate 挂钩中的 Vue 2.1 调用方法不起作用

检测 Vue-Router 导航Guards中的后退按钮