【问题标题】:Why are my keys on my components not considered unique?为什么我的组件上的键不被认为是唯一的?
【发布时间】:2021-07-21 19:09:36
【问题描述】:

我制作了一个映射“步数”输入的函数,我想我已经为每个组件提供了唯一的键,但控制台另有说明。为什么是这样? 我在这个项目中遇到的另一个问题是标题字段没有正确更新,但我不知道为什么。这是我的代码。

export default function App() {
  //number of steps required
  const [numberOfSteps, setNumberOfSteps] = useState(0);

  //number of steps to array to map through
  const stepsMap = Array.apply(
    null,
    Array(numberOfSteps).fill({ title: "", body: "" })
  );

  //steps array to object
  let stepsObject = { ...stepsMap };

  //updates title text
  const updateTileArray = (index, titleEventData) => {
    const stepsObjectData = { ...stepsObject };
    stepsObject = {
      ...stepsObjectData,
      [index]: { ...stepsObjectData[index], title: titleEventData }
    };
  };

  //updates quill text body
  const updateRichTextArray = (index, richTextEventData) => {
    const stepsObjectData = { ...stepsObject };
    stepsObject = {
      ...stepsObjectData,
      [index]: { ...stepsObjectData[index], body: richTextEventData }
    };
  };

  return (
    <div className="App">
      <TextField
        type="number"
        label="Number of steps"
        value={numberOfSteps}
        InputProps={{ inputProps: { min: 0 } }}
        onChange={(e) => setNumberOfSteps(Number(e.target.value))}
      />
      {stepsMap.map((_, index) => (
        <>
          <Typography key={"heading" + index}>Step: {index + 1}</Typography>
          <TextField
            key={"title" + index}
            type="text"
            label="Title"
            value={stepsObject[index]?.title}
            onChange={(titleEventData) =>
              updateTileArray(index, titleEventData.target.value)
            }
          />
          <ReactQuill
            key={"quill" + index}
            theme="snow"
            value={stepsObject[index]?.body}
            onChange={(richTextEventData) =>
              updateRichTextArray(index, richTextEventData)
            }
          />
        </>
      ))}
    </div>
  );
}

Code Sandbox

【问题讨论】:

  • 这能回答你的问题吗? Can I add a key prop to a React fragment?
  • 控制台警告是什么?也许您可以将片段&lt;&gt; 转换为&lt;div&gt;&lt;React.Fragment&gt; 并在其上提供key
  • 谢谢你对我问题的第二部分的任何回答?

标签: javascript arrays json reactjs key


【解决方案1】:

关键应该在片段上,你可以这样做:

{stepsMap.map((_, index) => (
        <React.Fragment key={index}>
          <Typography>Step: {index + 1}</Typography>
          <TextField
            type="text"
            label="Title"
            value={stepsObject[index]?.title}
            onChange={(titleEventData) =>
              updateTileArray(index, titleEventData.target.value)
            }
          />
          <ReactQuill
            theme="snow"
            value={stepsObject[index]?.body}
            onChange={(richTextEventData) =>
              updateRichTextArray(index, richTextEventData)
            }
          />
        </React.Fragment>
      ))}

【讨论】:

  • 谢谢你似乎停止了抱怨!但是当我按下任何按钮等时,ReactQuill 元素似乎仍然会重新呈现?
  • 你还能弄清楚为什么标题没有正确更新吗?
【解决方案2】:

首先你应该使用&lt;React.Fragment&gt; 来传递key 属性。 其次,您的代码有两个关于title 的问题。

  1. stepsObject 应该是一个状态变量,它将处理 重新渲染组件。
  2. 您应该连接前一个 title 的值与 updateTileArray 函数中的最新值。

【讨论】:

  • 谢谢你介意提供一个我不太明白你的意思的例子吗?
  • const updateTileArray = (index: number, titleEventData: string) =&gt; { const stepsObjectData = { ...stepsObject } const titleConcat = stepsObjectData[index].title.concat( titleEventData ) stepsObject = { ...stepsObjectData, [index]: { ...stepsObjectData[index], title: titleConcat }, } console.log(stepsObject[index].title) }
  • 这似乎有效,但值没有更新?
  • 这是我的新代码,你怎么看? codesandbox.io/embed/…
  • 由于某种原因我的沙盒链接没有发送
猜你喜欢
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
相关资源
最近更新 更多