Vue笔记(2)-列表渲染(未完)

本文详细探讨Vue的v-for指令,包括数组和对象的迭代,数组和对象更新检测的注意事项,显示过滤与排序结果的方法,以及v-for与v-if的结合使用在组件中的应用。重点介绍了如何正确地使用key属性确保列表渲染的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.v-for:列表渲染

  一、把一个数组对应为一组元素

    1、v-for :根据一组数组的选项列表进行渲染。

     v-for 指令需要使用 item in items 形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名。

<div id="app_1">
    <ul>
        <li v-for="food in foodList">{{food.name+":"+food.price}}</li>
    </ul>
</div>
var app1=new Vue({
    el:"#app_1",
    data:{
        foodtime:"今日菜价",
        foodList:[
            {name:"葱",price:10},
            {name:"姜",price:5},
            {name:"蒜",price:8},
        ]
    }
})

       2、在 v-for 块中,我们拥有对父作用域属性的完全访问权限v-for 还支持一个可选的第二个参数为当前项的索引。

        item in items中in可以用of代替

<ul>
  <li v-for="(food,index) in foodList">{{foodtime}}-{{index}}-{{food.name}}-{{food.price}}</li>
</ul>

二、一个对象的 v-for

   1、用v-for通过一个对象的属性迭代

<ul id="v-for-obj">
    <li v-for="info in food">{{info}}</li>
</ul>
new Vue({
    el:"#v-for-obj",
    data:{
        food:{
            name:"葱",
            price:10
        }
    }
})

   2、提供第二个可选参数key

<ul id="v-for-obj">
    <li v-for="(info,key) in food">{{key}}:{{info}}</li>
</ul>

   3、第三个可选参数index

<ul id="v-for-obj">
    <li v-for="(info,key,index) in food">{{index}}.{{key}}:{{info}}</li>
</ul>

遍历对象,按照object.keys()的结果遍历,但是不能保证在不同的js引擎下结果相同。

   4、属性key(:key):建议尽可能在使用v-for时提供key

      key的作用 https://www.zhihu.com/question/61064119

      理想的 key 值是每项都有的唯一 id(最好不要使用index),它的工作方式类似于一个属性,所以你需要用 v-bind 来绑定动态值

<div v-for="item in items" :key="item .id">
  <!-- 内容 -->
</div>

三、数组更新检测

1.变异方法

 会改变方法调用的原始数组,可以触发视图更新

push()      //数组末尾添加
pop()       //删除数组的最后一个元素
shift()     //删除数组的第一个元素
unshift()   //数组的开头添加元素
splice()    //从数组添加/删除项目
sort()      //数组的元素进行排序,并返回数组
reverse()   //数组反转

2.替换数组

不会改变原始数组,返回一个新数组

filter()   //把数组的某些元素过滤掉,返回剩下的元素
contat()   //连接两个或多个数组
slice()    //从已有的数组中返回选定的元素

3.注意事项

    由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

   (1)利用索引直接设置一个项时,例如:vm.items[indexOfItem]=newValue

   (2)当你修改数组的长度时,例如:vm.items.length=newLength

var vm = new Vue({
  data: {
    items: ['a', 'b', 'c']
  }
})
vm.items[1] = 'x' // 不是响应性的
vm.items.length = 2 // 不是响应性的

 解决上面问题并且触发状态更新的方法,

(1) Vue.set(vm.items, indexOfItem, newValue)
   = vm.$set(vm.items, indexOfItem, newValue)
   = vm.items.splice(indexOfItem, 1, newValue)

(2)vm.items.splice(newLength)

四、对象更改检测注意事项

 由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除

var vm = new Vue({
  data: {
    a: 1
  }
})
// 'vm.a' 现在是响应式的

vm.b = 2
// 'vm.b' 不是响应式的

1.对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性。例如

var vm = new Vue({
  data: {
    userInfo: {
      name: 'Anika'
    }
  }
})

你可以添加一个新的 age 属性到嵌套的 userInfo 对象:

 Vue.set(vm.userInfo, 'age', 27)
=vm.$set(vm.userInfo, 'age', 27)

2.为已有对象赋予多个新属性,比如使用了object.assign()或者_.extend()。这种情况要用两个对象的属性创建一个新的对象,so

(这里还不太明白,没用过object.assign(),先做标记)

vm.userInfo=Object.assign({},vm.userInfo,{
    age:27,
    name:"join"
})

五、显示过滤/排序结果

(1)计算属性:想要显示一个数组的过滤或排序副本,不改变原始数据,因此需要创建返回过滤或排序数组的计算属性。

<li v-for="n in evenNumbers">{{ n }}</li>
data:{
    numbers:[1,2,3,4,5]
},
computed:{
    evenNumbers:function(){
        return this.numbers.filter(function(number){
            return number %2 === 0
        })
    }
}

(2)method方法:在计算属性不适用的情况下,(例如,嵌套v-for循环中)可以使用一个method方法:

<li v-for="n in even(numbers)">{{n}}</li>
data{
    numbers:[1,2,3,4,5]
},
methods:{
    even:function(numbers){
        return numbers.filter(function(number){
            return number % 2 === 0
        })
    }
}

六、一段取值范围的 v-for

<div>
    <span v-for="n in 6">{{n}}</span>
</div>

结果:1 2 3 4 5 6

七、v-for on a <template>

类似于 v-if,你也可以利用带有 v-for 的 <template> 渲染多个元素。

<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider" role="presentation"></li>
  </template>
</ul>

八、v-for width v-if

1.当处于同一节点时,v-for的优先级比v-if更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。当你想为仅有的一些项渲染节点时,这种优先级的机制会十分有用,如下:

<li v-for="todo in todos" v-if="!todo.isComplete">{{todo}}</li>

上面的代码只传递了未完成的 todos。

2.若你的目的是有条件的跳过循环的执行,那么可以将v-if置于外层元素(或<template>)。

<ul v-if="todo.length">
    <li v-for="todo in todos">{{todo}}</li>
</ul>
<p v-else>No todos left!</p>

九、一个组件的v-for 

这一点等我学习了组件理解之后添加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值