从 jsx 获取结果渲染反应组件

Render react component from jsx fetch result

我正在尝试渲染获取的数据,这是一个要渲染的 JSX 数组。

return(dataList.map((data) => (
                <CustomComponent1>
                    <CustomComponent2>{data.name}</CustomComponent2> 
                </CustomComponent1>
      )));

我得到这样的结果

[
    {
        "key": null,
        "ref": null,
        "props": {
            "children": [
                {
                    "key": null,
                    "ref": null,
                    "props": {
                        "textAlign": "left",
                        "verticalAlign": "top"
                    },
                    "_owner": null,
                    "_store": {}
                },
                
......

首先,我没有看到 children 使用传递的值进行更新。我怎样才能给每个条目一个唯一的密钥? 如何将其渲染为 parent 组件上的反应元素? 谢谢!

How can I give a unique key to each entry?

您应该在迭代中向子元素添加 key 属性。这将帮助您识别多个相似元素中的元素。

请注意,在这种情况下 id 会更合适,但我使用 item.name 作为键,因为我不知道您的数据是否有 id 与否。

I don't see children getting updated with the value passed

您的上述逻辑似乎是正确的,但您的问题可能来自状态更新。由于 React 不变性规则的性质,您不能改变状态,只能创建一个与状态映射的新对象。

const mockedDataList = [{ name: "name 1" }, { name: "name 2" }, { name: "name 3" }]

const ChildComponent = ({ children }) => {
   return children
}

const ParentComponent = () => {
   const [dataList,setDataList] = React.useState(mockedDataList)
   const mappedElements = dataList.map((data) => <ChildComponent key={data.name}>{data.name}</ChildComponent>);
   const handleClick = () => {
      //cannot do this
      //dataList[1] = "name 4"
      //setDataList(dataList)
      //-----------
      //should do this instead
      const updatedDataList = dataList.map(data => data.name === "name 2" ? {...data, name: "name 4"} : data)
      setDataList(updatedDataList)
   }
   console.log(mappedElements);
   return <div>
   {mappedElements}
   <button onClick={handleClick}>Change name 2 to name 4</button>
   </div>
}

ReactDOM.render(
  <ParentComponent/>,
  document.getElementById("root")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.0/umd/react-dom.production.min.js"></script>
<div id="root"></div>