请补全JavaScript代码,要求将对象参数转换为真实的DOM结构并返回。
注意:
1. tag为标签名称、props为属性、children为子元素、text为标签内容
const _createElm = vnode => { // 补全代码 let { tag, props, text, children } = vnode; let dom; if(typeof tag === 'string'){ dom = document.createElement(tag); for(let prop in props){ dom.setAttribute(prop, props[prop]); } dom.innerText = text; if(children.length){ children.forEach(child => dom.appendChild(_createElm(child))); } }else{ dom = document.createTextNode(text); } return dom; }
const _createElm = vnode => { // 补全代码 if(vnode.tag){ let el = document.createElement(vnode.tag) el.innerText = vnode.text for(let key in vnode.props){ el.setAttribute(key,vnode.props[key]) } if(vnode.children.length > 0){ for(let i = 0;i<vnode.children.length;i++){ el.appendChild(_createElm(vnode.children[i])) } } return el }else { if(vnode.text){ return document.createTextNode(vnode.text) } } }
本题考查 createElement
,createTextNode
方法的使用
const _createElm = vnode => { // 补全代码 const {tag, props, text, children} = vnode if(tag) { let dom = document.createElement(tag) props.class && dom.classList.add(props.class) dom.innerText = text children.length && children.forEach(item => dom.append(_createElm(item))) return dom }else{ return document.createTextNode(text) } }
const _createElm = vnode => { // 补全代码 const e = document.createElement(vnode['tag']); e.textContent = vnode['text']; const props = vnode['props']; for(const x in props) { e.setAttribute(x, props[x]); } for(const x of vnode['children']) { e.appendChild(_createElm(x)); } return e; }
const _createElm = vnode => { let { tag, props, text, children } = vnode // 补全代码 if (typeof tag == "string") { let dom = document.createElement(tag) dom.innerText = text for (key in props) { dom.setAttribute(key, props[key]) } // forEach不会遍历空数组! children.forEach(item => { // 开始递归 let childrenDom = _createElm(item) dom.append(childrenDom) }); return dom } else { return document.createTextNode(text) } }
const _createElm = vnode => { // 补全代码 const { tag, props, text, children } = vnode; if (tag) { const tagDOM = document.createElement(tag); for (key in props) { tagDOM.setAttribute(key, props[key]) } if (children.length > 0) { children.forEach(item => { tagDOM.append(_createElm(item)) }) } return tagDOM; } return text; }
const _createElm = vnode => { // 补全代码 if (vnode.tag) { let el = document.createElement(vnode.tag) for (const [key, val] of Object.entries(vnode.props)) { el.setAttribute(key, val) } el.innerText = vnode.text if (vnode.children.length == 0) { return } else { for (let e of vnode.children) { let el2 = _createElm(e) el.appendChild(el2) } } return el } else { return document.createTextNode(vnode.text) } }Object.entries()不能用么??
const setAttr=(el,props)=>{ Object.keys(props).forEach(key=>{ el.setAttribute(key,props[key]) }) } const _createElm = vnode => { let {tag,props,text,children}=vnode if(typeof tag=='string'){ vnode.el=document.createElement(tag) setAttr(vnode.el,props) vnode.el.appendChild(document.createTextNode(text)) children.forEach(child=>{ vnode.el.appendChild(_createElm(child)) }) }else{ vnode.el=document.createTextNode(text) } return vnode.el } document.body.appendChild(_createElm(vnode))
const _createElm = vnode => { // 补全代码 cre(document.body,vnode); function cre(parent, obj) { var tag = document.createElement(obj.tag); tag.innerHTML = obj.text; if (Object.keys(obj.props).length != 0) { Object.keys(obj.props).forEach(p => { tag.setAttribute(p,obj.props[p]); }) } parent.appendChild(tag); obj.children.forEach(el => { cre(tag,el); }) } return document.querySelector(vnode.tag); }
const _createElm = function (vnode) { // 补全代码 const thisFn = arguments.callee let node = document.createElement(vnode.tag) for (let prop in vnode.props) { node.setAttribute(prop, vnode.props[prop]) } node.innerText = vnode.text if(vnode.children.length){ for (let child of vnode.children) { node.appendChild(thisFn(child)) } } return node }
const _createElm = vnode => { // 补全代码 const list = vnode.children; let ele = document.createElement(vnode.tag); ele.innerText = vnode.text; ele.className = vnode.props.class ? vnode.props.class : '' const elm = (vnode,parent) => { vnode.map(item => { if(item.children && item.children.length > 0){ let element = document.createElement(item.tag) element.innerText = item.text; element.className = item.props.class ? item.props.class : '' parent.appendChild(element); elm(item.children,element) }else{ let element = item.tag ? document.createElement(item.tag) : ''; element.innerText = item.text; element.className = item.props.class ? item.props.class : '' element ? parent.appendChild(element) : parent.innerText = item.text } }) } elm(list,ele) return ele; }
const _createElm = function (vnode) { // 补全代码 const thisFn = arguments.callee let node = document.createElement(vnode.tag) for (let prop in vnode.props) { node.setAttribute(prop, vnode.props[prop]) } node.innerText = vnode.text for (let child of vnode.children) { node.appendChild(thisFn(child)) } return node }