第四十一篇 指令中的VNode

news2024/11/23 7:15:31

VNode

        前面讲到了自定义指令的引入使用,以及结合封装swiper组件一起进行结合使用,还记在inserted 指令生命周期当中使用的参数吗?第一个参数是可以拿到DOM节点(el),第二个参数是可以拿到使用自定义指令绑定的值(binding),那么它还有第三个参数,就是本篇内容要讲的这个 VNode ,那么当听到这个虚拟DOM,VNode,虚拟节点 和 vdom这些词其实指的是 在Vue中虚拟DOM其实是一个js对象来模拟真实DOM节点跟 diff 算法搭配方便做比对,最后Vue会进行哪些节点能否被复用的复用,不能复用的删除创建,以此达到更好的用户体验。那么下面来简单的自定义一个指令来使用这个三个参数:

<div id="app">
    <div v-custom = "'customVal'">
        {{mytext}}
    </div>
</div>
<script>
    Vue.directive("custom",{
        inserted(el,binding,vnode){
            console.log(el);
            console.log(binding.value);
            console.log(vnode);
        }
    })
    new Vue({
        el:'#app',
        data:{mytext:'自定义指令'}
    })
</script>

        可以查看一下VNode的内容其实它是一个虚拟DOM,虚拟DOM的内容相对真实DOM的内容要少一些,虚拟DOM当中仅有一些必要的属性,那么下面创建一个空div遍历一下真实的DOM: 

         回头看一下这个VNode,当中没有设置key值,所以可以看到的是key值是undefined值;

         在这个div当中还有一个子节点 " {{mytext}} ",没有 "tag",所以它是一个普通的文本节点;

VNode.context

        那么看这些和拿到这个虚拟DOM有啥用?我们知道在Vue中实例化创建之后 —— 才有状态 —— 再有VNode —— 映射真实DOM ,所以这个 VNode 起到关联索引的作用,如果放置在根节点,它就是根组件,放置在里边就是一个子组件,在VNode当中有一个context属性,它能关联到当前组件所在节点的对象,VNode.context 拿到的是组件对象,如果放置在根组件的话,拿到的就是Vue的实例;

         拿到Vue实例有什么用?还记在上一篇内容当中,在inserted指令生命周期中去拿swiperList的数组长度吗?this.swiperList.length并不能够拿到,this的指向是window对象,我们是通过指令绑定的一个对象,通过这个对象的传过来的,那么现在通过VNode.context能够拿到Vue根组件的实例,不就轻而易举的就访问到根组件中swiperList的数组长度;下面来更改上一回封装swiper获取swiperList.length的方式:(具体内容看上一篇内容)

上一篇部分代码:(this指向)

<!-- v-swiper绑定的是对象 -->
...
    <div v-swiper=" { current : index , length : swiperList.length } "> ... </div>
..

