关于React 虚拟DOM

虚拟DOM原理

简述

	虚拟Dom相当于在真实dom和js中间加了一个缓存,将真实的dom转化成一个json对象,从而利用diff算法避免了不必要的dom操作,以此提高性能。

JS原生代码模拟实现

(引入babel.min.js)
实现思路:通过jsx新建虚拟DOM >> 根据虚拟DOM属性转换为JSON对象 >> 通过自定义render方法将JSON对象中节点信息取出,进行真实DOM操作

	<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
	<script type="text/babel">
		// 1、新建虚拟dom
		let vDom = (
			<div id="app" name="appName">
				Hello World!
				<ul>
					<li>apple</li>
					<li>banana</li>
				</ul>
			</div>
		) 
		
		/*@jsx createElement*/ // @jsx babel的自执行指令
		// 2、将dom信息转化为JSON对象
		function createElement(nodeName, attr, ...args) {
			return {nodeName: nodeName, attr: attr, children: [].concat(...args)}
		}
		
		// 3、定义render函数
		render(vnode) {
			// 通过vnode.split判断节点是否是文本
			// 如果是文本
			if (vnode.split) {
				return document.createTextNode(vnode);
			}
			
			// 如果不是文本
			let node = document.createElement(vnode.name);
			// 添加属性
			let attrs = vnode.attr;
			Object.key(attrs).forEach((k) => {
				node.setAttribute(k, attrs[k]);
			});
			// 新增子节点,因为子节点层级数目不定,因此需要递归
			(vnode.children || []).forEach((n) => {
				node.appenChild(render(n))
			})

			return node
		}
		// 4、最后通过调用render函数生成真实dom树添加至document中
		let dom = render(vDom);
		document.body.appendChild(dom);
		
	</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值