【vue系列-03】vue的计算属性,列表,监视属性及原理

news2024/11/16 11:51:26

vue的核心属性

  • 一,vue核心属性
    • 1,计算属性
    • 2,监视属性
    • 3,样式绑定
      • 3.1,class样式绑定
      • 3.2,style样式绑定
    • 4,条件渲染
    • 5,列表渲染
      • 5.1,遍历列表
      • 5.2,key的作用
      • 5.3,key的作用
      • 5.4,列表过滤
      • 5.5,列表排序
    • 6,Vue.set() 的使用
    • 7, Vue监测数组中数据改变的原理
      • 7.1,监测数据操作总结如下。
      • 7.2,数据监测原理总结如下

一,vue核心属性

1,计算属性

在vue实例的data中,里面的key值就是属性名,里面的value就是属性值,而这个计算属性,就是用来对data中的数据进行一个属性计算的,将里面的数据进行一个加工操作,生成一个全新的数据。计算属性的数据通过这个computed保存。

new Vue({
	data:{firstName:'郑',lastName'三'},
	computed:{
		fullName:{
			//当有人读取这个fullName时,get就会被调用,且返回值就作为fullName的值
			get(){
				return this.firstName + '-' + this.lastName;
			}
		}
	}
})

并且在这个fullName中的get()函数,会做一个缓存。并且只有在第一次读取这个fullName时,或者所需要的data中的数据发生变化时,这个get方法才会发生调用,之后再有的别人来读取这个fullName的值的时候,就直接读取缓存中的值了。

只有在这个computed中会有缓存,在methods中是没有缓存中。computed的底层主要是通过数据代理,通过其底层的getter和setter来实现的。

以上部分也可以直接对 fullName 这一部分做一个简写,直接写成如下部分,并且只有在只做获取,不做修改时才能简写成以下部分。但是需要切记的是这个fullName的值可以由这个vue实例直接获取到,而不是获取一个函数。

fullName(){
	return this.firstName + '-' + this.lastName;
}

2,监视属性

使用watch关键字,对data中的数据进行监听,除了可以监听data中的数据,也可以监听计算属性中的值。在数据发生改变时,handler这个监听方法就会被触发。

new Vue({
	data:{isHot:true},
	watch:{
        //监视data中的isHot属性
        isHot:{
            immediate:true,//初始化这个handler时调用一下
        	handler(newVlaue,oldVlaue){
                console.log('isHot被修改了',newVlaue,oldVlaue)
            }
        }
    }
})

如果需要监视多级结构中的属性变化,那么需要加入一个属性deep,这样主要该结构中的任意一个数据发生变化,就会触发这个handler函数。

deep:true

如果不需要这个deep和这个immediate属性,那么可以将这个isHot属性进行一个简写操作,如下

isHot(newVlue,oldValue){
	console.log('isHot被修改了',newVlaue,oldVlaue)
}

在既可以用监视属性,又可以用计算属性完成某个功能时,当面临这个异步事件的时候,优先使用监视属性;除此之外,可以优先使用计算属性。

3,样式绑定

3.1,class样式绑定

对于确定的样式,可以直接使用这个class来直接绑定,对于这个不确定的样式使用 :class 双向绑定来确定

<!-- 绑定class样式,字符串写法 -->
<div class="basic" :class="mood">{{name}}</div>
<!-- 绑定class样式,数组写法 -->
<div class="basic" :class="dataArr">{{name}}</div>
<!-- 绑定class样式,对象写法 -->
<div class="basic" :class="dataObj">{{name}}</div>

3.2,style样式绑定

除了可以使用绑定这个class,也可以手动的写这个style

<!-- 绑定对象的写法 -->
<div class="basic" :style="styleObj1">{{name}}</div>
<!-- 绑定数组的写法 -->
<div class="basic" :style="styleArr">{{name}}</div>

其实例中的data属性如下

styleObj1:{
    fontSize: '40px',
    color: 'red,
    backgroudColor: 'orange'
}
styleObj2...

4,条件渲染

顾名思义就是说,满足什么条件,就渲染对应的东西。 如下可以使用这个v-show这个指令来实现,其底层主要是操作这个dispaly这个指令,当为true时该结点展示,当为false时该结点隐藏。

