v-for 在 vue.js 中不使用 html 元素

Posted

技术标签:

【中文标题】v-for 在 vue.js 中不使用 html 元素【英文标题】:v-for without using html element in vue.js 【发布时间】:2019-09-15 19:36:44 【问题描述】:

我是 Vue.js 的新手

我正在准备输入元素练习的演示,这是我的代码。

HTML

<div id="inputDiv">
  <form action="">
    <input type="text" v-model="first_name">
    <input type="text" v-model="last_name">
    <input type="email" v-model="email">
    <div>
      <input type="radio" :name="gender" v-model="gender" value="male">Male
      <input type="radio" :name="gender" v-model="gender" value="female">Female
    </div>
    <textarea v-model="address" id="" cols="30" rows="10"></textarea>
    <br>
    <div v-for="hobby in hobbies">
      <input type="checkbox" v-model="userHobbies" v-bind:value="hobby">hobby
    </div>
  </form>
</div>

脚本

const inputApp = new Vue(
  el: '#inputDiv',
  data: 
    first_name: '',
    last_name: '',
    email: '',
    gender: 'male',
    address: '',
    userHobbies:[],
    hobbies: ['Reading', 'Cricket', 'Cycling', 'Hiking']
  
)

在这里您可以看到,要显示带有标签的爱好,我必须使用 parent 进行迭代,

添加 div 不是我想要的,如果我会在输入元素中 v-for 像:

<input 
  type="checkbox" 
  v-for="hobby in hobbies" 
  v-model="userHobbies" 
  v-bind:value="hobby"
>hobby

这是抛出异常[Vue警告]:属性或方法“爱好”未在实例上定义

我的问题是是否有任何替代方法可以在不使用 html 元素的情况下使用 v-for 对象元素?

【问题讨论】:

【参考方案1】:

将其包装在template 标签中,因为模板标签不会出现在最终呈现的 HTML 中:

<template v-for="hobby in hobbies">
    <input type="checkbox" v-model="userHobbies" v-bind:value="hobby">hobby
</template>

或者更好的是,改进你的标记语义并使用标签:

<label v-for="hobby in hobbies">
    <input type="checkbox" v-model="userHobbies" v-bind:value="hobby"> hobby
</label>

【讨论】:

【参考方案2】:

您可以在 div 中添加模板,因为模板不会呈现到 DOM:

  <div id="inputDiv">
    <form action>
      <input type="text" v-model="first_name">
      <input type="text" v-model="last_name">
      <input type="email" v-model="email">
      <div>
        <input type="radio" :name="gender" v-model="gender" value="male">Male
        <input type="radio" :name="gender" v-model="gender" value="female">Female
      </div>
      <textarea v-model="address" id cols="30" rows="10"></textarea>
      <br>
      <template v-for="hobby in hobbies">
        <input type="checkbox" v-model="userHobbies" v-bind:value="hobby">
        hobby
      </template>
    </form>
  </div>

【讨论】:

【参考方案3】:

问题在于,标记后的字符串插值hobby 在循环之外,这就是显示错误的原因,在这种特定情况下,您 必须 将其包装在某些东西中。

如果您不想专门使用 div,您可以使用 label 代替,这在这种情况下更加自然,现在如果用户点击标签,复选框将自动被选中。

<label v-for="hobby in hobbies">
    <input type="checkbox" v-model="userHobbies" v-bind:value="hobby"> hobby <br>
</label>

new Vue(
  el: '#inputDiv',
  data: 
    first_name: '',
    last_name: '',
    email: '',
    gender: 'male',
    address: '',
    userHobbies:[],
    hobbies: ['Reading', 'Cricket', 'Cycling', 'Hiking']
  
  );
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="inputDiv">
<form action="">
    <input type="text" v-model="first_name">
    <input type="text" v-model="last_name">
    <input type="email" v-model="email">
    <div>
        <input type="radio" :name="gender" v-model="gender" value="male">Male
        <input type="radio" :name="gender" v-model="gender" value="female">Female
    </div>
    <textarea v-model="address" id="" cols="30" rows="10"></textarea>
    <br>
    <label v-for="hobby in hobbies">
        <input type="checkbox" v-model="userHobbies" v-bind:value="hobby">hobby
        <br>
    </label>
</form>
 userHobbies | json 
</div>

【讨论】:

以上是关于v-for 在 vue.js 中不使用 html 元素的主要内容,如果未能解决你的问题,请参考以下文章

vue.js学习笔记四

vue.js学习笔记四

vue.js学习笔记四

如何在 Vue.js 的嵌套 v-for 循环中使用 v-html 有条件地渲染原始 HTML?

包含 Vue.js v-if 和 v-for 指令的 HTML 标签在加载时闪烁

如何在 Vue.js 中使用 v-for 动态创建新的 div?