Vue 创建虚拟DOM元素的几种方式和实际应用。

目录

创建虚拟DOM元素的方式

创建一个简单的元素:

创建一个带有属性的元素:

创建一个带有子元素的元素:

创建一个带有事件监听器的元素:

创建一个Vue组件 

创建一个带Props的组件 

创建一个带Slot的组件 

实际应用


创建虚拟DOM元素的方式

在Vue中创建虚拟DOM的方法是$createElement

$createElement在Vue源码中对应的类型声明是

export interface CreateElement {(tag?: string | Component<any, any, any, any> | AsyncComponent<any, any, any, any> | (() => Component), children?: VNodeChildren): VNode;(tag?: string | Component<any, any, any, any> | AsyncComponent<any, any, any, any> | (() => Component), data?: VNodeData, children?: VNodeChildren): VNode;
}

可以看到CreateElement有两个构造函数,用于创建虚拟 DOM 元素。它的签名组合非常多,以下是一些可能的例子:

  • 创建一个简单的元素:

this.$createElement('div', 'Hello World')

输出结果:

<div>Hello World</div>
  • 创建一个带有属性的元素:

this.$createElement('div', { class: 'red', style: 'font-size: 16px' }, 'Hello World')

输出结果:

<div class="red" style="font-size: 16px">Hello World</div>
  • 创建一个带有子元素的元素:

this.$createElement('div', [this.$createElement('h1', 'Title'),this.$createElement('p', 'Content')
])

输出结果:

<div><h1>Title</h1><p>Content</p>
</div>
  • 创建一个带有事件监听器的元素:

this.$createElement('button', {on: {click: this.handleClick}
}, 'Click me')

输出结果:

<button onclick="handleClick">Click me</button>
  • 创建一个Vue组件 

const MyComponent = Vue.component('my-component', {  props: ['msg'],  template: '<span>{{ msg }}</span>'  
})  vm.$createElement(MyComponent, {  props: { msg: 'Hello, world!' }  
})
  • 创建一个带Props的组件 

const MyComponent = Vue.component('my-component', {  props: ['msg'],  template: '<span>{{ msg }}</span>'  
})  vm.$createElement(MyComponent, {  props: { msg: 'Hello, world!' },  class: { 'my-class': true },  attrs: { id: 'my-id' }  
}, 'Hello, world!')
  • 创建一个带Slot的组件 

const MyComponent = Vue.component('my-component', {  template: `<div><slot></slot></div>`  
})  vm.$createElement(MyComponent, {}, [  vm.$createElement('span', {}, 'Child element 1'),  vm.$createElement('span', {}, 'Child element 2')  
])

以上只是一些可能的签名组合举例,实际上,$createElement 方法的签名非常灵活,允许使用嵌套对象和数组来创建复杂的虚拟 DOM 结构。可以根据具体的需求进行更多的组合和定制。

实际应用

使用element-ui的this.$confrim来自定义一个带有指定格式的提示弹框

const h = this.$createElement
this.$confirm(h('div', [h('p', '虚拟DOM的构造函数'),h('p', '执行此操作前,请确认:'),h('p', '确定要创建虚拟DOM吗?'),h('p', '是否确认完成上述操作,并继续提交。')]), '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning',
})

可以看到这样的方式非常简单,代码也更具有可读性。 

运行结果展示: 

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

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

相关文章

gma 空间绘图实战(1):绘制多个子图,连接并展示局部放大区域

安装 gma&#xff1a;pip install gma 本文基于&#xff1a;gma 2.0.3&#xff0c;Python 3.10 本文用到的矢量数据为&#xff1a;CTAmap 1.12。来源于 https://www.shengshixian.com/ 。&#xff08;感谢锐多宝&#xff09; 绘图目标 参考代码 import matplotlib.pyplot as p…

jQuery 选择器全部详细笔记

目录 JQuery全部详细笔记-上 jQuery 选择器 jQuery 选择器介绍 jQuery 选择器的优点 代码演示 基本选择器 ● 基本选择器应用实例 程序运行图 层次选择器 ● 层次选择器应用实例 代码演示 表单选择器 ● 表单选择器基本介绍 代码演示 综合代码示例 网页中所有的…

