簡體   English   中英

如何使用反應在 Ui 上顯示嵌套的 json

[英]How to show nested json on Ui using react

我有一個嵌套的 JSON,我正在制作一個 UI,我已經成功創建了第一部分,我面臨的問題是第二部分。

我想要做什么

我有一個嵌套的 json 顯示父元素,現在我要做的是單擊任何父元素,它應該顯示該特定數據。

假設我點擊 parent1,所以它應該顯示父母一的孩子。

我的 JSON 數據

    [
  {
    "name": "parent1",
    "url": "url1",
    "child": [
      {
        "name": "child1",
        "url": "child_url1",
        "grand_child": [
          {
            "name": "some name",
            "url": "some url"
          }
        ]
      },
      {
        "name": "child2",
        "url": "child_url2"
      },
      {
        "name": "child3",
        "url": "child_url3"
      }
    ]
  },
  {
    "name": "parent2",
    "url": "url2",
    "child": [
      {
        "name": "child22",
        "url": "child_url22"
      }
    ]
  },
  {
    "name": "parent3",
    "url": "url3",
    "child": [
      {
        "name": "child33",
        "url": "child_url33"
      },
      {
        "name": "child44",
        "url": "child_url44"
      },
      {
        "name": "child55",
        "url": "child_url55"
      }
    ]
  }
]

我在做什么

<div className="row">
            {d.map((li) => (
                <div className="col-12 col-sm-12 col-md-6 col-lg-4 col-xl-4">
                    <div onClick={() => on_click}>{li.name}</div>
                </div>
            ))}
        </div>

但是現在我不知道如何在 onClick 之后顯示其他部分如何擁有該特定數據。

我想要實現的是 這個代碼沙箱

在我的代碼沙箱中,我只顯示 parent3 孩子(假設當時點擊了)

根據我的理解,您希望在單擊父項時顯示子元素,並且所有代碼都駐留在單個反應 function 組件中。

因此,我從代碼沙箱中稍微更改了您的代碼,並使用 React State Hooks 來實現您的功能。 查看代碼示例: Code Sandbox Demo

希望這就是你要找的。 和平

我假設您將 json 作為組件的道具。您需要調用 renderParent function 來處理包括子數組在內的完整 json 的渲染。

function renderChild(child) {
    return child && child.map((childItem)=>(
      <div>{childItem.name}</div>
    ))
  }

  function renderParent() {
    return props.data && props.data.map(item => ( <div>
    <div>{item.name}</div>
    // add your parent json data here for rendering
    <div>{renderChild(item.child)}</div>
    </div>));
  }

return (
  <div>
  {renderParent()}
  </div>
);

使用pre標簽和 json 字符串。

<pre>{JSON.stringify(YOUR_JSON)}</pre>

您可以使用 divBody 值顯示嵌套的 json 元素

 let divBody = nestedJsonArray.map(item => (
              <div>
                <div>{item.url}</div>
                <div>{item.name}</div>
                <div>
                 {
                    item.child.map(citem=>(
                      <div>{citem.name}</div>
                    ))
                 }
                </div>
              </div>
            ));

 

檢查一下...您需要在父點擊時保存當前父子,我保存在 state 中,然后只顯示那個子,這里是代碼沙箱鏈接https://codesandbox.io/s/priceless-robinson -yk03j?file=/src/App.js:0-2010

import React, { useState } from "react";
import "./styles.css";
import "bootstrap/dist/css/bootstrap.min.css";

const data = [
  {
    name: "parent1",
    url: "url1",
    child: [
      {
        name: "child1",
        url: "child_url1",
        grand_child: [
          {
            name: "some name",
            url: "some url"
          }
        ]
      },
      {
        name: "child2",
        url: "child_url2"
      },
      {
        name: "child3",
        url: "child_url3"
      }
    ]
  },
  {
    name: "parent2",
    url: "url2",
    child: [
      {
        name: "child22",
        url: "child_url22"
      }
    ]
  },
  {
    name: "parent3",
    url: "url3",
    child: [
      {
        name: "child33",
        url: "child_url33"
      },
      {
        name: "child44",
        url: "child_url44"
      },
      {
        name: "child55",
        url: "child_url55"
      }
    ]
  }
];

export default function App() {
  const [child, setChild] = useState([]);
  const [currentParent, setCurrentParent] = useState("");

  const on_click = name => {
    const parent = data.filter(parent => parent.name === name);
    console.log(parent);
    setCurrentParent(parent[0].name);
    setChild(parent[0].child);
  };

  return (
    <div className="App">
      <div className="row">
        {data.map((parent, i) => (
          <div className="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4" key={i}>
            <div onClick={() => on_click(parent.name)}>{parent.name}</div>
            {currentParent === parent.name &&
              child.map((data, i) => (
                <div key={i}>
                  {data.name}{" "}
                  {data.grand_child &&
                    data.grand_child.map((gc, i) => (
                      <li className="pl-4 ml-4" key={i}>
                        {gc.name}
                      </li>
                    ))}
                  <br />
                </div>
              ))}
          </div>
        ))}
      </div>
    </div>
  );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM