循环遍历

  1. <template>
  2. <view class="content">
  3. <view class="box2" hover-class="box2-active" >
  4. <view class="box" hover-class="box-active" hover-stop-propagation>
  5. this is a box
  6. </view>
  7. </view>
  8. <view class="box" hover-class="box-active">
  9. this is a box
  10. </view>
  11. <view class="">
  12. this is a box1
  13. </view>
  14. <button type="default">按钮</button>
  15. <button type="primary" disabled="">按钮</button>
  16. <button type="warn" loading=""></button>
  17. <image src="https://img0.baidu.com/it/u=2636535523,1482743544&fm=26&fmt=auto" mode="aspectFill"></image>
  18. <image src="https://img0.baidu.com/it/u=2636535523,1482743544&fm=26&fmt=auto" mode="aspectFit"></image>
  19. <view v-for="(item,index) in arr" :key='item.id'>
  20. 序号:{{item.id}},名字:{{item.name}},年龄:{{item.age}}
  21. </view>
  22. </view>
  23. </template>
  24. <script>
  25. export default {
  26. data() {
  27. return {
  28. title: 'Hello',
  29. arr:[
  30. {
  31. name:'name1',
  32. age:'18',
  33. id:1
  34. },
  35. {
  36. name:'name2',
  37. age:'22',
  38. id:2
  39. },
  40. {
  41. name:'name3',
  42. age:'17',
  43. id:3
  44. }
  45. ]
  46. }
  47. },
  48. onLoad() {
  49. },
  50. methods: {
  51. }
  52. }
  53. </script>
  54. <style>
  55. .box{
  56. height: 100rpx;
  57. width: 100rpx;
  58. background: #0000FF;
  59. }
  60. .box-active{
  61. background:#ff5500;
  62. }
  63. .box2{
  64. height: 200rpx;
  65. width: 200rpx;
  66. background-color: red;
  67. }
  68. .box2-active{
  69. background-color: blue;
  70. }
  71. </style>

  1. <template>
  2. <view>
  3. <view v-for="(item, index) in items"> **********************
  4. {{ index }} - {{ item.message }}
  5. </view>
  6. </view>
  7. </template>

在做循环的时候首先要有一个数组,是一个json,array,想要对studentArray里面的数据渲染的时候就要从里面定义

这个是专门来写v-for的,也就是说v-for要做循环,必须要写在某一个组件之内的,后面加上要循环的数组studentArray

之后定义要循环的每一项元素,元素名称叫stuObj,是一个对象,stuObj in studentArray

然后将数据进行展示

这是单个数组进行的循环

  1. <template>
  2. <view v-for="stuObj in studentArray"> **********************
  3. <view>姓名:{{stuObj.name}},年龄:{{stuObj.age}}</view>
  4. </view>
  5. </template>
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. studentArray:[
  11. {
  12. name:"jack",
  13. age:19
  14. },
  15. {
  16. name:"jon",
  17. age:22
  18. },
  19. {
  20. name:"jason",
  21. age:21
  22. },
  23. {
  24. name:"lucy",
  25. age:18
  26. },
  27. {
  28. name:"stark",
  29. age:16
  30. }
  31. ]
  32. }
  33. },
  34. methods: {
  35. }
  36. }
  37. </script>
  38. <style>
  39. </style>

image.png

嵌套循环

它是一个双重循环
第二个循环体在第一个循环体内嵌套
标签
代表我们在循环的时候,它并不会在页面里面把标签输出
它仅仅是把元素进行循环

  1. <template>
  2. <view v-for="stuObj in studentArray">
  3. <view>姓名:{{stuObj.name}},年龄:{{stuObj.age}}</view>
  4. <view>
  5. <!-- <view v-for="sk in stuObj.skill">
  6. {{sk}},
  7. </view> -->
  8. <block v-for="sk in stuObj.skill">
  9. {{sk}},
  10. </block>
  11. </view>
  12. </view>
  13. </template>
  14. <script>
  15. export default {
  16. data() {
  17. return {
  18. studentArray:[
  19. {
  20. name:"jack",
  21. age:19,
  22. skill:["Java","HTML","css"]
  23. },
  24. {
  25. name:"jon",
  26. age:22,
  27. skill:["Java","css","vue"]
  28. },
  29. {
  30. name:"jason",
  31. age:21,
  32. skill:["HTML","springcloud","vue"]
  33. },
  34. {
  35. name:"lucy",
  36. age:18,
  37. skill:["Java","HTML","springcloud"]
  38. },
  39. {
  40. name:"stark",
  41. age:16,
  42. skill:["HTML","css","vue"]
  43. }
  44. ]
  45. }
  46. },
  47. methods: {
  48. }
  49. }
  50. </script>
  51. <style>
  52. </style>

当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略

如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染

如果列表中项目的位置会动态改变或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态(如 input 中的输入内容,switch 的选中状态),需要使用 :key 来指定列表中项目的唯一的标识符


:key 的值以两种形式提供

  • 使用 v-for 循环 arrayitem 的某个 property,该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变
  • 使用 v-for 循环中 item 本身,这时需要 item 本身是一个唯一的字符串或者数字

当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率

如不提供 :key,会报一个 warning, 如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。