【FMCW毫米波雷达设计 】 — FMCW波形

原书&#xff1a;FMCW Radar Design 1 引言 本章研究驱动FMCW雷达的主要波形:线性调频(LFM)波形。我们研究信号的行为及其性质。随后&#xff0c;本章讨论了匹配滤波理论&#xff0c;并研究了压缩这种波形的技术&#xff0c;特别是所谓的拉伸处理&#xff0c;它赋予FMCW雷达极…

【网络奇缘系列】计算机网络|数据通信方式|数据传输方式

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 这篇文章是关于计算机网络中数据通信的基础知识点&#xff0c; 从模型&#xff0c;术语再到数据通信方式&#…

小目标检测模型设计的一点思考

1. 小目标的特性 目标之间的交叠概率比较低&#xff0c;即使有交叠&#xff0c;其IoU多数情况下也是比较小的 AI-TOD Tiny Person Dateset 小目标自身的纹理显著度有强弱区别&#xff0c;但是总体来说纹理特征都较弱&#xff0c;很多时候需要借助一定的图像上下文来帮助确认 …

IDEA远程调试与JDWP调试端口RCE漏洞

文章目录 前言Docker远程调试Java调试原理远程调试实践 JDWP端口RCE调试端口探测调试端口利用 总结 前言 在对一些 Java CVE 漏洞的调试分析过程中&#xff0c;少不了需要搭建漏洞环境的场景&#xff0c;但是本地 IDEA 搭建的话既麻烦&#xff08;通过 pom.xml 导入各种漏洞组…

【BUG】微信小程序扫码获取不到scene参数的bug修复

问题描述&#xff1a; 扫码后获取不到scene&#xff0c;必须点击“重新进入小程序”才可以 错误原因&#xff1a; 微信小程序的二维码扫描分为两种情况&#xff1a; 冷启动&#xff1a;当用户首次扫描二维码或在后台无该小程序运行实例时打开小程序&#xff0c;此时可以通过…

vuex如何存储数据、获取数据、以及数据的持久化

前提必须已经在vue中安装了vuex插件不然无法使用&#xff0c;不知道怎么创建vue和安装vuex的可以看这个视频&#xff0c;node.js版本最好16以上不然可能会安装失败&#xff1a;30分钟学会Vue之VueRouter&Vuex 趁着暑假掌握一门技能 大学生前端实习毕业设计必备技能_哔哩哔哩…

Linux环境下socket本地通信

最近项目有用到了socket本地通信&#xff0c;故复习一下。之前都是基于本地虚拟机的ip地址通信的&#xff0c;现在项目&#xff0c;Linux单板上面有2个进程需要通信&#xff0c;故用到了本地socket通信&#xff0c;主要其实就是用了sockfd,文件描述符&#xff0c;也叫句柄。 服…

自动化测试:PO模式详解!

PO&#xff08;Page Object&#xff09;模式是一种在自动化测试中常用的设计模式&#xff0c;将页面的每个元素封装成一个对象&#xff0c;通过操作对象来进行页面的交互。 概括来说就是&#xff0c;每个页面都有对应的PO类&#xff0c;PO类中包含了页面的元素定位和操作方法。…

Spring JDBC和事务管理

Spring JDBC是Spring框架用来处理关系型数据库的模块&#xff0c;对JDBC的API进行了封装。 Spring JDBC的核心类为JdbcTemplate&#xff0c;提供数据CRUD方法 Spring JDBC使用步骤 Maven工程引入依赖spring-jdbc <dependency><groupId>org.springframework<…

数据分析基础之《numpy(2)—ndarray属性》

一、ndarray的属性 1、属性方法 属性名字属性解释ndarray.shape数组维度的元组&#xff08;形状&#xff09;ndarray.ndim数组维数ndarray.size数组中的元素数量ndarray.itemsize一个数组元素的长度&#xff08;字节&#xff09;ndarray.dtype数组元素的类型使用方法 数组名.…