当前位置: 首页 > news >正文

条件渲染(v-if、v-show)、列表渲染(v-for)、列表中key的原理和作用、列表过滤(filter)、列表排序(sort)

目录

一、条件渲染

    1.v-if

    2.v-show

     3.template

二、列表渲染

    1.v-for

        遍历数组

      遍历对象

遍历字符串

遍历指定次数

三、v-for中key作用和原理

情景

 改正

总结key

    1.虚拟DOM中key的作用

     2.对比规则

    3.用index作为key可能引发的问题

     4.开发中如何选择key?

四、列表过滤

  1.watch案例

  2.computed案例

五、列表排序


一、条件渲染

    当符合某个条件后,我们就选用某种样式

    1.v-if

        适用于:切换频率较低的场景

        特点:不展示的DOM元素直接被移除,在页面源码中无法看到

        注意:v-if,v-else-if 、  else if,div要紧紧的挨在一起,不能打断 -

            <!--  v-else-if 类似java中if  else if判断 -->
            <!-- 这四个div要紧紧的挨在一起,不能打断 -->
            <div v-if="n===1" >Angular</div>
            <div v-else-if="n===2" >React</div>
            <div v-else-if="n===3" >Vue</div>
            <div v-else >6666666</div>

      

<!-- 使用v-if做条件渲染:在网页查看源码时,将不会看到下面这个html语句 -->
            <h2 v-if="false">欢迎来到{{name}}学习</h2>

    2.v-show

            写法:v-show=“表达式”

            适用于:切换频率较高的场景

            特点:不展示DOM元素未被移除,仅仅是使用上市隐藏掉

            备注:使用v-if时,元素可能无法获取到,而使用v-show一定可以获取到

            <!-- 使用v-show做条件渲染:确切的说这个底层是display:none -->
            <h2 v-show="false">欢迎来到{{name}}学习</h2>

   

     3.template

        当我们对某几个标签添加相同的样式的时候,我们就可以使用template标签,在标签上添加v-if属性

         好处:不影响整体样式。

         备注:template标签不影响整体结构,只是把下面这三个标签给包裹起来,在页面查看源码的时候也不会发现template标签

       此标签只能使用v-if,不能使用v-show

             <!-- template标签不影响整体结构,只是把下面这三个标签给包裹起来,在页面查看源码的时候也不会发现template标签
                   此标签只能使用v-if,不能使用v-show -->
             <template v-if="n===1">
                <h2>你好</h2>
                <h2>中国</h2>
                <h2>北京</h2>
             </template>

二、列表渲染

    1.v-for

   用于展示列表数据

   语法:v-for="(item,index) in xxx" :key="yyy"

    可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少) 

        遍历数组

         v-for类似java中foreach遍历,persons里面有几个值,我们在页面就会呈现几个

         :key="p.id"让每一个li都有一个唯一的标识,类似数据库中的主键

       {{p}}  这么输出的话,会把数据直接输出,我们一般不这样

                <li v-for="p in persons" :key="p.id">
                    <!-- {{p}}  这么输出的话,会把数据直接输出,我们一般不这样 -->
                    {{p.name}}-{{p.age}}
                </li>

                 index就是索引值,这个地方会有索引值,类似数组的下标
                :key="p.id"  这个地方不用p.id也可以,我们使用index ,因为index也是唯一的,类似数组下标
                :key这个标签特别重要,动态绑定数据

            <ul>

                <li v-for="(p,index) in persons" :key="index">
                    <!-- {{p}}  这么输出的话,会把数据直接输出,我们一般不这样 -->
                    {{p.name}}-{{p.age}}-{{index}}
                </li>
            </ul>

                     如果要有顺序的话,就需要数组来存储
                     这里的id类似数据库中的主键

                data:{

                  persons:[
                    {id:'001',name:'张三',age:18},
                    {id:'002',name:'李四',age:18},
                    {id:'003',name:'王五',age:20}
                  ]
                },

 

      遍历对象

     这里的对象直接就是value,不用和数组一样调用了


            <h2>汽车信息</h2>
            <ul>

                <li v-for="(value,k) in car" :key="k" >
                   
                    {{value}}-{{k}}
                </li>
            </ul>
                data:{

                  car:{
                    name:'奥迪A8',
                    price:"666666",
                    color:'黑色'
                  }
                },

 

遍历字符串

            <ul>
                <li v-for="(value,k) in str" :key="k" >
            
                    {{value}}-{{k}}
                </li>
            </ul>
   data:{
                    str:'hello'
     }

 

遍历指定次数

       <ul>
                <li v-for="(number,index) in 5" :key="index" >
            
                    {{number}}-{{index}}
                </li>
            </ul>

 

 

三、v-for中key作用和原理

    如果在写代码时并没有指定:key,我们会把index默认的作为key

   通过我们查看发现,我们在源代码中是有:key的,但是在网页上并不会显示,原因就是这个:key是vue内部在用,用完就干掉了

 

情景

如下,当我们下边代码  :keyindex的时候,会出现一系列的问题(不同的情景不一样,可能index不会出问题)

            <h2>人员列表</h2>
            <button @click="add">添加一个老刘</button>
            <ul>

                <li v-for="(p,index) in persons" :key="index">
                    <!-- {{p}}  这么输出的话,会把数据直接输出,我们一般不这样 -->
                    {{p.name}}-{{p.age}}-{{index}}
                    <input type="text">
                </li>
            </ul>

 

当我们在输入框中输入好内容,点击“添加一个老刘”,就会出现下列情况,文本框不会随着人名流动

 

 

 改正

 我们修改一下代码  :key="p.id",我们再运行一下程序就不会发生这种情况(正常运行)

            <h2>人员列表</h2>
            <button @click="add">添加一个老刘</button>
            <ul>
                <!-- index就是索引值,这个地方会有索引值,类似数组的下标 -->
                <!-- :key="p.id"  这个地方不用p.id也可以,我们使用index ,因为index也是唯一的,类似数组下标-->、
                <!-- :key这个标签特别重要,动态绑定数据 -->
                <li v-for="(p,index) in persons" :key="p.id">
                    <!-- {{p}}  这么输出的话,会把数据直接输出,我们一般不这样 -->
                    {{p.name}}-{{p.age}}-{{index}}
                    <input type="text">
                </li>
            </ul>

 

总结key

    1.虚拟DOM中key的作用

           key是虚拟对象的标识,当数据发生变化时,Vue会根据新数据生成新的虚拟DOM,随后Vue进行新虚拟DOM与旧虚拟DOM的差异比较

     2.对比规则

        ①旧虚拟DOM找到了与新虚拟DOM相同的key:

            若虚拟DOM中内容没变直接使用之前的真实DOM

             若虚拟DOM中内容变了,则生成新的真实DOM,随后替换掉页面中之前的真实DOM

 

        ②旧虚拟DOM中未找到与新虚拟DOM中相同的key

             创建新的真实DOM,随后渲染到页面

 

    3.用index作为key可能引发的问题

         ①若对数据进行逆序添加、逆序删除等破坏顺序操作:

             会产生没有必要的真实DOM更新==》界面效果没问题,但效率低

         ②如果结构中还包含输入类DOM:

             会产生错误DOM更新==》界面有问题

 

     4.开发中如何选择key?

         ①最好使用每条数据的唯一标识作为key,比如id、手机号、身份证号、学号等(类似数据库中主键)

         ②如果不存在对数据的逆序添加、逆序删除等破坏顺序的操作,仅用于渲染列表用于展示,使用index作为key是没有问题的

  

四、列表过滤

  1.watch案例

    使用watch监视keyWords

 初始界面:

