js -- js之递归渲染树形结构

4,686 阅读2分钟

有些刚毕业的不大知道,到底如何写树菜单、无限层级渲染、以及如何用vue实现

vue如何实现先等下说

js里面的话,反正都是递归,但是直接说递归,可能会懵逼。

比如如何渲染呢。 我们先实现下js输入html。


var o = [
{
value: '我是一级', 
children: [{value: '我是1.1'}]
},
{
value: '我是二级', 
children: [{value: '我2.1'}, {value: '我2.2',children: [{value: '我是2.2.1'}] }]
},
]

var loop = (o) => {
    return o.map(e => {
        return e.children ?
			`<div>
				<div>${e.value}</div>
				<ul>
					<li style="padding-left: 20px">${loop(e.children)}</li>
				</ul>
			</div>
			`
		: e.value
    })
}
var html = loop(o).join('')

document.body.innerHTML = html

跑下代码 长这样

原理就是利用一个循环函数(递归),遇到下子菜单有值的时候,再次调用自己。

简单就是遇到有下一个层级的时候就循环获取值,然后return出去值。而具体写法一般都是写一个函数自己调用。


说到这里,我就知道如何写了,至少没有任何框架的时候可以直接用。

那么vue的关系就是,用模板,然后生成一个字符串,这个字符串就是html。 比如jsp、vue、react、xxx模板、都是这样的原理。

所以 直接 v-html就可以绑定上去了。

但是这时候就会丢失vue模板的特性,比如没有双向数据绑定,更新值得时候需要调用更新函数。(其实我觉得还好,就比如react和小程序也要调用setData函数重新渲染)

比较优雅一点就可以写jsx

代码可以改成这样

var o = [
{
value: '我是一级', 
children: [{value: '我是1.1'}]
},
{
value: '我是二级', 
children: [{value: '我2.1'}, {value: '我2.2',children: [{value: '我是2.2.1'}] }]
},
]

var loop = (o) => {
    return o.map(e => {
        return e.children ?
            (<div>
                <div>{{e.value}}</div>
                <ul>
                    <li style="padding-left: 20px">{{loop(e.children)}}</li>
                </ul>
            </div>
            )
        : <div>{{e.value}}</div>
    })
}

(这个代码直接在文章编辑里面写,没有运行)

具体代码的话也可以参考我得一个开源代码: [drawing_panel.tsx)

那么有些小伙伴会问 vue有jsx么。 嗯。 也支持。

配置传送门: 渲染函数 & JSX

--END--