javascript - 两个 React 组件之间的输入焦点

标签 javascript reactjs react-hooks

我正在尝试使用 React 实现以下目标。

  • 当用户开始在下面的输入框中输入内容时,模式会出现 将出现,用户将继续在那里输入而不点击 Modal 的输入框

  • 一旦用户单击退格键并清除模态框的输入框,它就会关闭该框,并且焦点将返回到主输入空框。

使用两种输入状态的原因:看到父输入框在对话框后面更新会看起来很奇怪。

enter image description here

代码:https://codesandbox.io/s/modal-reactstrap-forked-r2sns1?file=/src/modal.tsx:0-1658

父组件

 const App = () => {
  const [openDialog, setDialog] = useState({
    isModalOpen: false,
    value: ""
  });

  const toggle = () => {
    setDialog({ isModalOpen: false, value: "" });
  };

  return (
    <div className="App">
      <ModalExample
        openDialog={openDialog.isModalOpen}
        query={openDialog.value}
        toggle={() => toggle()}
      />
      <input
        type="text"
        value={openDialog.value}
        onChange={(e) =>
          setDialog({ isModalOpen: true, value: e.target.value })
        }
      ></input>
    </div>
  );
};

对话框组件

const Dialog = ({ openDialog, query, toggle }: any) => {
  const ref = useRef<HTMLInputElement | null>(null);
  const [searchResult, setSearchResult] = useState("");
  const [searchResult2, setSearchResult2] = useState(0);

  useEffect(() => {
    setSearchResult(query);
  }, [query]);

  useEffect(() => {
    if (ref.current) {
      ref.current?.focus();
    } else {
      setSearchResult2(searchResult2 + 1);
    }
  }, [searchResult2]);


  return (
    <>
      <Modal
        isOpen={openDialog}
        role="dialog"
        autoFocus={true}
        centered={true}
        size="lg"
        query={query}
        className="exampleModal"
        // @ts-ignore
        tabIndex="-1"
        toggle={toggle}
      >
        <div className="modal-content">
          <ModalHeader
            toggle={toggle}
            className="ett-bg-secondary text-blue m-0"
          >
            <span className="mx-4">Download</span>
          </ModalHeader>
          <div className="px-5 mt-2"></div>
          <Form
            onSubmit={(e) => {
              e.preventDefault();
              //validation.handleSubmit(e)
              return false;
            }}
          >
            <ModalBody className="">
              <div className="row">
                <div className="col-lg">
                  <div className="custom-shadow px-5">
                    <input
                      ref={ref}
                      type="text"
                      value={searchResult}
                      onChange={(e) => setSearchResult(e.target.value)}
                    />
                  </div>
                </div>
              </div>
            </ModalBody>
          </Form>
        </div>
      </Modal>
    </>
  );
};

我可以知道如何实现这个目标吗??

最佳答案

你可以这样做:

 useEffect(() => {
    if (ref.current) {
      ref.current?.focus();
      if (searchResult?.length < 1) {
        setDialog({ value: "", isModalOpen: false });
      }
    }
  }, [searchResult]);

不要忘记在 Prop 中包含setDialog。这是一个工作sandbox .

关于javascript - 两个 React 组件之间的输入焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75887949/

相关文章:

javascript - 使用canvas在javascript中绘制一个正方形

javascript - 在 Azure 移动服务 JavaScript 客户端中使用 Like 子句

Reactjs map 函数 - 迭代 json 对象

reactjs - 读取react-native-fs中的本地资源

reactjs - 在 react 中从另一个钩子(Hook)调用钩子(Hook)

javascript - React 16.7 TypeError : (0 , _react.useState) 不是函数

javascript - 使用 (keydown/keyup) 上的类更新 div 和输入

javascript - 如何使用 jsrsasign 获取证书来验证我的 RSA 数字签名?

javascript - 使用express配置CORS并使用axios在前端发出请求

reactjs - 如何在登录页面中隐藏标题组件