当我们随便在框内输入时,下面就会显示我们想要查找的内容

 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title> 初识vue</title>
        <!--引入vue    引入之后,全局就多了一个vue这个构造函数-->
        <script type="text/javascript" src="../js/vue.js"></script> 
    </head>
    <body>
        <div id="root">
            <ul>
                <h2>人员列表</h2>
                <!-- 双向绑定一下 -->
                <input type="text" placeholder="请输入名字"  v-model="keyWords">
                <li v-for="(p,index) in  filPersons" :key="p.id" >
                    {{p.name}}-{{p.age}}-{{p.sex}}
                </li>
            </ul>

        </div>

        <script type="text/javascript">
            //阻止vue在启动时生成生产提示
            Vue.config.productionTip=false
            
            new Vue({
                el:'#root',
                data:{
                  keyWords:'',
                  persons:[
                    {id:'001',name:'马冬梅',age:19,sex:'女'},
                    {id:'002',name:'周冬雨',age:20,sex:'女'},
                    {id:'003',name:'周杰伦',age:21,sex:'男'},
                    {id:'004',name:'温兆伦',age:22,sex:'男'}
                  ],
                  filPersons:[]
                },
                watch:{
                    // 监视谁我们就写谁
                   keyWords:{
                    // 初始化时让handler调用一下,如果不调用的话,初始页面会没有内容
                    // 前提条件:所有的字符串.indexOf("")空字符串,返回值都是0
                     immediate:true,
                     handler(newValue,oldValue){
                        // 过滤
                        // filter规律之后,并不会影响我们初始的数组,而是生成一个全新的数组
                        //  我们不能更改直接赋值到原数组,否则会导致我们查询的内容越来越少,最后甚至没有了
                        this. filPersons= this.persons.filter((p)=>{
                            // 函数体
                            // return 后面加的语句使我们要的数据
                            // indexOf 方法,当含有括号内的字符串的时候,会返回下标是第几位(从零开始算
                            //              当不包含的时候,就会返回-1
                            return p.name.indexOf(newValue) !==-1
                        })
                     }
                   }
                },
                methods:{

                }
            })

        </script>   
    </body>
</html>

  2.computed案例

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title> 初识vue</title>
        <!--引入vue    引入之后,全局就多了一个vue这个构造函数-->
        <script type="text/javascript" src="../js/vue.js"></script> 
    </head>
    <body>
        <div id="root">
            <ul>
                <h2>人员列表</h2>
                <!-- 双向绑定一下 -->
                <input type="text" placeholder="请输入名字"  v-model="keyWords">
                <li v-for="(p,index) in  filPersons" :key="p.id" >
                    {{p.name}}-{{p.age}}-{{p.sex}}
                </li>
            </ul>

        </div>

        <script type="text/javascript">
            //阻止vue在启动时生成生产提示
            Vue.config.productionTip=false
            
          const vm=  new Vue({
                el:'#root',
                data:{
                  keyWords:'',
                  persons:[
                    {id:'001',name:'马冬梅',age:19,sex:'女'},
                    {id:'002',name:'周冬雨',age:20,sex:'女'},
                    {id:'003',name:'周杰伦',age:21,sex:'男'},
                    {id:'004',name:'温兆伦',age:22,sex:'男'}
                  ],
                 
                },

                computed:{
                    // 这个形式是缩写,当getter函数使用
                    // 初次读取的时候会调用一下,当依赖的数据发生变化时也会调用一下
                    filPersons(){
                        // 这个return是计算属性规定的
                        return this.persons.filter((p)=>{
                            // 这个return是filter规定的
                            return p.name.indexOf(this.keyWords) !==-1
                        })
                    }
                }
            })

        </script>   
    </body>
</html>

效果相同

