虚拟DOM数据结构
- 树形结构简介
- 对树的递归遍历
- 树形结构操作实战
- JSX 转译配置
树形结构简介
在我们和后端进行对接的时候,经常会用到 JSON 的结构,但其可能是普通的 key / value 就可以拿到我们想要的数据。对于树形结构,我们可以用省市区的方式来理解。在选择了不同的省份之后,其下有不同的市,在选择其中的市之后,市其下又有不同的区。另外的例子是公司的架构,在不同的组织下又不同的部门,在不同的部门又不同的组,不同的组再对应找到不同的人员。虽然选择的种种不同,但是结构是一致的。
- case - 省市区联动选择器
- case - 公司组织结构接口
举个例子:
const data = {
'福建': {
'厦门': {
'思明区': 123
}
},
}
// 数据结构 sucks
data['福建']['厦门']['思明区']
这种数据结构虽然容易表达,也能呈现出树的关系,但是在我们获取到厦门时候,我们并不知道厦门是单独的一个省,还是一个区,他是在哪个位置。因此我们需要更多的信息,及其相关的信息。
- 统一各层级数据结构
- 添加 id / children / value 等属性
const data = {
name: '中国', id: 0, value: null
children: [
{
name: '福建', id: 1, value: null
children: [
{
name: '厦门', id: 2, value: null
children: [
{
name: '思明区',
id: 3,
value: 123
children: []
},
// ...
]
},
// ...
]
},
// ...
]
}
对树的递归遍历
并且为了方便查询,在不同的节点上都应该是统一的查询方法。这个方法会在查询子层级时,需要必要时候调用自己(递归)。我们只要传入数结构,和id 就可以找到对应的数据。
function getValueById (node, id) {
if (node.id === id) return node.value
for (let i = 0; i < node.children.length; i++) {
const childValue = getValueById(node.children[i], id)
if (childValue) return childValue
}
return null
}
JSX 转译配置
- 如何快速构建出 DOM 树的 JSON 结构?
- 为什么写 JSX 时一定要导入 React?
如何快速构建出 DOM 树的 JSON 结构?
通过 JSX ,JSX 是Javascript和XML结合的一种格式。React发明了JSX,利用HTML语法来创建虚拟DOM。当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析。
为什么写 JSX 时一定要导入 React?
在 React 项目中使用 JSX时候,在书写一下代码:
function demo(){
return <div>123</div>
}
通过 JSX 模版转译之后,实际上等同于
function demo(){
return React.createElement('div',123);
}
如果忘记导入 React 却调用了 React 就会发生缺少 React 的错误。
同时,createElement 比较长,我们可以通过一下方法修改 createElement 的方法
- 导入 babel-transform-react-jsx 插件
- 其默认转译函数为 React.createElement
- 配置 .babelrc 中插件 prama 参数为 dom 即可
例如:
const vdom = (
<div>
<span>123</span>
<span>456</span>
</div>
)
将会被转化为:
const vdom = dom(
'div',
null,
dom('span', null, '123'),
dom('span', null, '456')
)