2 回答

TA貢獻1772條經驗 獲得超6個贊
您的map()回調沒有return值,但在第二個if語句中,您將返回數組,因此[undefined, undefined, ...]當您遞歸到每個groups.
要修復您的解決方案,請將您的.map()to更改為.forEach()并刪除return之前的關鍵字conditionObj.groups.map(...)。
不過,這里有一個更好的方法:
function ConditionGroup ({ expression, groups }) {
const conditionExpressions = useMemo(
() => expression && expression.map(
(value, index) => (
<NewExpression key={index} conditionExpression={value} />
)
),
[expression]
);
const conditionGroups = useMemo(
() => groups && groups.map(
(value, index) => (
<ConditionGroup key={index} {...value} />
)
),
[groups]
);
return (
<div>
{conditionExpressions}
{conditionGroups}
</div>
);
}
請注意, using indexas the key是一個反模式。理想情況下,如果提供了唯一 ID,您將希望使用唯一 ID。有關更多信息,請參閱ReactJS:在數組元素中給出鍵的最佳方法是什么。

TA貢獻1874條經驗 獲得超12個贊
ReactJS 是一個用于生成 UI的基于組件的庫。因此,從組件的角度考慮,您的數據是一個組,而該組又將包含一個表達式和其他類似自身的組。分解這一點,我們可以形成三個組成部分:
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循環替換。
添加回答
舉報