<script>
    Vue.diretive("swiper",{
        inserted(el,binding){
            // 通过 binding.value.length 拿到 swiperList.length
            console.log(binding.value.length);    // 输出3
        }
    })
    new Vue({ el:'#app',data:{ swiperList:[] },mounted(){ // 赋值swiperList数组三条数据 } })
<script>

修改代码:

<!-- v-swiper绑定的是对象 -->
...
    <div v-swiper="index"> ... </div>
..

<script>
    Vue.diretive("swiper",{
        inserted(el,binding,vnode){
            // 通过 vnode.context 
            console.log(vnode.context.swiperList.length);    // 输出3
        }
    })
    new Vue({ el:'#app',data:{ swiperList:[] },mounted(){ // 赋值swiperList数组三条数据 } })
<script>

        当然如果是封装的话还是需要注意这个,虽然通过vnode.context可以拿到swiperList.length,但它内部是非常依赖外部的状态,如果使用者用到不是swiperList存放数据的话,通过vnode.content.swiperList.length 具有强关联和强耦合,自己使用的话无可厚非。

小知识 - 指令相关周期

常用的 inserted 和 update ,如果内容相同,可以使用函数(function)进行简写;

bind : 只调用一次,指令第一次绑定到元素时调用,在这里可以进行一次性的初始化设置;

inserted : 被绑定元素插入父节点时调用(仅能保证父节点存在,但不一定已被插入到文档中);

update : 所有组件的VNode更行时调用,但是可能发生发生在其子VNode更新之前.指令的值可能发生了改变,也可能没有,但是通过比较更新前后的值来忽略不必要的模板更新;

componentUpdated : 指令所在组件的VNode及其子VNode(children)全部更新后调用;

upbind : 只调用一次,指令与元素解绑时调用;

        那么本篇的内容就到此结束,感谢大家的支持!

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

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

相关文章

NLP-信息抽取-三元组-联合抽取-多任务学习-2019:spERT【采用分类的思想实现联合抽取,实体抽取和关系抽取模型均为分类模型】

论文题目&#xff1a;Span-based Joint Entity and Relation Extraction with Transformer Pre-trainin 论文链接&#xff1a;https://arxiv.org/abs/1909.07755 论文代码&#xff1a;https://github.com/markus-eberts/spert SpERT模型是联合式抽取模型&#xff0c;同时抽取…

消息队列RabbitMQ核心:简单(Hello World)模式、队列(Work Queues)模式、发布订阅模式

文章目录一、简单模式&#xff08;Hello World&#xff09;代码实现二、队列模式&#xff08;Work Queues&#xff09;轮训分发消息代码实现消息应答概述RabbitMQ持久化不公平分发三、发布订阅模式原理概述发布确认策略单个确认发布批量确认发布异步确认发布三种发布确认速度对…

MongoDB_实战部分(二)

目录一、MongoDB CRUD操作MongoDB 插入文档MongoDB 查询文档MongoDB 修改文档MongoDB 删除文档练习题二、Mongoose三、VSCode连接MongoDB模块化一、MongoDB CRUD操作 MongoDB 插入文档 /*向数据库插入文档db.<collection>.insert()db.<collection>.insertOne() 插…

SDK 2019.1 - GNU Debugger (GDB) 不正常工作

报错截图 报错显示 warning: Can not parse XML target description; XML support was disabled at compile time warning: No executable has been specified and target does not support determining executable automatically. Try using the “file” command. " 解…

ROS service简单使用示例

1、为什么要使用ROS service 之前写过一篇关于ROS topic的内容。对于实时性、周期性的消息&#xff0c;使用topic来传输是最佳的选择。topic是一种点对点的单向通信方式&#xff0c;这里的“点”指的是node&#xff0c;也就是说node之间可以通过topic方式来传递信息。topic要经…

详细设计阶段复习

详细设计详细设计:确定具体实现方案,得出精确描述任务:结构程序设计:三种基本控制结构(选择[if]/顺序/循环[while|for])实现任何单入单出的程序人机界面设计:属于接口设计的重要组成问题设计指南设计工具:描述处理过程的工具程序流程图(历史悠久)盒图(N-S图): 不违背结构程序设…

[附源码]计算机毕业设计JAVA疫情环境下的酒店管理系统

[附源码]计算机毕业设计JAVA疫情环境下的酒店管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM…

机器学习实战——股票close预测

前言 用股票历史的close预测未来的close。 另一篇用深度学习搞得&#xff0c;见&#xff1a;深度学习实战——CNNLSTMAttention预测股票 技术栈 xgboostpython 原理 都是很简单的小玩意&#xff0c;试了下发现预测的还不错&#xff0c;先上效果图&#xff1a; 有点惊讶&a…

CSS中 设置( 单行、多行 )超出显示省略号

1. 设置超出显示省略号 css设置超出显示省略号可分两种情况&#xff1a; 单行文本溢出显示省略号…多行文本溢出显示省略号… 但使用的核心代码是一样的&#xff1a;需要先使用 “overflow:hidden;” 来把超出的部分隐藏&#xff0c;然后使用“text-overflow:ellipsis;”当文…

Java进阶架构师之如何画好架构图?阿里大神手把手教你!

1、什么是架构 架构就是对系统中的实体以及实体之间的关系所进行的抽象描述&#xff0c;是一系列的决策。 架构是结构和愿景。 系统架构是概念的体现&#xff0c;是对物/信息的功能与形式元素之间的对应情况所做的分配&#xff0c;是对元素之间的关系以及元素同周边环境之间…

基于灰狼算法优化的lssvm回归预测-附代码

基于灰狼算法优化的lssvm回归预测 - 附代码 文章目录基于灰狼算法优化的lssvm回归预测 - 附代码1.数据集2.lssvm模型3.基于灰狼算法优化的LSSVM4.测试结果5.Matlab代码摘要&#xff1a;为了提高最小二乘支持向量机&#xff08;lssvm&#xff09;的回归预测准确率&#xff0c;对…

Java基础:Collection、泛型

第一章 Collection集合 1.1 集合概述 在前面使用过集合ArrayList&#xff0c;那么集合到底是什么呢&#xff1f; 集合&#xff1a;集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。 集合和数组既然都是容器&#xff0c;它们有啥区别呢&#xff1f; 数组的长…

DPDK 数据传输流程

在进行正式的收发包之前&#xff0c;DPDK需要做一些初始化操作&#xff0c;包括&#xff1a; 初始化一个或多个mbuf_pool&#xff0c;用来存储从网卡中接受的数据包修改网卡配置&#xff0c;指定其接受队列的个数&#xff08;通常每个转发核一个&#xff09;&#xff0c;长度&…

【Hadoop 2.7.1】HDFS Shell操作的简单试验

【Hadoop 2.7.1】HDFS Shell操作的简单试验 HDFS提供了多种数据访问的方式&#xff0c;其中&#xff0c;命令行的形式是最简单的&#xff0c;同时也是开发者最容易掌握的方式 文章目录【Hadoop 2.7.1】HDFS Shell操作的简单试验HDFS Shell命令的使用上传文件(put)查看文件列表(…

全网最详细Centos7搭建Redis集群

1、准备三台服务器 没有服务器的话&#xff0c;虚拟机也一样 2、每台服务器安装上redis 相关网址&#xff1a; CentOS7安装Redis完整教程_长头发的程序猿的博客-CSDN博客_centos7 redis安装 3、修改“139.196.105.140&#xff08;主机&#xff09;”的配置文件 vim /etc/r…

路由策略简介、配置举例

路由策略简介、配置举例 定义 路由策略主要实现了路由过滤和路由属性等设置功能&#xff0c;他通过改变路由属性&#xff08;包括可达性&#xff09;来改变网络流量所经过的路径。 目的优势 目的 路由协议在发布、接收和引入路由信息时&#xff0c;根据实际组网需求实施一些策…

25个网络安全搜索引擎备忘录

©网络研究院 下面介绍一个包含 25 个网络安全搜索引擎的列表&#xff0c;每个网络爱好者都应该在互联网中了解这些搜索引擎。 此列表没有特定顺序&#xff0c;主要基于使用偏好。 1. 搜索连接到互联网的设备 https://www.shodan.io/ 2. 无线网络数据库&#xff0c;带…

矩阵篇(五)-- 特征值分解(EVD)和奇异值分解(SVD)

1 特征值分解&#xff08;EVD&#xff09; 设AnnA_{n \times n}Ann​有nnn个线性无关的特征向量x1,…,xn\boldsymbol{x}_{1}, \ldots, \boldsymbol{x}_{n}x1​,…,xn​&#xff0c;对应特征值分别为λ1,…,λn\lambda_{1}, \ldots, \lambda_{n}λ1​,…,λn​ A[x1⋯xn][λ1x1⋯…

基于jsp+ssm的家庭理财系统

项目介绍 在这科技不断的进步&#xff0c;让我们的生活改变了很多&#xff0c;信息技术的迅速发展&#xff0c;使各种行业在信息技术应用方面变得非常普遍。信息时代的到来&#xff0c;已成为一种必然趋势。本系统的标题是基于B/S模式的家庭理财系统的设计开发&#xff0c;其目…

公钥密码(非对称加密)

实例 投币寄物柜是这样使用的&#xff1a; 首先&#xff0c;将物品放人寄物柜中。然后&#xff0c;投入硬币并拔出钥匙&#xff0c;就可以将寄物柜关闭了。关闭后的寄物柜&#xff0c;没有钥匙是无法打开的。只要有硬币&#xff0c;任何人都可以关闭寄物柜&#xff0c;但寄物…