虚拟dom

server/2024/11/28 23:48:17/

是什么

描述真实DOM的javaScript对象

//虚拟dom描述的对象const vdom = {tag: 'div',props: {onclick: () => alert('clicked'),},children: ["click me"]}

渲染器

将虚拟dom渲染成真实dom

实现思路

  1. 创建元素
    将vnode.tag作为标签名来创建元素
  2. 给元素添加属性与事件
    遍历vnode.props对象
  3. 处理children
    如果children是一个数组就递归的调用render继续渲染

代码

 // 定义渲染器将上列虚拟DOM描述为真实的DOMfunction render(vdom,container) {// 创建真实的DOM元素const el = document.createElement(vdom.tag)// 设置属性for (let key in vdom.props) {//是事件if (key.startsWith('on')) {el.addEventListener(key.slice(2).toLowerCase(), vdom.props[key])}else{//不是事件el.setAttribute(key, vdom.props[key])}}// 处理childenif (Array.isArray(vdom.children)) {vdom.children.forEach(child => {// 如果是字符串,则创建文本节点if (typeof child === 'string') {el.appendChild(document.createTextNode(child))} else if (typeof child === 'object' && child.tag) {// 如果是对象,则递归调用render函数el.appendChild(render(child))}});}// 将创建的DOM元素添加到挂载点container.appendChild(el)}

代码–渲染组件

//定义一个函数表示组件,函数的返回值就代表组件要渲染的内容,(返回值使用虚拟dom表示)const MyComponent = () => {return {tag: 'div',props: {onclick: ()=>{alert('hello')}},children:'click me'}}// 虚拟dom来描述组件const vdom = {tag:MyComponent,}//渲染函数const render =(vdom,container)=>{//判断vdom的类型if(typeof vdom.tag === 'string'){//如果是字符串,就创建一个元素const el = document.createElement(vdom.tag)//如果是事件if(vdom.props){for(let key in vdom.props){if(key.startsWith('on')){//如果是事件,就添加事件监听器el.addEventListener(key.slice(2).toLowerCase(),vdom.props[key])}else{//如果是属性,就添加属性el.setAttribute(key,vdom.props[key])}}}//如果有子元素,就递归调用render函数if(vdom.children){//如果是字符串if(typeof vdom.children === 'string'){el.textContent = vdom.children}//如果是数组else if(Array.isArray(vdom.children)){vdom.children.forEach(child => render(child,el))}}//将元素添加到容器中container.appendChild(el)}else{//如果是函数,就调用函数,得到虚拟domconst componentVdom = vdom.tag()//递归调用render函数render(componentVdom,container)}}

http://www.ppmy.cn/server/137667.html

相关文章

TensorFlow_T4 猴痘病识别

目录 一、前言 二、前期准备 1、设置GPU 2、导入数据 3、查看数据 三、数据预处理 1、加载数据 2、可视化数据 3、再次检查数据 4、配置数据集 四、构建CNN网络 五、编译 六、训练模型 七、模型评估 1、Loss and Acurracy图 2、指定图片进行预测 一、前言 &#…

香港将承办2025年全运会项目

行政長官在去年的施政報告中,表明政府會繼續以精英化、專業化、盛事化、產業化和普及化推動本港體育發展。隨着啟德體育園啟用在即,明年舉辦的第十五屆全國運動會,香港也會承辦當中八個競賽項目,相信屆時會將香港市民對體育運動的…

Vue学习笔记(十五)

文章目录 3.4. 【reactive 创建:对象类型的响应式数据】3.5. 【ref 创建:对象类型的响应式数据】3.6. 【ref 对比 reactive】3.7. 【toRefs 与 toRef】3.8. 【computed】3.9.【watch】\* 情况一\* 情况二\* 情况三\* 情况四\* 情况五 3.10. 【watchEffec…

使用Navicat连接远程服务器中在docker中运行的MySQL数据库保姆级教程

使用Navicat连接远程服务器中在docker中运行的MySQL数据库保姆级教程 一、需要的资源 Navicat客户端(我使用的是17.0.8版本,安装教程B站搜一个,很快能解决)服务器(已安装docker并运行了MySQL) 二、步骤 …

【AI开源项目】FastGPT- 快速部署FastGPT以及使用知识库的两种方式!

文章目录 一、FastGPT大模型介绍1. 开发团队2. 发展史3. 基本概念 二、FastGPT与其他大模型的对比三、使用 Docker Compose 快速部署 FastGPT1、安装 Docker 和 Docker Compose(1). 安装 Docker(2). 安装 Docker Compose&#xff…

Vite学习之模式

在安装了 Vite 的项目中,可以在 npm scripts 中使用 vite 可执行文件,下面是通过脚手架创建的 Vite 项目中默认的 npm scripts: 启动开发服务器(dev命令)——vite package.json {"scripts": {"dev&q…

vue.set主要是干啥的,有啥作用

Vue.set 是 Vue.js 提供的一个全局方法,它主要用于向响应式对象中添加一个新的响应式属性,并确保这个属性的变化能够被 Vue 的响应式系统检测到,从而触发视图的更新 举例说明 当然可以。以下是几个使用 Vue.set 的示例: 示例 1&a…

Python中的字符串“不可改变。/可以改变?”

Python中,规定字符串是“不可变”类型,字符串方法可以“重写”字符串。Python最终让您明白,“字符串不可改变”。😎 (笔记模板由python脚本于2024年11月01日 17:55:57创建,本篇笔记适合熟悉python础数据类型str的coder…