v-show="true"

除了这个v-show,也可以使用这个v-if来实现条件渲染。但是如果直接使用v-if,其底层会直接将该结点删除,而不是隐藏,如果要显示的话,那么就得重新添加一个结点。

v-if = "true"

因此在选择中,如果切换的频率高的话建议使用v-show,如果切换的很低的话可以选择v-if。如果在切换的频率很高的情况使用这个v-if,那么就会进行大量的增加和删除结点,在一定程度上会影响一定的效率。

而在选择这个v-if的时候,除了使用这个v-if,也会使用这个v-else-if,v-else,可以三个结合一起使用。

v-if = "n===1"
v-else-if = "n===2"
v-else

并且在这几个结合体中,不允许出现中断操作,即这几个指令要结合并且连在一起使用。

5,列表渲染

5.1,遍历列表

主要使用这个v-for来表示,其内部就类似于一个for循环,然后遍历一个数组。并且为了保证数组中每一条数据的唯一性,最好加一个key标识,并且这个key使用每一条元素中的id。除了数组,对象,字符串等都是可以直接进行遍历的。

<div id="root">
   <h2>人员列表</h2>
   <ul>
        <li v-for = "(p,index) in persons" :key = p.id>
            {{p.name}} - {{p.age}}
        </li>
   </ul>
</div>
//在vue实例的data中的数据如下
data:{
    persons:[
        {"id":001,name:'张三',age:18,},
        {"id":002,name:'李四',age:19,},
        {"id":003,name:'王五',age:20,}
    ]
}

5.2,key的作用

在这个虚拟dom中,有一个diff的高效的比较算法,而在该算法中,需要利用上这个key。因此在对这个key进行一个值的赋予时,优先选择一个唯一的id,如后台给的id或者index下标,如果不涉及到列表的更新的话,那么这两个都可以使用,如果涉及到这个列表更新的话,那么只考虑使用这个唯一id。

使用index作为key,就会出现如下情况。input输入框的数据发生错乱,并且需要重新生成多个虚拟dom,效率相对而言较底下,并且渲染之后的界面直接出现问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCmCMCdP-1672469284944)(../img/1672154177389.png)]

使用唯一id,只要重新生成一个新增数据对应的虚拟dom即可,而原先的虚拟dom以及对应的数据可以直接进行一个复用操作。

在这里插入图片描述

5.3,key的作用

key是虚拟DOM的标识,当数据发生变化的时候,Vue会根据新数据生成新的虚拟DOM,随后新旧虚拟DOM会进行一个比较操作

新旧虚拟DOM的比较规则如下:

1,若旧虚拟DOM找到了与新虚拟DOM中相同的key

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

若虚拟DOM中的内容变了,则重新生成新的真实DOM

2,旧虚拟DOM未找到与新虚拟DOM相同的key

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

所以在开发中,建议直接选择唯一标识,如后台返回的id,手机号,身份证号等唯一值。

5.4,列表过滤

可以直接使用关键字filter对列表中的数据进行一个过滤,如上面的这个person数组,将年级大于18的所有数据给过滤出来。

this.persons.filter((p)=>{
	return p.age > 18;
})

5.5,列表排序

在数据过滤时,往往也需要对数据进行一个排序操作。接下来模拟一个根据年龄进行排序的实现,如下:

this.persons.sort((p1,p2) =>{
	//sortType:: 1,升序   2,降序
	return sortType === 1 ? p1.age - p2.age : p2.age-p1.age;
})

6,Vue.set() 的使用

可以通过这个vue.set将后来加入的值变成响应式,使其后边加入的值变成有setter和getter两个构造函数。

//向student这个对象中加入sex这个性别以及对应的值
//如果实在methods中,则可以直接使用this即可
Vue.set(vm.student,'sex','男')

也可以使用vm.$set ,其效果和这个Vue.set() 一样

vm.$set(vm.student,'sex','女')

并且在添加属性时,这个第一个参数不能为Vue的实例对象或者根数据对象,只能是vm对象里面的属性。

