ReactJS - это основанная на компонентах библиотека для создания пользовательских интерфейсов. Таким образом, с точки зрения компонентов, ваши данные - это группа, которая, в свою очередь, будет содержать выражение и другие группы, подобные себе. Разбивая это, мы можем сформировать три компонента:
Expression
Для простого рендеринга выражения в группе. Group
Для рендеринга группы. Groups
Для извлечения и последующего рендеринга компонента Group
для дальнейших групп в ваших данных.
Вот пример кода:
Index.js
Этот файл получает данные из API.
import React from "react";
import Group from "./Group";
const data = {
expression: ["a", "b"],
groups: [
{
expression: [],
groups: [{ expression: ["c", "d"], groups: null }]
},
{
expression: [],
groups: [
{ expression: ["e", "f"], groups: null },
{ expression: ["g", "h"], groups: null }
]
},
{
expression: ["p"],
groups: null
}
]
};
const stage = 1;
const Main = () => {
return (
<div>
<Group data={data} stage={stage} />
</div>
);
};
export default Main;
Group.js
Для рендеринга группы.
import React from "react";
import Expression from "./Expressions";
import Groups from "./Groups";
const populateGroup = (data, stage) => {
const HTML = [];
for (const x in data) {
if (x === "expression") {
HTML.push(<Expression expression={data[x]} />);
}
if (x === "groups") {
HTML.push(<Groups data={data[x]} stage={stage} />);
}
}
return HTML;
};
const Group = ({ data, stage }) => {
return (
<div>
<p>{`Group @ Stage ${stage}`}</p>
<ol className="Group">{populateGroup(data, stage + 1).map(el => el)}</ol>
</div>
);
};
export default Group;
Expression.js
Для простого рендеринга выражения в группе.
import React from "react";
const Expression = ({ expression }) => {
return (
<div className="expression">
{expression.map(term => (
<h3 style={{ display: "inline" }}>{term}</h3>
))}
</div>
);
};
export default Expression;
Groups.js
Для извлечения и последующего рендеринга Group
компонента.
import React from "react";
import Group from "./Group";
const Groups = ({ data, stage }) => {
if (data === null) return <span></span>;
return (
<div className="GroupsSection">
{data.map((section, i) => (
<Group key={i} data={section} stage={stage} />
))}
</div>
);
};
export default Groups;
Производительность При таком подходе на основе компонентов данные разделяются на части, что должно повысить производительность для еще лучших результатов. for...in
и map
можно заменить на петлю for
. Пример визуализации