Vue的列表之渲染,排序,过滤详解


Posted in Vue.js onFebruary 24, 2022

1. 列表(渲染、排序、过滤)

1.1 条件渲染指令

有个小技巧:

​ 如果是查找对象中不存在的属性,返回的是一个undefined,利用这一个点不管是v-show或者是v-if,如果值等于undefined的就不显示,假设sex属性不存在

<p v-show="student.sex">性别:{{student.sex}}</p>

1.1.1 v-show

1.v-show的原理:通过display:none 对元素进行隐藏,当满足条件时去除display:none这个样式

2.适用的场景是:切换频率较高的场景

3.在使用v-show隐藏元素的时候是可以获取得到元素的,而v-if 是无法获取到元素的

1.1.2 v-if

1.v-if的原理:将整个节点移除,满足条件时添加节点

2.v-else、v-else-if 需要配合v-if去使用,但是结构不能被破坏

必须要先写v-if,例如:

v-if = "xxx"
v-else = "xxx"
---------------------
v-if = "xxx"
v-else-if = "xxx"
v-else = "xxx"

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

template

最大的特点就是不破坏结构但是只能与 v-if 进行配合使用

1.1.3 v-if和v-show的小案例

<div id="root">
        <h2>当前n的值为:{{n}}</h2>
        <button @click="n++">点击我n加1</button>

            <div class="box1" v-show = "true">你好啊!我是box1</div> 
            <div class="box1" v-show = "false">你好啊!我是box1</div> 
        		<div class="box1" v-show="n === 1">你好啊!box1</div>
        
            <div class="box2" v-if = "true">我是box2</div>
            <div class="box2" v-if = "false">我是box2</div> 

        		<div class="box2" v-if="n === 2">我是box2</div>

        <!-- 
            3. v-else-if  , v-else , v-if 的区别

            -  v-if必须先写,才能写v-else和v-else-if
            -  例如:
                v-if
                v-if
                v-if
                这样是进行3次判断
                -------------------------------
                v-if
                v-else-if
                v-else-if
                v-else
                只要有一个判断为真,下面的语句就不执行
                ----------------------------------
                v-else
                只要不满足v-if的条件就执行

         -->

         <div class="box3" v-if = "n===1">我是box31</div>  
         <div class="box3" v-else-if="n===1">我是box32</div>
         <div class="box3" v-else-if = "n===3">我是box33</div>
         <div class="box3" v-else>hhhhhhh</div>
					//当满足条件的时候只输出满足条件的值,例如本例子输出为 ‘我是box31'

         <!-- 
             需求:当n == 2时,在页面输出5句话
             4. template  
                - 最大的特点就是不破坏结构
                - 但是只能和 v-if进行配合使用
          -->

          <template v-if="n === 2">
              <h3>你好啊!</h3>
              <h3>猜猜我是谁?</h3>
              <h3>我是box4</h3>
              <h3>你猜对了吗?</h3>
              <h3>你真棒!</h3>
          </template>
    </div>


    <script>
        Vue.config.productionTip = false
        let vm = new Vue({
            el: '#root',
            data: {
                n: 0,
            }
        })
    </script>

1.1.4 v-for(key的原理)

特点:

1.可以遍历数组

2.可以遍历对象

3.可以遍历字符串

4.可以遍历次数(用的很少)

5.如果我们不写key,默认使用index

作用:用于展示列表的数据

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

key的原理:(很重要)

1.虚拟DOM中key的作用:

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

(1). 旧虚拟DOM中找到了与新虚拟DOM相同的key

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

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

(2). 旧虚拟DOM中未找到与新虚拟DOM相同的key直接创建新的真实DOM,随后渲染到到页面。

2.如果使用index作为key会引发以下的问题:

(1)如果发生逆序添加、逆序删除破坏了顺序操作就会产生没有必要的DOM更新而会造成达不到效果的问题

(2)如果输入结构包括了输入类的DOM元素,会产生更新问题比如:input的框的数据对不上等等

3.所以在开发的过程中key的使用最好是使用唯一能够标识的值作为key,比如id,Date.now(),nanoid这个包npm i nanoid等等

Vue的列表之渲染,排序,过滤详解

Vue的列表之渲染,排序,过滤详解

1.2 列表过滤

使用computed

<div id="root">
        <input type="text" placeholder="请输入关键字" v-model="keyword">
        <br>
        <ul>
            <li v-for="value in filtername" :key="value.id" >
                {{value.name}} -- {{value.age}} -- {{value.gender}}
            </li>
        </ul>
    </div>

    <script>
      Vue.config.productionTip = false
        let vm = new Vue({
            el: '#root',
            data: {
                arr: [
                    { id: "001", name: "马冬梅", age: 18, gender: "female" },
                    { id: "002", name: "周冬雨", age: 55, gender: "female" },
                    { id: "003", name: "周杰伦", age: 30, gender: "male" },
                    { id: "004", name: "郭艾伦", age: 30, gender: "male" },
                    { id: "005", name: "郭德纲", age: 30, gender: "male" },
                ],
                keyword:""
            },
            computed:{
                filtername:{
                    get(){
                        return this.arr.filter((currentval)=>{
                            return currentval.name.indexOf(this.keyword) !== -1
                        })
                    }
                }
            }
        })
    </script>

使用watch

