Vue核心(三)

一、条件渲染

v-if写法:

(1) v-if="表达式"

(2) v-else-if="表达式"

(3) v-else

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

特点: 不展示的DOM的元素直接被移除

注意:

(1) v-if可以和v-else-if、v-else一起使用,但要求结构不能被打断

(2) v-if可以搭配template标签一起使用,且不会破坏原先层级

v-show

写法: v-show="表达式"

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

特点: 不展示的DOM元素未被移除, 仅仅是使用样式隐藏(display: none)

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

二、列表渲染

v-for指令

(1) 用于展示列表数据

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

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

面试题: react、vue中的key有什么作用(key的内部原理)

(1) 虚拟DOM中key的作用

key是虚拟DOM对象的标识,当状态中的数据发生变化时,Vue会根据新数据生成新的虚拟Dom,

随后Vue进行新虚拟DOM与旧虚拟DOM的差异比较

(2) 对比规则(diffing算法)

a,旧虚拟DOM中找到了与新虚拟DOM相同的key: 若虚拟DOM中内容没变,直接使用之前的真实DOM; 若虚拟DOM中内容变了,则生成新的真实DOM, 随后替换掉页面中之前的真实DOM

b.旧虚拟DOM中未找到与新虚拟DOM相同的key: 创建新的真实DOM,随后渲染到页面

(3) 用index作为key可能会引发的问题:

a,若对数据进行逆序添加、逆序删除等破坏顺序操作,会产生没有必要的真实DOM更新(界面没问题,但效率低)

b,如果结构中还包含输入类的DOM,会产生错误DOM更新(界面有问题)

(4) 开发中如何选择key:

a、最好使用每条数据的唯一标识作为key,比如id、手机号、身份证号、学号等唯一值

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

三、Vue检测数据的原理

(1) vue会监视data中所有层次的数据

(2) 如何监视对象中的数据

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

a、对象中后追加的属性,vue默认不做响应式处理

b、如需给后添加的属性做响应式,请使用如下API:Vue.set(target, propertyName/index,value)、vm.$set(target, propertyName/index, value)

(3) 如何监测数组中的数据

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

a、调用原生对应的方法对数组进行更新

b、重新解析模版,进而更新页面

(4) 在vue修改数组中的某个元素一定要用如下方法

a、使用API:push、pop、shift、unshift、splice、sort、reverse

b、Vue.set或者vm.$set

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

四、收集表单数据

若<input type="text" />,则v-model收集的是value值,用户输入的就是value值

若<input type="radio" />, 则v-model收集的是value值,且要给标签配置value值

若<input type="checkbox" />: 情况a,没有配置input的value属性,那么收集的就是checked(布尔值); 情况b,配置input的value值,v-model是非数组,那么收集的就是checked,v-model的初始值是数组,那么收集的就是value组成的数组

备注: v-model的三个修饰符

lazy: 失去焦点再收集数据

number: 输入字符串转为有限的数字

trim: 输入首尾空格过滤

五、过滤器

定义: 对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)

语法:

(1) 注册过滤器: [全局注册]Vue.filter(name, callback)、[局部注册] new Vue{filters: {}}

(2) 使用过滤器: {{xxx | 过滤器名}} 或 v-bind:属性="xxx | 过滤器名"

备注:

(1) 过滤器也可以接收额外参数,多个过滤器也可以串联

(2) 并没有改变原本的数据,是产生新的对应的数据

六、内置指令

指令复习:

v-bind: 单向绑定解析表达式,可简写为:xxx

v-model: 双向数据绑定

v-for: 遍历数组/对象/字符串

v-on: 绑定事件监听,可简写为@

v-if: 条件渲染(动态控制节点是否存在)

v-else: 条件渲染(动态控制节点是否存在)

v-show: 条件渲染(动态控制节点是否展示)

新指令:

(1) v-text指令

a、作用: 向其所在的节点中渲染文本内容

b、与插值语法({{}})的区别: v-text会替换掉节点中的内容过,{{xxx}}则不会

(2) v-html指令

a、作用: 向指定节点中渲染包含html结构的内容

b、与插值语法的区别: v-html会替换掉节点中所有的内容,{{xxx}}则不会; v-html可以识别html结构

c、严重注意(v-html有安全性问题): 在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击; 一定要在可信的内容上使用v-html,永远不要在用户提交的内容上

(3)v-cloak指令

a、本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性

b、使用css配置([v-cloak] {display: none;}) 可以解决网速慢时页面展示出{{xxx}}的问题

(4) v-once指令

a、v-once所在节点在初次动态渲染后,就视为静态内容

b、以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能

(5)v-pre指令

a、跳过其所在节点的编译过程

b、可利用它跳过: 没有使用指令语法、没有使用插值语法的节点,会加快编译

七、自定义指令

(1) 定义语法:

a、局部指令(对象形式和函数形式)

new Vue({ directives: {指令名: 配置对象}}) 或 new Vue({directives(){}})

b、全局指令(配置对象和回调函数)

Vue.diretive(指令名, 配置对象) 或 Vue.directive(指令名, 回调函数)

(2) 配置对象中常用的3个回调(vue2.x中有效, vue3.0中对象形式无效)

bind: 指令与元素成功绑定时调用

inserted: 指令所在元素被插入页面时调用

update: 指令所在模板结构被重新解析时调用

(3) 备注

a、指令定义时不加'v-',但是使用时要加v-

b、指令名如果是多个单词,要是用kebab-case命名方式,不要用camelCase命名

相关推荐
CoCo的编程之路2 小时前
2026 前端效能革命:如何利用智能助手实现“光速”页面构建?深度横评
前端·人工智能·ai编程·comate·智能编程助手·文心快码baiducomate
RFCEO2 小时前
HTML编程 课程五、:HTML5 新增语义化标签
前端·html·html5·跨平台·语义化标签·可生成安卓/ios·html最新版本
Irene19912 小时前
JavaScript中,为什么需要手动清理事件
javascript·手动清理事件监听器
摘星编程2 小时前
OpenHarmony环境下React Native:Zustand持久化存储
javascript·react native·react.js
2501_944521592 小时前
Flutter for OpenHarmony 微动漫App实战:图片加载实现
android·开发语言·前端·javascript·flutter·php
摘星编程2 小时前
在OpenHarmony上用React Native:Recoil选择器异步数据
javascript·react native·react.js
雨中深巷的油纸伞3 小时前
vue 项目部署到iis后 浏览器刷新404
前端·javascript·vue.js
谢尔登3 小时前
从源码视角来看Pinia!
前端·javascript·vue.js
梦6503 小时前
JavaScript 循环
开发语言·javascript·ecmascript