在阅读了React设置焦点和带有超时的React焦点后,我仍然有点困惑,在输入上设置焦点
的正确跨浏览器选项是什么。
我有一个问题与条件渲染输入可能有焦点后渲染在表
,其中输入
放置在td
。
1)解决方案与组件didUpdate:
//...
componentDidUpdate() {
this.input && this.input.focus();
}
render() {
const show = this.state.isShown;
return (
<td className="editable">
{!show ? (
<input
type="number"
ref={(input) => { this.input = input }}
value={this.state.value}
onBlur={this.save}
onKeyPress={e =>
e.which === 13 || e.keyCode === 13 ? this.save() : null}
/>
) : (
<span onClick={this.onTdClick}>{this.props.name}</span>
)}
</td>
);
}
此解决方案适用于Chrome、IE11、Edge,但不适用于最新的Firefox(单击span
后,输入事件不会出现)。
2)解决方案与请求动画帧:
//...
componentDidUpdate() {
if (!this.state.isShown) {
requestAnimationFrame(() => {
this.input && this.input.focus();
})
}
}
render() {
// same above
}
该解决方案适用于Chrome、IE11、Edge,但当试图设置焦点
时,Firefox仍然不显示输入。
3) 设置超时的解决方案(回调,n):
//...
componentDidUpdate() {
if (!this.state.isShown) {
setTimeout(() => {
this.input && this.input.focus()
}, 50);
}
}
render() {
// same above
}
本案例适用于Chrome、IE11、Edge和(最后)Firefox,但似乎这是最“丑陋”的案例。
另外,autoFocus
attr不适用于这种情况,这里我有条件渲染,所以需要在单击后设置焦点
所以,我的问题是:我们有没有正确的方法来解决Firefox的w/o设置
setTimeout
?
现场测试示例:codepen
import React from 'react';
const MyInput = React.createClass({
componentDidMount(){
this.elem.focus();
},
render(){
return(
<input
ref={(elem) => {this.elem = elem}}
type="text"
/>
);
}
});
export default MyInput;
渲染<代码>
我有一个组件,它获取作为道具的项目集合,并将它们映射到作为父组件的子组件呈现的组件集合。我们使用存储在WebSQL中的图像作为字节数组。在函数中,我从项中获取图像ID,并对进行异步调用,以获取图像的字节数组。我的问题是,我不能在React中传播这个promise,因为它不是为了处理渲染中的promise而设计的(至少我可以告诉你)。我来自一个背景,所以我想我正在寻找类似于关键字的东西来重新同步分支
我正在编写文本输入,并在事件中调用,因此React重新呈现我的UI。问题是文本输入总是失去焦点,所以我需要为每个字母重新聚焦:D。
问题内容: 我已经实现了一个Modal组件,该组件在屏幕上显示一个模态对话框。通常,模态将有条件地显示。我可以通过两种方法在render函数中执行此操作: 在Modal组件中,我使用this.props.show为其自身添加了一个不同的类。如果为假,它将添加display:none以隐藏模式。 另一种方式是这样的: 这用于确定是否在渲染中添加Modal。 我想找出的是: 这两种方式有何不同? 其中
问题内容: 呈现组件后,将焦点设置在特定文本字段上的反应是什么? 文档似乎建议使用引用,例如: 在渲染函数中的输入字段上进行设置,然后调用: 但是我应该在哪里称呼它?我已经尝试了几个地方,但无法正常工作。 问题答案: 您应该这样做,而不是。像这样
我无法理解为什么我的AppReact组件呈现两次,如下面的gif所示。 我插入了一个控制台。在返回组件之前记录日志,查看组件渲染的次数。 每当我移除useState钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的
CodeSandBox:https://codesandbox.io/embed/react-table-editable-content-ggvcy 当试图处理React表中的输入时,我的输入失去焦点,因此一次只能键入1个字符。 如何修复我的渲染周期,以允许输入? 编辑:我不小心用工作版本的代码更新了沙盒,尽管它还有另一个bug:如何在刷新更新期间捕获由于焦点模糊更改而导致的react事件?