7, Vue监测数组中数据改变的原理

vue在使用数组时,只有在以下方法中才能触发视图更新的操作。并且一下七个方法是经过了Vue包裹的几个方法

push()			pop()		shift()
unshift()		splice()	sort()		reverse()

当然除了上面的七个方法,也可以使用6中的这个set方法,对里面的值进行设置或者添加。

// 对hobby数组中的第一个数据改成打篮球
Vue.set(vm.student.hobby,0,'打篮球')

7.1,监测数据操作总结如下。

<body>
    <!-- 一个容器,可以用于接收vue实力传来的数据,然后展示 -->
    <div id="root" aglian>
       <h2>学生信息</h2>
       <button @click="student.age++" >年龄+1岁</button> </br></br>
       <button @click="addSex()" >添加性别属性,默认值男</button> </br></br>
       <button @click="addFriend" >在列表首位添加一个朋友</button> </br></br>
       <button @click="updateFirstFriendName" >修改第一个朋友的名字为张三</button> </br></br>
       <button @click="addHobby" >添加一个爱好</button> </br></br>
       <button @click="UpdateFirstHobby" >修改第一个爱好为:开车</button> </br></br>
       <h1>姓名:{{student.name}}</h1>
       <h2>年龄:{{student.age}}</h2>
       <!-- v-if也可以 -->
       <h2 v-show="student.sex">性别:{{student.sex}}</h2>  
       <h2>学生爱好</h2>
       <ul>
            <li v-for = "(p,index) in student.hobby" :key = p.id>
                {{p}}
            </li>
       </ul>
    
       <h2>朋友们</h2>
       <ul>
        <li v-for = "(p,index) in student.friends" :key = p.id>
            {{p.name}} - {{p.age}}
        </li>
   </ul>
    </div>
    
    <script type="text/javascript" >
        Vue.config.productionTip = false    //阻止vue启动时提示生产提示
        new Vue({
            //指定当前实例为哪个容器服务,id对应#,class对应.
            el:'#root',
            //data用于存储数据,只有el对应的容器可以使用
            data:{
                student:{
                    name:'tom',
                    age:18,
                    hobby:['打篮球','看书','跑步'],
                    friends:[
                        {name:'zhs',age:19},
                        {name:'lisi',age:20},
                    ]
                }
            },
            methods:{
                addSex(){
                    Vue.set(this.student,'sex','男');
                },
                addFriend(){
                    // 只要用了那七个包装的方法,修改的值就可以变成响应式
                    this.student.friends.unshift( {name:'Jack',age:21});
                },
                updateFirstFriendName(){
                    // 没有set和get的属性都不是响应式,修改值时vue不认
                    // 数组没有setter和getter,但是数组中的属性是有setter和getter的
                    this.student.friends[0].name = '张三';
                },
                addHobby(){
                    this.student.hobby.push('画画');
                },
                UpdateFirstHobby(){
                    //Vue.set(this.student.hobby,0,'开车')
                    this.$set(this.student.hobby,0,'打羽毛球')
                }
            }
        })
    </script>  
</body>

7.2,数据监测原理总结如下

1,Vue会监视data中所有层次的数据

2,监测对象中的数据如下

通过setter实现监视,且要在new Vue时就要传入要监测的数据

(1)对象中后追加的属性,Vue默认不做响应式处理

(2)如需给后添加的属性做响应式,可以使用如下两种方式

Vue.set(target,propertyName/index,value)或
vm.$set(target,propertyName/index,value)

3,监测数组中的数据

通过包裹数组更新元素的方法实现,本质就是做了两件事

(1).调用原生对应的方法对数组进行更新

(2).重新解析模板,进而更新页面

4,Vue修改数组中的某个元素

(1)使用上面七个封装后的方法

(2)使用Vue.set()或者 vm.$set()

特别注意:Vue.set()或者 vm.$set()不能给vm或者vm的根数据对象添加属性

(2)如需给后添加的属性做响应式,可以使用如下两种方式

Vue.set(target,propertyName/index,value)或
vm.$set(target,propertyName/index,value)

3,监测数组中的数据

通过包裹数组更新元素的方法实现,本质就是做了两件事