示例:

  1. <template>
  2. <view>
  3. <!-- array 中 item 的某个 property -->
  4. <view v-for="(item,index) in objectArray" :key="item.id"> **********************
  5. {{index +':'+ item.name}}
  6. </view>
  7. <!-- item 本身是一个唯一的字符串或者数字时,可以使用 item 本身 -->
  8. <view v-for="(item,index) in stringArray" :key="item">
  9. {{index +':'+ item}}
  10. </view>
  11. </view>
  12. </template>
  13. <script>
  14. export default {
  15. data () {
  16. return {
  17. objectArray:[{
  18. id:0,
  19. name:'li ming'
  20. },{
  21. id:1,
  22. name:'wang peng'
  23. }],
  24. stringArray:['a','b','c']
  25. }
  26. }
  27. }
  28. </script>

嵌套列表渲染,必须指定不同的索引!

  1. <template>
  2. <scroll-view v-for="(card,index) in list" :key="index">
  3. <view v-for="(item,itemIndex) in card" key="itemIndex">
  4. ({item.value})
  5. </view>
  6. </scroll-view>
  7. </template>

在这种嵌套循环的时候,index和itemIndex这种索引必须指定,且别名不能相同
2行,index是默认,不写的话也会默认加上,这个是在编译的时候进行的
3行,itemIndex,这样两个index在循环的时候他们的下标就不会有冲突

任何语言开发都一样,在做嵌套循环的时候,下标必须要定义为不同的


2行,8行(stuObj,stuIndex)(sk,itemIndex)在循环的时候,stuObj和sk代表对象,stuIndex和itemIndex代表下标

  1. <template>
  2. <view v-for="(stuObj,stuIndex) in studentArray">
  3. <view>姓名:{{stuObj.name}},年龄:{{stuObj.age}}</view>
  4. <view>
  5. <!-- <view v-for="sk in stuObj.skill">
  6. {{sk}},
  7. </view> -->
  8. <block v-for="(sk,itemIndex) in stuObj.skill">
  9. {{sk}},
  10. </block>
  11. </view>
  12. </view>
  13. </template>
  14. <script>
  15. export default {
  16. data() {
  17. return {
  18. studentArray:[
  19. {
  20. name:"jack",
  21. age:19,
  22. skill:["Java","HTML","css"]
  23. },
  24. {
  25. name:"jon",
  26. age:22,
  27. skill:["Java","css","vue"]
  28. },
  29. {
  30. name:"jason",
  31. age:21,
  32. skill:["HTML","springcloud","vue"]
  33. },
  34. {
  35. name:"lucy",
  36. age:18,
  37. skill:["Java","HTML","springcloud"]
  38. },
  39. {
  40. name:"stark",
  41. age:16,
  42. skill:["HTML","css","vue"]
  43. }
  44. ]
  45. }
  46. },
  47. methods: {
  48. }
  49. }
  50. </script>
  51. <style>
  52. </style>

写了**:key**之后能够保证循环的时候每一行的元素,每一行的元素如果包含了相应的组件的话,这个组件会和我们循环的值进行一个绑定,是保证我们在当前页面的全局唯一性,简而言之就是循环每一项保证唯一

示例

16行,为学生增加编号,保证学生的唯一性,加入ID,这个ID就是和key做绑定的,然后要在view中做渲染,
38行,通过this.studentArray来获得data里面的数据,this代表当前页面里整体的对象
45行,所有JS里面只要有数组就有方法,push,它是向数组尾部一个个添加新的项
46行unshift是向数组首部添加项
3行,:key保证组件和属性数据捆绑在一起

  1. <template>
  2. <view>
  3. <view v-for="stu in studentArray" :key="stu.id"> //:key保证组件和数据捆绑唯一
  4. <checkbox :value="stu.name"></checkbox>
  5. </view>
  6. <button type="primary" @click="addStu">新增学生</button>
  7. </view>
  8. </template>
  9. <script>
  10. export default {
  11. data() {
  12. return {
  13. studentArray:[
  14. {
  15. id:1,
  16. name:"jack",
  17. age:19,
  18. skill:["Java","HTML","css"]
  19. },
  20. {
  21. id:2,
  22. name:"jon",
  23. age:22,
  24. skill:["Java","css","vue"]
  25. },
  26. {
  27. id:3,
  28. name:"jason",
  29. age:21,
  30. skill:["HTML","springcloud","vue"]
  31. },
  32. ]
  33. }
  34. },
  35. methods: {
  36. addStu(){
  37. var studentArray = this.studentArray;
  38. var newId = studentArray.length + 1;
  39. var newStu = {
  40. id:newId,
  41. name:"新生" + newId,
  42. age:18
  43. }
  44. studentArray.push(newStu);
  45. studentArray.unshift(newStu);
  46. }
  47. }
  48. }
  49. </script>
  50. <style>
  51. </style>

注意事项

  • 在H5平台 使用 v-for 循环整数时和其他平台存在差异,如 v-for="(item, index) in 10" 中,在H5平台 item 从 1 开始,其他平台 item 从 0 开始,可使用第二个参数 index 来保持一致。
  • 在非H5平台 循环对象时不支持第三个参数,如 v-for="(value, name, index) in object" 中,index 参数是不支持的。
  • 小程序端数据为差量更新方式,由于小程序不支持删除对象属性,使用的设置值为 null 的方式替代,导致遍历时可能出现不符合预期的情况,需要自行过滤一下值为 null 的数据(相关反馈)。


    在组件上使用 v-for

在自定义组件上,你可以像在任何普通元素上一样使用 v-for

  1. <my-component v-for="item in items" :key="item.id"></my-component>

当在组件上使用 v-for 时,key是必须的

点击查看【bilibili】