在真实开发中,我们往往会从服务器拿到一组数据,并且需要对其进行渲染

可以通过html标签内添加v-for 属性(Vue里面叫指令),实现html标签的循环控制

v-for类似于JavaScript的for循环,可以用于遍历一组数据;

数组用法

1、数组基本用法

通过

{{item}}
的方式,循环创建div,直到数组的最后一个元素

  1. <template>
  2. <div>
  3. <div>健康食物有:</div>
  4. <div v-for="item in food">{{item}}</div>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data(){
  10. return {
  11. food:[
  12. "青菜",
  13. "牛奶",
  14. "鸡蛋",
  15. "豆制品"
  16. ]
  17. }
  18. }
  19. };
  20. </script>
  21. <style>
  22. </style>

数组写成这样也可以,调用的时候就要调用{{item.name}}

  1. items: [
  2. { name:20},
  3. { name:23 },
  4. { name:18 }
  5. ]

2、数组带下标index的用法

{{下标号+1}}.{{数组元素}}

注意:( )内第一个一定是数组元素,第二个一定是下标号,不管是什么名字

  1. <template>
  2. <div>
  3. <div>健康食物有:</div>
  4. <div v-for="(item,index) in food">{{index+1}}.{{item}}</div>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data(){
  10. return {
  11. food:[
  12. "青菜",
  13. "牛奶",
  14. "鸡蛋",
  15. "豆制品"
  16. ]
  17. }
  18. }
  19. };
  20. </script>
  21. <style>
  22. </style>

image.png

对象用法

1、对象value值的用法

  1. <template>
  2. <div>
  3. <div>健康食物有:</div>
  4. <div v-for="item in food">{{item}}</div>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data(){
  10. return {
  11. food:{
  12. a:"青菜",
  13. b:"牛奶",
  14. c:"鸡蛋",
  15. d:"豆制品"
  16. }
  17. }
  18. }
  19. };
  20. </script>
  21. <style>
  22. </style>

image.png

2、对象key值和value值

{{键}} {{值}}

注意:第一个一定是值,第二个一定是键

  1. <template>
  2. <div>
  3. <div>健康食物有:</div>
  4. <div v-for="(value,key) in food">{{key}} {{value}}</div>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data(){
  10. return {
  11. food:{
  12. a:"青菜",
  13. b:"牛奶",
  14. c:"鸡蛋",
  15. d:"豆制品"
  16. }
  17. }
  18. }
  19. };
  20. </script>
  21. <style>
  22. </style>

image.png

3、对象key、value、下标

{{index}} {{key}} {{value}}

注意:第一个一定是值,第二个一定是键,第三个一定是下标

  1. <template>
  2. <div>
  3. <div>健康食物有:</div>
  4. <div v-for="(value,key,index) in food">{{index}} {{key}} {{value}}</div>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data(){
  10. return {
  11. food:{
  12. a:"青菜",
  13. b:"牛奶",
  14. c:"鸡蛋",
  15. d:"豆制品"
  16. }
  17. }
  18. }
  19. };
  20. </script>
  21. <style>
  22. </style>

image.png

数值用法

第一个参数是数值,第二个参数是下标

  1. <ul>
  2. <li v-for="(num, index) in 10">{{num}}-{{index}}</li>
  3. </ul>

image.png

=======================

template元素

类似于v-if,你可以使用 template 元素来循环渲染一段包含多个元素的内容:
我们使用template来对多个元素进行包裹,而不是使用div来完成,重复的div无用且消耗性能;

  1. <template id="my-app">
  2. <ul>
  3. <template v-for="(value, key) in info">
  4. <li>{{key}}</li>
  5. <li>{{value}}</li>
  6. <li class="divider">我是分隔符</li>
  7. </template>
  8. </ul>
  9. </template>

数组排序

伪排序

  1. <template>
  2. <div>
  3. <div>伪排序:</div>
  4. <div v-for="(value,index) in arrSort" >{{index}}.{{value}}</div>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data(){
  10. return {
  11. food:[
  12. 3,
  13. 54,
  14. 78,
  15. 11,
  16. 22,
  17. 33,
  18. 13,
  19. 11,
  20. 23,
  21. 22,
  22. 54,
  23. 59,
  24. ]
  25. }
  26. },
  27. computed:{
  28. arrSort(){
  29. return this.food.sort();
  30. }
  31. },
  32. };
  33. </script>
  34. <style>
  35. </style>

image.png

真排序

  1. <template>
  2. <div>
  3. <div>伪排序:</div>
  4. <div v-for="(value,index) in arrSort" >{{index}}.{{value}}</div>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data(){
  10. return {
  11. food:[
  12. 3,
  13. 54,
  14. 78,
  15. 11,
  16. 22,
  17. 33,
  18. 13,
  19. 11,
  20. 23,
  21. 22,
  22. 54,
  23. 59,
  24. ]
  25. }
  26. },
  27. computed:{
  28. arrSort(){
  29. return this.food.sort((a,b)=>{return a-b});
  30. }
  31. },
  32. };
  33. </script>
  34. <style>
  35. </style>

image.png

=======================

key标识

image.png
给 v-for 循环增加一个key,这个key可以更好地提高组件复用的效率,提高页面视图的更新效率。

这个是怎么实现的呢?

1、数组更新检测

Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图页面响应式更新。

包括数组的这些方法:
push( )
pop( )
shift( )
unshift( )
splice( )
sort( )
reverse( )
上面的方法会直接修改原来的数组,
但是某些方法不会替换原来的数组,而是会生成新的数组,比如 filter()、 concat() 和 slice()。

这些方式都可以触发页面响应式更新。

注意!通过下标索引修改,不是响应式,无法触发页面更新。

2、VNode

VNode的全称是Virtual Node,也就是虚拟节点;

事实上,无论是组件还是元素,它们最终在Vue中表示出来的都是一个个VNode(如下图);
image.png
VNode的本质是一个JavaScript的对象,Vue是通过把