五、列表排序

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title> 初识vue</title>
        <!--引入vue    引入之后,全局就多了一个vue这个构造函数-->
        <script type="text/javascript" src="../js/vue.js"></script> 
    </head>
    <body>
        <div id="root">
            <h2>人员列表</h2>
            <!-- 双向绑定一下 -->
            <input type="text" placeholder="请输入名字"  v-model="keyWords">
            <button @click="sortType=2" >年龄升序</button>
            <button @click="sortType=1" >年龄降序</button>
            <button @click="sortType=0" >原顺序</button>

            <ul>
                <li v-for="(p,index) in  filPersons" :key="p.id" >
                    {{p.name}}-{{p.age}}-{{p.sex}}
                </li>
            </ul>

        </div>

        <script type="text/javascript">
            //阻止vue在启动时生成生产提示
            Vue.config.productionTip=false
            
          const vm=  new Vue({
                el:'#root',
                data:{
                  keyWords:'',
                //   0原顺序 1降序 2升序
                  sortType:0,  
                  persons:[
                    {id:'001',name:'马冬梅',age:19,sex:'女'},
                    {id:'002',name:'周冬雨',age:20,sex:'女'},
                    {id:'003',name:'周杰伦',age:21,sex:'男'},
                    {id:'004',name:'温兆伦',age:22,sex:'男'}
                  ],
                 
                },

                computed:{
                    // 这个形式是缩写,当getter函数使用
                    // 初次读取的时候会调用一下,当依赖的数据发生变化时也会调用一下
                    filPersons(){
                        // 我们把这个地方的return取消,不着急return
                       const arr= this.persons.filter((p)=>{
                            // 这个return是filter规定的
                            
                            return p.name.indexOf(this.keyWords) !==-1
                        })

                        if(this.sortType){
                            // 运行到这里说明不是0
                            arr.sort( (p1,p2)=>{
                                // 三目运算
                                return this.sortType === 1 ? p2.age-p1.age : p1.age-p2.age
                            })
                        }
                        //当 this.sortType===0时,会直接跳过if来到这里(原始数据不会改变,所以就是原顺序
                        return arr
                    }
                }
            })

        </script>   
    </body>
</html>

原顺序:

 

 升序:

 降序

 

相关文章:

  • openarena
  • 【蓝桥杯省赛真题37】Scratch三国演义字数统计 少儿编程scratch编程蓝桥杯省赛真题讲解
  • Linux内核设计与实现 第三章 进程管理
  • Exception in thread “main“ java.lang.NoClassDefFoundError: org/apache/flink/
  • springboot项目整理(持续更新)
  • Linux Shell重定向 管道命令 awk编程 sed文件操作高阶函数
  • jQuery表单选择器:快速选择input标签
  • 6、Java——三种方式循环出水仙花数
  • 前端核心二:VUE
  • Javassist基本用法
  • 电子学会2022年6月青少年软件编程(图形化)等级考试试卷(一级)
  • 【Vue 基础知识】keep-alive是什么?怎么用?
  • 数据结构(四) -- 递归
  • C++的STL--->map和set容器的使用
  • 【Docker系列】Docker生产常用命令01
  • 自己简单写的 事件订阅机制
  • [译]CSS 居中(Center)方法大合集
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 03Go 类型总结
  • 2017-09-12 前端日报
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • JavaScript-Array类型
  • laravel5.5 视图共享数据
  • Less 日常用法
  • Yii源码解读-服务定位器(Service Locator)
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 深入浅出webpack学习(1)--核心概念
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 数据可视化之 Sankey 桑基图的实现
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 用Visual Studio开发以太坊智能合约
  • No resource identifier found for attribute,RxJava之zip操作符
  • AI算硅基生命吗,为什么?
  • ​2020 年大前端技术趋势解读
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (02)vite环境变量配置
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (第27天)Oracle 数据泵转换分区表
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (一)Neo4j下载安装以及初次使用
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)详解PHP处理密码的几种方式
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • @RequestBody的使用
  • [100天算法】-不同路径 III(day 73)
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [AIGC] Java 和 Kotlin 的区别
  • [Angular] 笔记 18:Angular Router
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [C进阶] 数据在内存中的存储——浮点型篇
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]