亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 React JS 中渲染 n 級嵌套對象的最有效方法是什么?

在 React JS 中渲染 n 級嵌套對象的最有效方法是什么?

胡說叔叔 2021-11-25 16:21:39
我有一個來自 API 的數據,如下所示 -{  "expression": [    "a",    "b"  ],  "groups": [    {      "expression": [      ],      "groups": [        {          "expression": [            "c",            "d"          ],          groups: null        }      ]    },    {      "expression": [        "p",      ],      groups: null    }  ]}我必須呈現表達式和組(也包括表達式和多個組)。構建塊是一個表達式。我們需要將嵌套表達式顯示為組。我嘗試使用遞歸函數調用,但對于深度較大的對象,效率并不高。這是類似于我的試驗的東西-let conditionStack = [];  function parseInnerConditions(conditionObj) {    if (conditionObj.expression) {      conditionObj.expression.map((each, index) => {        conditionStack = [          ...conditionStack,          <NewExpression key={index} conditionExpression={each} />, //renders an expression        ];      });    }    if (conditionObj.groups && conditionObj.groups.length) {      return conditionObj.groups.map((child, index) => {        conditionStack = [          ...conditionStack,          <ConditionGroup key={index}> // renders a block or group of expressions            {parseInnerConditions(child)}          </ConditionGroup>,        ];      });    }    return conditionStack;  }  return (    <div>    parseInnerConditions(conditionObject)    </div>  )提前致謝。
查看完整描述

2 回答

?
夢里花落0921

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:在數組元素中給出鍵的最佳方法是什么。


查看完整回答
反對 回復 2021-11-25
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

ReactJS 是一個用于生成 UI的基于組件的庫。因此,從組件的角度考慮,您的數據是一個組,而該組又將包含一個表達式和其他類似自身的組。分解這一點,我們可以形成三個組成部分:

  1. Expression 用于簡單地渲染組中的表達式。

  2. Group 用于渲染組。

  3. 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循環替換。 


查看完整回答
反對 回復 2021-11-25
  • 2 回答
  • 0 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號