153.md 5.9 KB
Newer Older
W
wizardforcel 已提交
1
# 9 渲染列表第 1 部分(遍历数组)
W
init  
wizardforcel 已提交
2 3 4

> 原文: [https://javabeginnerstutorial.com/vue-js/9-rendering-lists-part-1/](https://javabeginnerstutorial.com/vue-js/9-rendering-lists-part-1/)

W
wizardforcel 已提交
5
我们日复一日地处理清单。 在我们的应用中,我们经常遇到这样的情况,即我们必须将数组显示为列表,其项会动态变化。 因此,在我们的 HTML 中对数组项进行硬编码并不是真正的选择。 重要的是,我们知道如何使用 Vue 处理这些动态变化的数组,这并不奇怪,为此,我们还有另一个指令! 对,是`v-for`! 与往常一样,我们将深入研究大量示例,以便于清楚理解。
W
init  
wizardforcel 已提交
6 7 8 9 10

## 遍历数组

我们面临的最常见和最简单的方案是遍历数组的各项并将它们呈现为列表。 以下是四种不同语言的问候语,我们希望将其显示为网页的无序列表。

W
wizardforcel 已提交
11
```js
W
init  
wizardforcel 已提交
12 13 14 15 16
data: {
  greetings: ["hi", "bonjour", "hola", "ciao"]
}
```

W
wizardforcel 已提交
17
在我们的`index.html`文件中,让我们将`v-for`指令添加到`<li>`元素中,以动态地呈现`greetings`数组的内容,如下所示:
W
init  
wizardforcel 已提交
18

W
wizardforcel 已提交
19
```js
W
wizardforcel 已提交
20
 
W
init  
wizardforcel 已提交
21
   <li v-for="greeting in greetings">{{ greeting }}</li>
W
wizardforcel 已提交
22
 
W
init  
wizardforcel 已提交
23 24 25 26
```

好吧,不要惊慌! 我将逐字剖析此信息。

W
wizardforcel 已提交
27
我们为`v-for`指令使用的*特殊语法*是“`greeting in greetings`”。
W
init  
wizardforcel 已提交
28

W
wizardforcel 已提交
29 30
*   首先, `greeting` – 建议在我们的情况下使用单数名词,`greeting`,作为数组元素的**别名**反复进行。 这可以是您选择的任何名称,然后可以在我们的代码中使用该名称来寻址每个数组项。
*   其次,作为语法一部分的 – **定界符**`in`。 如果您具有 JavaScript 背景,那么所有这些看起来都应该很熟悉,因为在这里我们将`for in``for of`用于迭代目的。 即使使用 Vue,我们也可以使用`of`作为分隔符而不是`in`
W
init  
wizardforcel 已提交
31

W
wizardforcel 已提交
32
```js
W
init  
wizardforcel 已提交
33 34 35
 <li v-for="greeting of greetings">{{ greeting }}</li>
```

W
wizardforcel 已提交
36
*   最后, `greetings` – 必须与 Vue 实例的`data`对象中的**数组名称**完全相同。
W
init  
wizardforcel 已提交
37 38 39

在这里,为简单起见,我们在简单插值中使用变量`greeting`。 但它可以像其他任何属性一样使用,例如将其作为值传递给函数或将其绑定到链接的引用等。输出如下,

W
wizardforcel 已提交
40
![v-for iterating over array](img/af9854cb19e36518d9d7c5b0266dc44b.png)
W
init  
wizardforcel 已提交
41

W
wizardforcel 已提交
42 43 44 45 46 47 48 49
使用小胡子语法的另一种方法是使用`v-text`指令。 它将`greeting`设置为文本内容。

```html
<ul> <li v-for="greeting in greetings" v-text=greeting></li> </ul>
```

将呈现相同的结果。

W
wizardforcel 已提交
50
## Vue 是反应式的!
W
wizardforcel 已提交
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

让我们沿着存储通道走一下。 我们了解到 Vue 的美丽在于其[反应式](https://javabeginnerstutorial.com/js/vue-js/2-template-syntax-reactivity/)

**快速回顾**:使状态和视图保持同步。 换句话说,Vue 不仅在引用的 DOM 中将**呈现为**数据,而且无论何时在数据对象中更改其值,**都会更新**

让我们再来看一次这种情况。

使用快捷方式`F12`打开 *Chrome DevTools* ,然后点击“**Vue**”。 仅当您已遵循我们的教程系列并安装了 [**Vue Devtools** Chrome 扩展](https://javabeginnerstutorial.com/vue-js/4-vue-devtools-setup/) 后,此面板才会出现。

由于我们没有使用任何全局变量来引用`index.js`文件中的 Vue 实例,因此默认情况下会将其保存到`$vm0`。 如下图所示,单击`<Root>`即可看到。 因此,让我们使用`$vm0`从开发者工具控制台访问 Vue 模型。

![reactivity in vue](img/7de386b6e2a340c69e8afaf8d06fdc41.png)

让我们转到控制台,使用`push`方法向`greetings`数组添加一个问候,然后查看视图是否进行了动态更新(*神奇地*!)。

W
wizardforcel 已提交
66
```jsscript
W
wizardforcel 已提交
67 68 69 70 71 72 73
$vm0.greetings.push("namaste")
```

![v-for reactivity](img/fbdfc17ee75fab781a7335c339414c87.png)

这不是魔术吗?

W
wizardforcel 已提交
74
## 访问当前数组项的索引
W
wizardforcel 已提交
75 76 77 78 79 80 81 82 83

开发者的生活没有暂停按钮! 我们期望完成意外的事情,例如访问数组项的索引及其内容。 我们知道如何使用 Vue 渲染数组元素,但是否也可以获得其索引? 好吧,答案是肯定的!

语法与我们之前看到的非常相似,

```html
<div v-for="(greeting, index) in greetings">{{ index }}. {{ greeting}}</div>
```

W
wizardforcel 已提交
84
我们必须引入一个括号并指定两个用逗号分隔的参数,可以选择它们的名称。 **第一个**参数是指数组元素 – 在我们的示例中是`greeting`**第二个**参数是可选的,它引用当前正在循环的项目的索引 – 在我们的示例中为`index`。 此**顺序**是最重要的注意事项。 无论您使用什么名称,第一个始终是数组元素,第二个始终是`v-for`语法中的索引。 然后可以根据需要将其与代码中的这些名称一起使用。
W
wizardforcel 已提交
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120

![v-for with index](img/e2131f026f63f0feaafc6fd692278f3c.png)

让我们看一下最终代码。

### `Index.html`

```html
<!DOCTYPE html>
<html>
  <head>
    <title>Hello Vue!</title>
    <!-- including Vue with development version CDN -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <h2>Greetings</h2>
      <!-- Iterating through array elements-->
      <ul>
        <li v-for="greeting in greetings" v-text=greeting></li>
      </ul>
      <!-- Accessing array elements along with thier index -->
      <h2>Greetings with Index</h2>
      <div v-for="(greeting, index) in greetings">
          {{ index }}. {{ greeting}}
      </div>
    </div>
    <!-- including index.js file -->
    <script src="index.js"></script>
  </body>
</html>
```

### `Index.js`

W
wizardforcel 已提交
121
```jsscript
W
wizardforcel 已提交
122 123 124 125 126 127 128 129 130 131 132
var app = new Vue({
  el: "#app",
  data: {
    greetings: ["hi", "bonjour", "hola", "ciao"]
  }
});
```

[GitHub 仓库](https://github.com/JBTAdmin/vuejs)中也提供了上面讨论的所有代码。 随意分叉仓库并进行一些实验。

在下一篇文章中,我们将研究如何使用`v-for`遍历对象。 在此之前,请继续练习!