Skip to content

7. 项目 [vuejs-05]:指令 [v-for]

项目 [vuejs-05] 包含指令 [v-for]

Image

7.1. 主脚本 [main.js]

主脚本 [main.js] 的代码与先前项目中的脚本 [main.js] 完全相同。

7.2. 主组件 [App]

组件 [App] 的代码如下:


<template>
  <b-container>
    <b-card>
      <b-alert show variant="success" align="center">
        <h4>[vuejs-05] : attribut [v-for]</h4>
      </b-alert>
      <VFor />
    </b-card>
  </b-container>
</template>


<script>
  import VFor from "./components/VFor.vue";

  export default {
    name: "app",
    components: {
      VFor
    }
  };
</script>
  • 第 7、14、19 行:组件 [App] 调用组件 [VFor]

7.3. 组件 [VFor]

视觉呈现效果如下:

Image

Image

组件 [VFor] 的代码如下:


<template>
  <div>
    <!-- 下拉列表 -->
    <b-dropdown id="dropdown" text="Options">
      <b-dropdown-item v-for="(option,index) in options"
                       :key="option.id"
                       @click="select(index)">{{option.text}}</b-dropdown-item>
    </b-dropdown>
    <!-- 按钮 -->
    <b-button class="ml-3"
              variant="primary"
              @click="generateErrors"
              v-if="!error">Générer une liste d'erreurs</b-button>
    <!-- 提示 -->
    <b-alert show variant="danger" v-if="error" class="mt-3">
      Les erreurs suivantes se sont produites :
      <br />
      <ul>
        <li v-for="(erreur,index) in erreurs" :key="index">{{erreur}}</li>
      </ul>
    </b-alert>
  </div>
</template>
<!-- 脚本 -->
<script>
  export default {
    name: "VFor",

    // 组件的静态属性
    data() {
      return {
        // 错误列表
        erreurs: [],
        // 是否出错
        error: false,
        // 菜单选项列表
        options: [
          { text: "option 1", id: 1 },
          { text: "option 2", id: 2 },
          { text: "option 3", id: 3 }
        ]
      };
    },

    // 方法
    methods: {
      // 生成错误列表
      generateErrors() {
        this.erreurs = ["erreur 1", "erreur 2", "erreur 3"];
        this.error = true;
      },
      // 用户已选择一个选项
      select(index) {
        alert("Vous avez choisi : " + this.options[index].text);
      }
    }
  };
</script>

注释

  • 第 4 行:<b-dropdown> 标签用于定义一个下拉列表 [1],其形式为一个按钮,点击该按钮即可查看列表 [2] 中的选项。 [text=’Options’] 定义了按钮上显示的文本 [1]
  • 第 5-7 行:<dropdown-item> 标签定义了下拉列表中的一个项目;
  • 第5行:属性[v-for]表示,对于组件中第37至41行属性[options]中的每个元素[option],都应重复使用<dropdown-item>标签。 [index] 代表 [0, 1, ..., n] 列表中该元素的序号。元素名称 [option] 以及索引名称均可自定义。也可以写成 [<b-dropdown-item v-for="(o,i) in options" :key="o.id" @click="select(i)">{{o.text}}</b-dropdown-item>]
  • 第 6 行:如果遗漏 [key] 属性,ESLint 会触发警告。[key] 属性的值必须保持不变。 因此,该元素的值 [index] 也不合适。 因为如果删除该元素,列表中位于其后面的元素的 [index] 值将减 1。因此,这里采用 [option.id] 作为键值(第 38-40 行),该值在删除元素时不会改变。 属性 [key] 是 DOM(文档对象模型)的再生优化组件,用于在列表需要再生时由 [Vue.js] 进行处理。 请注意 [:key] 的命名,因为 [key] 具有动态值;
  • 第 7 行:当用户点击列表中的某个元素时,将调用 [select(index)] 方法(第 49-51 行);
  • 第 7 行:选项的文本将采用第 37-41 行定义的值 [option.text]
  • 第 10 行:按钮 [3][class=’ml-3] 表示左边距 (m) 为 3 个间隔符。 [@click="generateErrors"] 表示当按钮上执行 [click] 时,将调用第 45-48 行中的方法 [generateErrors][v-if="!error"] 表示按钮的显示取决于第 35 行静态属性 [error] 的值;
  • 第15-21行:一个类型为[danger] [4]的提示,同样由第35行的静态属性[error]控制。 属性 [class=’mt-3’](顶部间距 3 个间隔符)用于设定该提示与上方元素之间的间距;
  • 第27行:标签 HTML <br /> 表示换行;
  • 第18行:无序列表的开始 [ul=unordered list]
  • 第19行:标签 <li> 定义了列表 <ul> 中的一个元素。这里同样使用指令 [v-for] 来多次生成该标签。 此处的重复次数等于第33行数组[erreurs]中的元素个数。此处使用了[:key=index]属性。 此前曾提到,列表元素的索引无法有效区分列表中的不同元素,因为一旦删除某个元素,后续所有元素的索引都会发生变化。但在此处这并不重要,因为错误列表中的元素不太可能被删除;
  • 第 19 行:该元素用于显示列表 [erreurs] 中的元素 [erreur]
  • 第 30-43 行:[template] 中的所有动态元素均为组件的属性。此处不存在由父组件设定值的 [props] 类型属性;
  • 第 48-55 行:方法 [generateErrors] 生成错误列表,该列表将通过第 16-18 行的 <ul> 标签显示。 此外,该方法还修改了静态属性 [error],既用于显示该错误列表(第 15 行),也用于隐藏生成按钮(第 13 行);

7.4. 项目执行

Image