我知道我可以使用处理程序函数从子组件到父组件获取数据.如下所示

const Parent = () => {
  const [message, setMessage] = React.useState("Hello World");
  const chooseMessage = (message) => {
    setMessage(message);
  };
  return (
    <div>
      <h1>{message}</h1>
      <Child chooseMessage={chooseMessage} />
    </div>
  );
};

const Child = ({ chooseMessage }) => {
  let msg = 'Goodbye';
  return (
    <div>
      <button onClick={() => chooseMessage(msg)}>Change    Message</button>
    </div>
  );
};

如果我在同一组件中多次使用<Child />会怎么样?在这种情况下,我将如何处理数据.

const Parent = () => {
  const [message, setMessage] = React.useState("Hello World");
  const chooseMessage = (message) => {
    setMessage(message);
  };
  return (
    <div>
      <h1>{message}</h1>
      <Child chooseMessage={chooseMessage} />
      <Child chooseMessage={chooseMessage} />
      <Child chooseMessage={chooseMessage} />
      <Child chooseMessage={chooseMessage} />
    </div>
  );
};

处理这一问题的最佳方法是什么?

先谢谢你……

推荐答案

你的问题没有增加多少上下文,所以我会尽我所能回答它.

您希望将多个信息从N个子对象传递到父对象,并且(我假设)您不能在Parent个状态中创建相同数量的状态,因为这个数字是动态的.您要做的是让一个数组作为父对象中的状态,让每个子对象在该数组上有一个索引,并让它只在该索引处操作数组中的元素.

https://codesandbox.io/s/hardcore-mclean-f8dzmf?file=/src/Parent.jsx

这是一个简单的演示,说明可以做些什么.我只换了Parent,根本没碰Child.我将留下以下代码:

Parent.jsx

const Parent = () => {
  const [messages, setMessage] = useState([
    "Hello 1",
    "Hello 2",
    "Hello 3",
    "Hello 4"
  ]); // ⭐(1)⭐
  const chooseMessage = (message, index) => {
    const newMessages = [...messages]; // ⭐(2)⭐
    newMessages[index] = message;
    setMessage(newMessages);
  }; 
  return (
    <div>
      {messages.map((message, index) => (
        <h2 key={index}>{message}</h2>
      ))}
      <!-- ⭐(3)⭐ -->
      <Child key="0" chooseMessage={(message) => chooseMessage(message, 0)} />
      <Child key="1" chooseMessage={(message) => chooseMessage(message, 1)} />
      <Child key="2" chooseMessage={(message) => chooseMessage(message, 2)} />
      <Child key="3" chooseMessage={(message) => chooseMessage(message, 3)} />
    </div>
  );
};

在(1)中,您可以看到状态是一个array.在您的应用程序中,我假设子对象的数量将是动态的,因此从一个空数组开始,随子对象数量的增加向其中添加元素.

在(2)中,您可以看到setState函数有点奇怪.为什么我要做const newMessages = [...messages],而不是只做const newMessages = messages?这是一种使Reaction对数组中元素的更改做出react 的方法,因为默认情况下,它不会对数组状态的元素的更改做出react ,也不会对数组本身的更改做出react .

在(3)处,您可以看到正在传递的chooseMessage有点不同.因此,出于演示的目的,我只是将子代的数量设置为4,并手动 for each 子代设置索引,并创建了匿名函数来向下传递给子代,因此不需要更改Child中的代码.实际上,我假设您将需要通过某种类型的.map函数动态创建这些子代,就像我对<h2>标记所做的那样.

希望这能帮上忙.

Reactjs相关问答推荐

eslint -无法解析模块的路径@web3modal/ethers/react导入/no-unresolved

从另一个组件更改组件中const的状态

如何使用Reducer更新全局变量

try 在Dockerfile中使用AWS CLI将React构建工件上传到S3时出错

如何在MUI X数据网格列中显示IMG?

面对动画警告:未指定`useNativeDriver`.这是必需的选项,并且必须在REACT本机中显式设置为`true`或`False`

Reaction Ploly:如何在多个子情节中共享zoom 状态

REACTION 18功能组件正在开发中的S

需要特定的数学函数来标准化动画持续时间

React useEffect 问题...异步函数内的变量正在获取延迟的更新值

在 golang 服务器中刷新或直接 url 路径时响应 404

React router v5 仅在生产中不适用于嵌套路由

在react的useEffect钩子中,我的函数被调用,但只有第一个函数能够改变状态,第二个函数无法改变状态.

无法在react 中向表中添加行

无法设置 null 的属性(设置src)

Stripe Checkout:是否可以创建不自动续订的订阅?

虽然通过了身份认证,但并没有导航到请求的页面

react 路由路由加载器不适用于嵌套组件

为什么重新渲染不会影响 setTimeout 的计数?

在 React 中访问作为 prop 传递的状态变量