(1).调用原生对应的方法对数组进行更新

(2).重新解析模板,进而更新页面

4,Vue修改数组中的某个元素

(1)使用上面七个封装后的方法

(2)使用Vue.set()或者 vm.$set()

特别注意:Vue.set()或者 vm.$set()不能给vm或者vm的根数据对象添加属性

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

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

相关文章

2022年全国职业院校技能大赛中职组网络安全竞赛——隐写术应用解析(超详细)

2022年全国职业院校技能大赛中职组网络安全竞赛——隐写术应用解析(超详细) B-8任务八:隐写术应用 *任务说明:仅能获取Server8的IP地址 环境需求私信博主 1.找出文件夹1中的文件,将文件中的隐藏信息作为Flag值提交; 解题步骤如下 2.找出文件夹2中的文件,将文件中的隐藏信息…

基于Vue的数据可视化设计框架,数据大屏可视化编辑器

开发文档&#xff08;★★★★★&#xff09; 请访问 https://lizhensheng.github.io/vue-data-view/ 完整代码下载地址&#xff1a;基于Vue的数据可视化设计框架&#xff0c;数据大屏可视化编辑器 简介 DataView是一个基于Vue的数据可视化设计框架提供用于可拖拽的控件提供…

Spring之IOC入门案例

目录 一&#xff1a;IOC入门案例实现思路分析 1.IOC容器管理什么&#xff1f; 2. 如何将被管理的对象告知 IOC 容器 ? 3.被管理的对象交给 IOC 容器&#xff0c;要想从容器中获取对象&#xff0c;就先得思考如何获取到 IOC 容器 ? 4.IOC 容器得到后&#xff0c;如何从容…

C++首超Java

TIOBE 公布了 2022 年 12 月的编程语言排行榜。 TIOBE 将于下个月揭晓其 2022 年度编程语言&#xff0c;目前共有 3 个候选者&#xff1a;Python、C 和 C。TIOBE CEO Paul Jansen 指出&#xff0c;虽然 Python 和 C 已多次斩获该头衔&#xff0c;而 C 仅在 2003 年获得过一次&a…

Android---开发笔记

ListView控件 <ListViewandroid:id"id/main_iv"android:layout_width"match_parent"android:layout_height"match_parent"android:layout_below"id/main_top_layout"android:padding"10dp"android:divider"null&qu…

彩色圣诞树圣诞树

目录 一、圣诞介绍 二、技术需要 三、效果展示 四、实现步骤 五、颜色的更改 六、源码 一、圣诞介绍 基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节&#xff0c;天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期&#xff0c;《圣经》并无记载。公元336年罗马教会开始在…

JavaScript对象与类的创建

1、面向过程与面向对象 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次调用就可以了。面向对象是把事务分解成为一个个对象&#xff0c;然后由对象之间分工与合作。 面向过程与面向对象对比 面…

LeetCode11.盛水最多的容器

11. 盛最多水的容器 该题用的是贪心的思想&#xff0c;也即每一步都以更加靠近最值为目标&#xff0c;用双指针维护height数组&#xff0c;接下来我用我自己通俗的语言尽可能解释双指针这种做法的正确性&#xff1a; 首先双指针指向数组两端&#xff0c;从两端开始&#xff0…

必看!Salesforce发布2023年全球科技重要趋势和预测

Salesforce领导者处于影响企业的最新趋势、技术和挑战的前线&#xff0c;通过市场分析、客户对话等方面带来专业知识和洞察力。距离2023年还剩不到一周的时间&#xff0c;未来一年企业应该如何布局&#xff0c;技术会如何发展&#xff0c;值得我们密切关注。 企业需要了解的5项…

IB分数如何影响您的大学申请?

参加 2022 年 11 月 IB 考试的学生将于 1 月 2 日收到IBDP&IBDP相关课程的分数。 大多数在新加坡提供 IB 课程的国际学校都在每年 5 月参加考试。 但是有些学校在 11 月参加 IBDP 考试。其中包括圣约瑟国际学院(SJII)、英华学校(ACS)、澳大利亚国际学校(SAIS)、华中国际学校…

