在我的父组件中,有一个按钮可以控制是否显示子组件.

在输入框中,输入值存储在子组件中.当输入值时,一切看起来都很好,数据在子元素的状态下被记录得非常好.

1. enter image description here

  1. click to not show it enter image description here

  2. click to show again enter image description here

CHILD的输入框的值消失了,CHILD中的STATE值也消失了.

当我再次单击以显示子元素时,如何保留该值?

在父级中:

import React, { useEffect, useState } from "react";
import ReactDOM from "react-dom";
import Child1 from "./child";

import "./styles.css";

function Parent() {
  const [message, setMessage] = useState("initial text");
  const [showChild,setShowChild] = useState(true);
  useEffect(() => {
    console.log("useeffect in parent");
  });

  return (
    <div className="App">
      <button onClick={() => setShowChild(!showChild)}>show child</button>
      {showChild? 
      <Child1 />
      :
      null
      
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<Parent />, rootElement);

在子元素中:

import React, { useEffect, useState } from "react";

function Child1() {
  useEffect(() => {
    console.log("useeffect in child");
    console.log("newMessage: " + newMessage);
  });
  const [newMessage, setNewMessage] = useState("");


  return (
    <div>
      <input onChange={(event) => setNewMessage(event.target.value)} />
    </div>
  );
}

export default Child1;

推荐答案

这是因为您正在有条件地渲染<Child1 />,这意味着当您再次单击切换以隐藏它时,Reaction基本上会将其卸载,即它将从树中完全移除,因此所有组件状态都将丢失.当您再次单击切换以显示该零部件时,它将再次挂载.

解决这个问题的一种方法是在组件本身上设置showprops ,并让它管理组件的显示和隐藏方式.例如:

在父级中:

  return (
    <div className="App">
      <button onClick={() => setShowChild(!showChild)}>show child</button>
      <Child1 show={showChild} />
    </div>
  );

在子元素中:

import React, { useEffect, useState } from "react";

function Child1(props) {
  useEffect(() => {
    console.log("useeffect in child");
    console.log("newMessage: " + newMessage);
  });
  const [newMessage, setNewMessage] = useState("");

  if (!props.show) return <React.Fragment />

  return (
    <div>
      <input onChange={(event) => setNewMessage(event.target.value)} />
    </div>
  );
}

export default Child1;

在子代内部,当show为FALSE时,您也可以使用props showdiv上设置css样式display:none.这样,输入元素本身将保留在DOM中,但只是隐藏起来.

因此,我们将按如下方式修改返回语句,而不是返回<React.Fragment />:

return (
  <div style={props.show ? null : {display: "none"}}>
    <input onChange={(event) => setNewMessage(event.target.value)} />
  </div>
);

作为第三种 Select ,您可以"提升状态",这意味着您将newMessage状态向上移动到父级,并将newMessagesetNewMessage作为props 向下传递给子级,并保持问题中代码的其余部分不变.

在父级中:

const [newMessage, setNewMessage] = useState("");
...
return (
  ...
  <Child1 newMessage={newMessage} setNewMessage={setNewMessage} />
  ...
)

在子元素中:

const {newMessage, setNewMessage} = props;

Reactjs相关问答推荐

react 表复选框不对任何操作做出react

使用useReducer时,props 未从父级传递给子或孙级

使用Reaction钩子窗体验证可选字段

如何处理具有REACTION-REDUX状态的Nextjs路由警卫

为什么在页面重新加载时Location.State变得未定义?

自定义变量默认、聚焦和填充时所需TextField中标签的星号 colored颜色

为什么React UseEffect挂钩在页面重新加载时运行

从 MongoDB createAt 字段中分割精确时间

当 URL 与我声明的任何路由都不匹配时,如何使用不会重定向到错误页面的动态 URL? - react 路由 dom

Next.js `getLayout` 函数没有被调用

Mui Datepicker 设置了错误的日期

当我使用 Firebase Auth 在 React 中刷新主页时显示登录页面

Select 建议后如何关闭 vscode 添加自动完成={}

在 Spring Cloud Gateway 中运行的 React SPA 页面刷新出现白标错误

当用户输入相同信息时如何禁用更新

自动重新获取不起作用 - RTK 查询

ReactJS:useMemo 钩子修复了我的无限重新渲染问题而不是 useEffect

如何使用 React Router 在 React 中正确同步 useEffect 和 useLocation 挂钩?

在 redux 工具包中使用 dispatch 发送多个操作

我可以在类组件中使用 useState 挂钩吗?