绑定class,条件渲染,列表过滤,列表排序

news2024/9/24 17:36:19

目录​​​​​​​

绑定class

条件渲染

列表过滤

列表排序

绑定class

<div class="normal" :class="mood" @click="changename">111{{name}}</div>
        <div class="normal" :class="arr">111{{name}}</div>

本来class只能出现一个,但是现在:class代表绑定,后面是表达式就行

dom操作通过vue实例里data来动态绑定

1 如果class后是对象,说明参数个数和名字都确定

2 后是数组,说明动态绑定

3 后是字符串

<script type="text/javascript">
    Vue.config.productionTip = false
    const vm = new Vue({
        el: '#root',
        data: {
            name: 'what',
            mood: 'normal',
            arr: ['happy', 'sad']
        },
        methods: {
            changename() {
                alert('i change')
                this.mood = 'happy'
                // 不用操作dom,只要把与vue关联的数据改了,让vue来操作dom
            }
        }
        // vm.arr.shift()移除数组第一个元素


    })

</script>

条件渲染

v-show后面是表达式,并且是display为none不是真的删除

但是v-if后面表达式,则没的很彻底

<h2 v-if="false">111</h2>
<body>
    <div id="root">
        <h2 v-show="1===3">333{{name}}</h2>

    </div>

</body>
<script type="text/javascript">
    Vue.config.productionTip = false
    const vm = new Vue({
        el: '#root',
        data: {
            name: 'fansi'
        }
    })

</script>

简单交互,点击后n自增

<h2>{{n}}</h2>
<h2 v-show="1===1" @click="n++">{{name}}dianwo</h2>


const vm = new Vue({
        el: '#root',
        data: {
            name: 'fansi',
            n: 0
        }
    })

 <div id="root">
        <h2>{{n}}</h2>
        <button @click="n++">dianwo{{n}}</button>
        <h2 v-show="n===1">react</h2>
        <h2 v-show="n===2">angular</h2>
        <h2 v-show="n===3">vue</h2>

很高的变化频率用v-show

v-else-if

v-else后面别跟条件

如果用v-if,v-else-if,v-else则三者之间不能被打断,即插入别的,不然打断后面的都不奏效

如果想一系列同时出现,用template,不影响结构

<template v-if="1===1">
        <h2>11</h2>
        <h2>12</h2>
        <h2>13</h2>
    </template>

但是template只能配合v-if不能配合v-show

v-for

v-for加在谁身上遍历谁,数组长度多长就多少次

总结:

1 用于展示列表数据

2 v-for="(item,index) in xxx" :key="xxx"

3 可遍历:数组,对象,字符串

<body>
    <div id="root">
        <h2>人员列表</h2>
        <ul>
            <li v-for="p in persons" :key="p.id">
                <!-- 让每个li都有了唯一的标识? -->
                {{p.name}}-{{p.age}}
                姓名-年龄
            </li>
            <li v-for="(p,index) in persons" :key="index">
                {{p.name}}--{{p.age}}
                <!-- 这里key其实只要找一个对每次生成的标识都会不一样的东西就行 -->
            </li>
            <!-- v帮你循环,person理解为形参,persons长度是多少就能生成多少个li -->

        </ul>

        <!-- 遍历对象 -->

        <ul>
            <li v-for="p in persons" :key="p.id">
                <!-- 让每个li都有了唯一的标识? -->
                {{p.name}}-{{p.age}}
                姓名-年龄
            </li>
            <li v-for="(value,k) of car" :key="k">
                <!-- 这里in和of都行,先收到的是value -->
                {{k}}--{{value}}
                <!-- 这里key其实只要找一个对每次生成的标识都会不一样的东西就行 -->
            </li>
            <!-- v帮你循环,person理解为形参,persons长度是多少就能生成多少个li -->

        </ul>
        <!-- 测试遍历指定次数 -->
        <ul>
            <li v-for="(a,b) of 5" :key="b">
                <!-- 让每个li都有了唯一的标识? -->
                {{a}}-{{b}}
                <!-- a就是从1开始计数,b从0开始计数但是b就是index索引值 -->
                姓名-年龄
            </li>
            <li v-for="(value,k) of car" :key="k">
                <!-- 这里in和of都行,先收到的是value -->
                {{k}}--{{value}}
                <!-- 这里key其实只要找一个对每次生成的标识都会不一样的东西就行 -->
            </li>
            <!-- v帮你循环,person理解为形参,persons长度是多少就能生成多少个li -->

        </ul>

    </div>


</body>
<script type="text/javascript">
    Vue.config.productionTip = false
    const vm = new Vue({
        el: '#root',
        data: {
            persons: [
                { id: '001', name: 'zhangsn', age: 18 },
                { id: '002', name: 'lisi', age: 18 },
                { id: '003', name: 'wangw', age: 20 }
            ],
            car: {
                name: 'aodi',
                price: '70',
                color: 'pink'
            }

        }
    })

