列表渲染 v-for

列表渲染 v-for

在这里插入图片描述

<body>
    <div id="app">
        <h2>人员列表</h2>
        <ul>
            <!-- 遍历数组 -->
            <li v-for="p in persons" :key="p.id">
                {{p.name}}--{{p.age}}
            </li>
            <!-- <li v-for="(p,index) in persons" :key="index">
                {{p.name}}--{{p.age}}
            </li> -->
            <!-- 遍历对象 -->
            <!-- value是值,k是属性名称 index系统生产id 012-->
            <li v-for="(value,k,index) in car" :key="k">
                {{value}}--{{k}}-{{index}}
            </li>
        </ul>
    </div>
    <script type="text/javascript">
        new Vue({
            el:'#app',
            data:{
                persons:[
                    {id:'001',name:'张三',age:'13'},
                    {id:'002',name:'赵四',age:'121'},
                    {id:'003',name:'王五',age:'121'},
                ],
                car:{
                    name:"车",
                    inde:'abc'
                }
            },
        })
    </script>
</body>

列表渲染的原理

用index 作为:key

在数据生成虚拟dom的时候,会与旧的虚拟dom对比,
kye相同,input所有标签相同,
直接复用原始虚拟dom的value值
在这里插入图片描述

用id 作为:key

避免重复,重复key值复用,不重复的key 创建新的真是dom
在这里插入图片描述

<body>
    <div id="app">
        <h2>人员列表</h2>
        <!-- 按钮一次性 once -->
        <button @click.once="add"> 添加一个老刘</button>
        <ul>
            <!-- 遍历数组 key给节点做标识,key在页面上看不到被vue征用了-->
            <li v-for="p in persons" :key="p.id">
                {{p.name}}--{{p.age}}
                <input type="text">
            </li>
            <!-- 有问题,增加一个的时候,index做key会出错 -->
            <!-- <li v-for="(p,index) in persons" :key="index">
                {{p.name}}--{{p.age}}
                <input type="text">
            </li> -->
        </ul>
    </div>
    <script type="text/javascript">
        new Vue({
            el:'#app',
            data:{
                persons:[
                    {id:'001',name:'张三',age:'13'},
                    {id:'002',name:'赵四',age:'121'},
                    {id:'003',name:'王五',age:'121'},
                ],
            },
            methods: {
                add(){
                    const p = {id:'004',name:'老刘',age:40}
                    // 向数组头插入一条数据
                    // this.persons.unshift(p)
                    // 向数组结尾插入
                    this.persons.push(p)

                }
            },
        })
    </script>
</body>

在这里插入图片描述

列表过滤

<div id="app">
        <h2>人员列表</h2>
        <input type="text" placeholder="请输入姓名" v-model="keyWoder">
        <ul>
            <!-- 遍历数组 -->
            <li v-for="p in filPersons" :key="p.id">
                {{p.name}}--{{p.age}}
            </li>
        </ul>
    </div>
    <script type="text/javascript">
        // 用watch实现
        // new Vue({
        //     el:'#app',
        //     data:{
        //         persons:[
        //             {id:'001',name:'马冬梅',age:13,sex:'女'},
        //             {id:'002',name:'周冬雨',age:121,sex:'女'},
        //             {id:'003',name:'周杰伦',age:121,sex:'男'},
        //             {id:'004',name:'温兆伦',age:21,sex:'男'},
        //         ],
        //         filPersons:[],
        //         keyWoder:''
        //     },
        //     watch:{
        //         keyWoder:{
        //             immediate:true,
        //             handler(val){
        //                 this.filPersons = this.persons.filter((p)=>{
        //                     return p.name.indexOf(val) !== -1
        //                  // return p.age > 14
        //                 })
        //             }
        //         }
        //     }
        // })

        // 计算属性computed实现
        new Vue({
            el:'#app',
            data:{
                persons:[
                    {id:'001',name:'马冬梅',age:13,sex:'女'},
                    {id:'002',name:'周冬雨',age:121,sex:'女'},
                    {id:'003',name:'周杰伦',age:121,sex:'男'},
                    {id:'004',name:'温兆伦',age:21,sex:'男'},
                ]
                ,
                keyWoder:''
            },
            // 计算属性,初始化时调用一次;依赖的属性变化,也会调用
            computed:{
                filPersons(){
                    return this.persons.filter((p)=>{
                        return p.name.indexOf(this.keyWoder) !== -1
                    })
                }

            }
        })
    </script>

列表排序

<div id="app">
        <h2>人员列表</h2>
        <input type="text" placeholder="请输入姓名" v-model="keyWoder">
        <button @click="buttonNums = 0">原顺序</button>
        <button @click="buttonNums = 1">降序</button>
        <button @click="buttonNums = 2">升序</button>
        <ul>
            <!-- 遍历数组 -->
            <li v-for="p in filPersons" :key="p.id">
                {{p.name}}--{{p.age}}
            </li>
        </ul>
    </div>
    <script type="text/javascript">

        // 计算属性computed实现
        new Vue({
            el:'#app',
            data:{
                buttonNums:0,
                persons:[
                    {id:'001',name:'马冬梅',age:13,sex:'女'},
                    {id:'002',name:'周冬雨',age:12,sex:'女'},
                    {id:'003',name:'周杰伦',age:21,sex:'男'},
                    {id:'004',name:'温兆伦',age:11,sex:'男'},
                ]
                ,
                keyWoder:''
            },
            // 计算属性,初始化时调用一次;依赖的属性变化,也会调用
            computed:{
                filPersons(){
                    const nums =  this.persons.filter((p)=>{
                        return p.name.indexOf(this.keyWoder) !== -1
                    })
                    // 排序
                    if(this.buttonNums){
                        console.log(this.buttonNums)
                        nums.sort((a,b)=>{
                            // 前面减去后面升序,后面减去前面,降序
                            return this.buttonNums === 1 ? a.age-b.age : b.age-a.age
                        })
                    }
                    return nums
                }

            }
        })
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值