牛客竞赛每日俩题 - 动态规划3

目录 类01背包问题&#xff0c;选or不选 变种走方格 类01背包问题&#xff0c;选or不选 不同的子序列_牛客题霸_牛客网 问题翻译&#xff1a; S有多少个不同的子串与T相同 S[1:m]中的子串与T[1:n]相同的个数 由S的前m个字符组成的子串与T的前n个字符相同的个数 状态&#xf…

SHA3算法笔记

文章目录1 INTRODUCTION2 GLOSSARY3 KECCAK-p Permutations3.1 State3.1.2 Converting Strings to State Arrays3.1.3 Converting State Arrays to Strings3.1.4 Labeling Convention for the State Array3.2 Step Mappingsthetarhopichiiota3.3 KECCAK-p[b, n~r~]3.4 KECCAK-f…

如何使用 Blackbox Exporter 监控 URL?

前言 监控域名和 URL 是可观察性的一个重要方面&#xff0c;主要用于诊断可用性问题。接下来会详细介绍如何使用 Blackbox Exporter 和 Prometheus 在 Kubernetes 中实现 URL 监控。 Blackbox Exporter 简介 Blackbox Exporter 是 Prometheus 的一个可选组件&#xff0c;像其…

离散变量贝叶斯决策简介

贝叶斯决策 最小风险&#xff1a; min⁡R(αi∣x)∑j1cλ(αi∣ωj)P(ωj∣x)\min R\left(\alpha_i \mid \mathrm{x}\right)\sum_{j1}^c \lambda\left(\alpha_i \mid \omega_j\right) P\left(\omega_j \mid \mathrm{x}\right) minR(αi​∣x)j1∑c​λ(αi​∣ωj​)P(ωj​∣x…

django笔记《内置用户认证系统》

文章目录1 前言2 django.contrib.auth3 使用django的用户认证系统3.1 创建一个新的django项目3.2 做数据库迁移3.3 auth_user表结构3.4 创建一个新用户3.5 User对象3.5.1 创建用户 create_user3.5.2 request.user3.5.3 用户在视图函数中登录3.5.4 关键函数3.6 保护视图函数的方…

每日一问-ChapGPT-20221231-关于中医的各国看法

文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20221231-关于中医的各国看法各个国家对伤寒论的看法日本对于中医的看法韩国对于中医的看法欧美对于中医的看法中国对于中医的看法当日总结每日一问-ChapGPT系列起因 近来看了新闻&#xff0c;看了各种媒体&#xff0c;抖音…

程序员必须要了解的内存知识——硬件

最近阅读了Ulrich Drepper大牛的论文《What Every Programmer Should Know About Memory》&#xff0c;全文114页&#xff0c;尽管2007年出版&#xff0c;但如今看过来&#xff0c;仍干货满满。接来下对文中提及的知识&#xff0c;结合自己对内存知识的理解&#xff0c;对程序员…

前端面试题汇总-Vue篇

1. Vue的基本原理 当一个Vue实例创建时&#xff0c;Vue会遍历data中的属性&#xff0c;用 Object.defineProperty&#xff08;vue3.0使用proxy &#xff09;将它们转为 getter/setter&#xff0c;并且在内部追踪相关依赖&#xff0c;在属性被访问和修改时通知变化。 每个组件实…

APP专项测试

一、安装/卸载/升级更新 分类测试点安装1. 通过第三方软件协助安装是否正常 2. 在不同的操作系统下安装是否正常 3. 安装过程中断网&#xff0c;安装是否正常 4. 安装后的文件夹以及文件是否写到了指定的目录里 5. 软件安装过程是否可以取消&#xff0c;点击取消后&#xff0c…

Windows 10/11玩游戏时第二显示器延迟怎么办?

现在很多人都会给自己的电脑外接一个显示屏&#xff0c;来提高工作效率&#xff0c;或增强游戏体验&#xff0c;但有时候第二块显示器会出现延迟、卡顿、掉帧等问题。 不过驱动小百科整理了几个缓解Win 10/Win 11上第二显示器延迟的方法&#xff1a; 更改显示器刷新率关闭占用…