</script>

如果key写了该怎么处理:虚拟dom对比算法(diff)

如果没写key该怎么处理:将遍历时候的索引值index自动作为key

react,vue中的key有什么用:
1 虚拟dom中key作用:数据变化时候,vue根据新数据生成新的虚拟dom
如果旧的虚拟dom找到与新的虚拟dom相同的key,如果内容没变直接使用已经转的真实dom(复用dom节点)
-对比key一样但内容不一样,还有就是旧的没找到,直接创新的

将index作为key:如果对数据进行逆序添加,逆序删除等破坏顺序操作,产生没有必要的dom更新,效率低;一旦有输入类dom(input等),就会串行


最好使用能够唯一标识的作为key

列表过滤

1用watch实现:

解决问题关键:过滤条件为空''时候返回的是整个数组

所以用watch完整形式实现,加了immediate能在一开始输入为空时候就执行一次handler

用indexOf表示返回数组里是否包含某个值

const vm = new Vue({
            el: '#root',
            data: {
                keyWord: '',
                persons: [
                    { id: '001', name: '马冬梅', age: 18 },
                    { id: '002', name: '周冬雨', age: 19 },
                    { id: '003', name: '周杰伦', age: 18 }
                ], filpersons: []

            },
            watch: {
                keyWord: {
                    immediate: true,
                    //不等输入已经调用一次handler
                    handler(val) {
                        this.filpersons = this.persons.filter((p) => {
                            // p是每个人的对象
                            return p.name.indexOf(val) !== -1//判断是否包含用indexof,只要不等于-1
                            //filter会返回一个全新数组,persons变了重新解析模板
                        })
                    }
                    // 非常关键点:在一个数组上indexof一个''空字符串出来的是0
                }
            }
        })

新建一个filpersons存过滤后的数组,由于filter函数是通过返回新的数组但对原数组没有修改的方式进行过滤的

indexof意思是找数组里是否包含val并返回index值,只要不是-1就意味着有

2 computed实现(能用computed实现尽量用从他)

出现问题:watch实现能获得用户输入的新旧值,computed可以通过this.keyword来获得

#region 和#endregion在vscode里能让一段代码隐藏

const vm = new Vue({
        el: '#root',
        data: {
            keyWord: '',
            persons: [
                { id: '001', name: '马冬梅', age: 18 },
                { id: '002', name: '周冬雨', age: 19 },
                { id: '003', name: '周杰伦', age: 18 }
            ]

        },
        computed: {
            filpersons() {
                return this.persons.filter((p) => {
                    return p.name.indexOf(this.keyWord) !== -1
                    //判断是否包含用indexof,只要不等于-1
                    //                         //filter会返回一个全新数组,persons变了重新解析模板
                })
                // 注意只有监控时候能收到新旧值,新数组值作为filperson的值,直接return
                // 第一个return是计算属性规定的,第二个return是filter规定的,只有返回值才知道filperson是什么
            }
        }


    })

列表排序

注意,对于数组排序:

arr=[1,2,4,3,5,3]
arr.sort((a,b)=>{
return a-b
}
)

这里a和b是获得的前后两个项,现在a-b是升序

 <input type="text" placeholder="input please" v-model="KeyWord">
        <button @click="sortType=2">increase sort</button>
        <button @click="sortType=1">decrease sort</button>
        <button @click="sortType=0">origin</button>
new Vue({
        el: '#root',
        data: {
            keyWord: '',
            sortType: 0,
            persons: [
                { id: '001', name: '马冬梅', age: 18 },
                { id: '002', name: '周冬雨', age: 19 },
                { id: '003', name: '周杰伦', age: 18 }
            ]

        },
        computed: {
            filpersons() {
              const arr =  this.persons.filter((p) => {
                    return p.name.indexOf(this.keyWord) !== -1
                    //判断是否包含用indexof,只要不等于-1
                    //                         //filter会返回一个全新数组,persons变了重新解析模板
                })
                // 注意只有监控时候能收到新旧值,新数组值作为filperson的值,直接return
                // 第一个return是计算属性规定的,第二个return是filter规定的,只有返回值才知道filperson是什么
                // 先过滤再排序
                if(this.sortType){
                    arr.sort((a,b)=>{
                        return this.sortType===1?p2.age-p1.age: p1.age - p2.age

// sort排序能收到前后两个数据项
                    })
                }
                return arr
            }
        }


    })

</script>

加了两个按钮,data里一个sorttype进行判断,注意computed要返回值

vue里的监控功能

Object.defineProperty(data,'name',{
	get(){
	return data.name
	读溢出,改uncaught
	原因:你想获取值调用get,调用get后又return data.name意味着又要调用get进入死循环,set也是同理
	},
	set(val){

	}
const obs=new Observer(data)创建一个监视的实例对象,监视data中属性变化

function observer(obj){
const keys=object.keys()
	
}

可以用observer进行模拟

通过setter实现监视,要在new vue时候就传入要检测的数据
对象后追加属性,vue默认不响应式处理
why:_data收集data中数据前先加工,给每个数据匹配一个getter和setter

vue.set只能给data某个对象增加属性,不能对vm或者vm根数据对象增加属性
如果要响应式处理:

vue.set(target,propertyname/index,value)
vm.$set(target,propertyname/index,value)
<h2>{{whatt}}</h2>
<div @click="addwhat">123</div>
methods:{
	addwhat(){
	Vue.set(this.whatt,
	'name','guess')
	}
}

vue检测数组中数据
vue修改数组中某个元素实现响应式一定用如下方法:
api:(1)push(),pop(),shift(),unshift(),splice(),sort(),reverse()
(2)vue.set()/vm.$set也能实现响应式第二个参数写索引,第三个写元素

总结:
1 单独改每个属性,因为vue能检测到对象里每个属性
2 将数组中元素单独替换,数据修改成功但vue不能检测到,因为数组元素没有getter和setter,修改数组中元素无法实现响应式
3 更改数组实现响应式,应该调用数组api或者vue.set

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1397523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用golang对接微软Azure AI翻译

文章目录 一、官方地址二、准备工作三、代码示例 一、官方地址 https://learn.microsoft.com/zh-CN/azure/ai-services/translator/translator-text-apis?tabsgo 二、准备工作 创建服务 创建服务连接地址&#xff1a;https://portal.azure.com/#create/Microsoft.CognitiveS…

零基础学Python(3)— 注释、代码缩进和编码规范

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在使用Python语言进行编程的时候&#xff0c;需要遵循一定的规范标准。本节课就带大家了解下Python语言在注释、缩进和编码方面的规范!~&#x1f308; 目录 &#x1f680;1.注释 &#x1f680;2.代码缩进 &#x1f68…

1.15io网络

子网掩码 1.由于对于一个网络下面的主机号还是很庞大&#xff0c;为了进一步划分网络&#xff0c;我们可以将主机号再次进行划分为两部分&#xff0c;分别是网段号和主机号 2.此时就引入的子网掩码的概念 3. 在引入子网掩码后&#xff0c;IP 网络号 子网号 主机号 4.子网…

UI设计中的插画运用优势(上)

1. 插画是设计的原创性和艺术性的基础 无论是印刷品、品牌设计还是UI界面&#xff0c;更加风格化的插画能够将不同的风格和创意加入其中&#xff0c;在激烈的竞争中更容易因此脱颖而出。留下用户才有转化。 2. 插画是视觉触发器&#xff0c;瞬间传达大量信息 我们常说「一图胜千…

【ARMv8M Cortex-M33 系列 7.1 -- xPSR | CFSR | HFSR | BFAR | MMFAR 寄存器】

文章目录 问题背景Cortex-M33 Fault 寄存器介绍xPSR (程序状态寄存器)CFSR (可配置故障状态寄存器)HFSR (硬件故障状态寄存器)BFAR (总线故障地址寄存器)MMFAR (内存管理故障地址寄存器) 问题背景 由于在RA4M2&#xff08;Cortex-M33&#xff09;移植RT-Thread OS的时候遇到了…

数据结构和算法笔记4:排序算法-归并排序

归并排序算法完全遵循分治模式。直观上其操作如下&#xff1a; 分解&#xff1a;分解待排序的n个元素的序列成各具n/2个元素的两个子序列。解决&#xff1a;使用归并排序递归地排序两个子序列。合并&#xff1a;合并两个已排序的子序列以产生已排序的答案。 我们直接来看例子…

ubuntu-20.04.6-live-server-amd64安装教程-完整版

简介 Ubuntu 20.04.6 Live Server AMD64 安装教程 - 完整版" 提供了详细的指南&#xff0c;旨在帮助用户在使用 AMD64 架构的服务器上安装 Ubuntu 20.04.6 Live Server 版本。该教程包含全面的步骤和详细说明&#xff0c;使用户能够顺利完成整个安装过程&#xff0c;建立…

力扣70. 爬楼梯(动态规划 Java,C++解法)

Problem: 70. 爬楼梯 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 由于本题目中第i层台阶只能由于第i- 1层台阶和第i-2层台阶走来&#xff0c;所以可以联想到动态规划&#xff0c;具体如下&#xff1a; 1.定义多阶段决策模型&#xff1a;对于每一上台阶看作一种状…

【LGR-172-Div.4】洛谷入门赛 #19(A—H,c++详解!)

文章目录 【LGR-172-Div.4】洛谷入门赛 #19A.分饼干 I题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例解释 1样例解释 2数据范围与约定思路: 代码 B.分饼干 II题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样…

SpringMVC基础知识学习笔记

Universe Infinity Inc. 目录 一、学习SpringMVC主要是学什么1、SpringMVC的基本原理2、SpringMVC学习串联 二、快速体验SpringMVC的开发1、新建项目&#xff0c;转成web项目2、引入依赖3、编写Spring的配置类4、配置web启动类&#xff0c;替代web.xml5、编写Handler&#xff…

助力焊接场景下自动化缺陷检测识别,基于YOLOv3模型开发构建工业焊接场景下缺陷检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景&#xff0c;在我们前面的博文开发实践中也有一些相关的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《轻量级模型YOLOv5-Lite基于自己的数据集【焊接质量检测】从零构建模型超详细教程》 《基于DeepLabV3Pl…

令牌桶算法与Guava的实现RateLimiter源码分析

令牌桶算法与Guava的实现RateLimiter源码分析 令牌桶RateLimiter简介RateLimiter使用示例导入maven依赖编写测试代码 RateLimiter的实现源码解析SmoothRateLimiterSmoothBursty恒速获取令牌acquire(int)tryAcquire(int,long,TimeUnit) 存量桶系数小结 优缺点与漏桶的区别总结 令…

01-开始Rust之旅

1. 下载Rust 官方推荐使用 rustup 下载 Rust&#xff0c;这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要连接互联网。 这边提供了离线安装版本。本人学习的机器环境为&#xff1a; ubuntu x86_64&#xff0c;因此选用第②个工具链&#xff1b; 1. rust-1.75.0-x86_…

CloudPanel RCE漏洞复现(CVE-2023-35885)

0x01 产品简介 CloudPanel 是一个基于 Web 的控制面板或管理界面,旨在简化云托管环境的管理。它提供了一个集中式平台,用于管理云基础架构的各个方面,包括虚拟机 (VM)、存储、网络和应用程序。 0x02 漏洞概述 由于2.3.1 之前的 CloudPanel 具有不安全的文件管理器 cook…

【JSON2WEB】01 WEB管理信息系统架构设计

WEB管理信息系统分三层设计&#xff0c;分别为DataBase数据库、REST2SQL后端、JSON2WEB前端&#xff0c;三层都可以单独部署。 1 DataBase数据库 数据库根据需要选型即可&#xff0c;不需要自己设计开发&#xff0c;一般管理信息系统都选关系数据库&#xff0c;比如Oracle、…

beego的模块篇 - I18n国际化

1. i18n 安装导入 安装该模块&#xff1a; go get github.com/beego/i18n 导入引用包&#xff1a; import ("github.com/beego/i18n" ) conf 目录下就有 locale_en-US.ini 和 locale_zh-CN.ini 两个本地化文件。 本地化文件的文件名和后缀是随意的&#xff0c;不…

C++_Lambda表达式的完整介绍

目录 1. 什么是Lambda表达式 1.1 四种表达式的含义 1.2 lambda表达式各个成员的解释 2. 捕获列表 3. 编译器如何看待Lambda表达式 参考文章 参考: C Lambda表达式的完整介绍 - 知乎 c在c11标准中引入了lambda表达式&#xff0c;一般用于定义匿名函数&#xff0c;使得代码…

超过GPT3.5?Mixtral 8*7B 模型结构分析

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 前言 2023年12月11日&#xff0c;Mistral AI团队发布了一款高质量的稀疏专家混合模型Mixtral 8x7B。 Mistral AI继续致力于向开发者社区提供最优秀的开放模型。在人工智能领域向前发展&#xff0c;需要采取超越…

关于SpringBoot项目整合Log4j2实现自定义日志打印失效原因

主要的原因是因为&#xff0c;SpringBoot的logback包的存在&#xff0c;会导致Spring Boot项目优先实现logback的日志设置&#xff0c;所以导致我们用Log4j2实现自定义日志失效。 先找l哪个包引用了logback包 进入之后查询logback 然后双击包 发现是spring-boot-starter-loggin…

UVa1318/LA2797 Monster Trap

题目链接 本题是2003年ICPC亚洲区域赛会津(日本)赛区的H题 题意 给出一些线段障碍&#xff0c;你的任务是判断怪物能否逃到无穷远处。如下图所示&#xff0c;左图无法逃出&#xff0c;右图的可以逃出。 输入包含多组数据。每组数据第一行为整数n&#xff08;1≤n≤100&#xf…