<div id="root">
        <input type="text" placeholder="请输入关键字" v-model="keyword">
        <br>
        <ul>
            <li v-for="value in filearr" :key="value.id" >
                {{value.name}} -- {{value.age}} -- {{value.gender}}
            </li>
        </ul>
    </div>
    <script>
        /* 分享一个数组去重的方法
           var arr = [1,35,612,6546,1,51]
          var newarr = arr.filter((val,index)=>{
               return arr.indexOf(val,0) === index
          }) 
          console.log(newarr); 
        filter(function(current,index,arr){return xxx})
          - return : 写的是过滤的条件
          - 返回的是满足条件的元素
        indexOf:
          - 第一个参数是:要查询的元素
          - 第二个参数是:开始索引的位置
          - 它返回的值是当前元素的索引值,如果没有要查询的元素返回的是-1
        */
        Vue.config.productionTip = false
        let vm = new Vue({
            el: '#root',
            data: {
                arr: [
                    { id: "001", name: "马冬梅", age: 18, gender: "female" },
                    { id: "002", name: "周冬雨", age: 55, gender: "female" },
                    { id: "003", name: "周杰伦", age: 30, gender: "male" },
                    { id: "004", name: "郭艾伦", age: 30, gender: "male" },
                    { id: "005", name: "郭德纲", age: 30, gender: "male" },
                ],
                keyword:'',
                filearr:[]
            },
            /* 
                需求:当输入某一个关键字,输出相关的内容 
                思路:
                    1. 获取到用户输入的数据
                    2. 筛选输入的关键字是否在数据里面
            */
            // 先用watch写
            watch:{
                keyword:{
                    immediate:true, 
                    handler(newval,oldval){
                        this.filearr = this.arr.filter((currentval)=>{
                            return currentval.name.indexOf(newval) !== -1
                            /*
                                 这里有个细节:indexOf去判断 空字符串(不是空格) 时会返回0,
                                 所以整个列表都会出来
                                 例如:"asdf".indexOf("")   返回的是0
                                 所以需要向自调用一次使用immediate
                             */
                        })
                    }
                }
            }
        })

    </script>

1.3 列表排序

<div id="root">
        <h2>人员排序</h2>
        <input type="text" placeholder="请输入关键字" v-model="keyword">
        <button @click="type = 2">年龄升序</button>
        <button @click="type = 1">年龄降序</button>
        <button @click="type = 0">原顺序</button>
        <ul>
            <li v-for="val in filtername" :key="val.id">
                {{val.name}} -- {{val.age}} -- {{val.gender}} 
            </li>
        </ul>
    </div>
    <script>
        Vue.config.productionTip = false
        let vm = new Vue({
            el: '#root',
            data: {
                arr: [
                    { id: "001", name: "马冬梅", age: 18, gender: "female" },
                    { id: "002", name: "周冬雨", age: 55, gender: "female" },
                    { id: "003", name: "周杰伦", age: 50, gender: "male" },
                    { id: "004", name: "郭艾伦", age: 59, gender: "male" },
                    { id: "005", name: "郭德纲", age: 30, gender: "male" },
                ],
                keyword:"",
                type:0
            },
            computed:{
                filtername:{
                    get(){
                        let arr = this.arr.filter((current)=>{
                            return current.name.indexOf(this.keyword) !== -1
                        })
                        arr.sort((a,b)=>{
                            /* 
                                a永远在b前面
                                如果返回的值是大于0则交换位置,小于等于0不交换位置
                                return a-b 升序
                                return b-a 降序
                             */
                            if(this.type)
                            {
                                return this.type == 1 ? b.age - a.age : a.age - b.age 
                            } 
                        })
                        return arr
                    }
                }
            }
        })
    </script>

总结

以上就是今天要讲的内容,本文介绍了和列表(渲染、排序、过滤)相关的知识,希望对大家有所帮助!

Vue.js 相关文章推荐
vue element-ul实现展开和收起功能的实例代码
Nov 25 Vue.js
Vue router传递参数并解决刷新页面参数丢失问题
Dec 02 Vue.js
vue el-upload上传文件的示例代码
Dec 21 Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
vue动态设置路由权限的主要思路
Jan 13 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
如何理解Vue前后端数据交互与显示
May 10 Vue.js
详解Vue router路由
Nov 20 Vue.js
详解Vue的列表渲染
Nov 20 Vue.js
Element-ui Layout布局(Row和Col组件)的实现
Dec 06 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
Vue3如何理解ref toRef和toRefs的区别
Feb 18 #Vue.js
Vue h函数的使用详解
Feb 18 #Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 #Vue.js
前端vue+express实现文件的上传下载示例
一篇文章告诉你如何实现Vue前端分页和后端分页
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 #Vue.js
vue3获取当前路由地址
Feb 18 #Vue.js
You might like
PHP编实现程动态图像的创建代码
2008/09/28 PHP
php输出图像的方法实例分析
2017/02/16 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
php使用QueryList轻松采集js动态渲染页面方法
2018/09/11 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
Python读写ini文件的方法
2015/05/28 Python
在类Unix系统上开始Python3编程入门
2015/08/20 Python
python获取list下标及其值的简单方法
2016/09/12 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
Python之reload流程实例代码解析
2018/01/29 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
苹果Mac升级:MacSales.com
2017/11/20 全球购物
护理自我鉴定范文
2013/10/06 职场文书
美德少年事迹材料
2014/01/23 职场文书
投标邀请书范文
2014/01/31 职场文书
自主招生学校推荐信
2014/09/26 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
公务员政审材料范文
2014/12/23 职场文书
走近毛泽东观后感
2015/06/04 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
教师理论学习心得体会
2016/01/21 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis