reactjs - React Routing 导致输入失去焦点
问题描述
我有一个应用程序,其中包含一个包含输入的组件。当用户更改输入时,我想更新 URL 中的查询字符串以反映新状态。我通过检测当前location.search
值和我的状态将生成的查询字符串之间的差异来实现这一点。如果有区别,我会返回一个<Redirect>
带有反映新状态的查询参数的组件。
问题是,在每次这样的重定向之后,组件都会重新渲染,并且我的输入会被新的输入替换,这意味着我刚刚更改的输入不再存在,因此它没有焦点。如果是文本输入,则每次击键后都会失去焦点。
我的处理方式是记住状态更改时具有焦点的元素的 ID,然后根据document.getElementById
组件完成重新渲染后将焦点设置到新元素。
我已将问题简化为位于https://codesandbox.io/s/github/TrevorMills/react-routing-conundrum的最小应用程序。问题体现在功能组件和React.Component
类上。
我的机制对我来说似乎很老套。我对 React 专家的问题是,我错过了什么吗?有没有更好的方法将状态输入位置查询参数<Redirect>
?我尝试添加key
到我的输入中,但没有任何区别。如果我的机制看起来合法,有没有办法以更高阶的组件将其应用于整个应用程序?
提前致谢。
解决方案
由于您使用了重定向,因此每次更改输入值时,组件渲染都会在返回值和重定向之间切换,从而导致所有组件重新安装而不是重新渲染。这会导致输入字段失去焦点。
避免在更新状态后使用<Redirect />
和使用。history.replace
您可以像这样 编写一个,而不是history.replace
在函数中执行。onChangeText
useEffect
useEffect(() => {
props.history.replace(props.location.pathname + "?" + qs.stringify(state));
}, [state]);
更新的工作示例在这里:
https://codesandbox.io/s/cocky-swirles-kcqwo?file=/src/App.js
推荐阅读
- ldap - Moqui 使用 Shiro 使用 LDAP 身份验证时,Moqui 重置或更改 LDAP 密码
- regex - gatsby babel transformIgnorePatterns:帮助编写正则表达式以包含除一个之外的所有项目
- jquery - 使用 jQuery 解析嵌套 JSON 中的第二级
- ios - Cocoapods 没有将新的 pod/依赖项完全添加到现有的工作区项目中
- typescript - 茉莉花如何对从间谍方法返回的对象寄予期望
- spring - 取决于单声道分辨率的通量
- python-3.x - 树莓派认为按钮一直被按下
- python - 如果没有从多个列表框中选择列表框,则在 tkinter UI 中引发错误消息
- selenium-chromedriver - 如何解决 Selenium 中的 Chrome 驱动程序问题
- javascript - 在 Express.js 中构建字符串时 ${ } 中的逻辑