我有一个带有文本输入的React(15.3.2)组件。
(无论我在哪里说“渲染”,实际上都是渲染或取消隐藏;我已经尝试了两者。)
当输入元素模糊时,我使用文本输入渲染一个新组件。
我想给新的文本输入焦点。
我尝试了componentDidMount
,componentWillUpdate
,以及componentdiddupdate
;我尝试了命名和函数ref
s;我试过了。
聚焦本身是工作的,例如,一旦它被渲染,如果我点击初始输入,焦点会转移到新输入(这是一个错误,但与聚焦相比,微不足道)。
第一个输入有一个onBlur
,它设置用于告知第二个输入渲染与否的状态。
在模糊处理程序中,我尽可能地停止事件。
当我从第一个元素中进行制表时,我已经“超过”了新渲染的元素,例如,我当前的裸体设计中的浏览器选项卡栏–我猜新元素还没有渲染?
class SecondInput extends Component {
componentDidUpdate = (prevProps, prevState) => {
if (!this.props.hidden) this._input.focus()
}
render = () =>
<input type="text" hidden={this.props.hidden} ref={(c) => this._input = c}
}
class NewItem extends Component {
state = { itemEntered: false }
itemBlurred = (e) => {
e.preventDefault()
e.stopPropagation()
this.setState({ itemEntered: true })
}
render = () =>
<div>
Item: <input type="text" onBlur={this.itemBlurred} />
<SecondInput hidden={!this.state.itemEntered} />
</div>
}
有什么想法或提示吗?我不得不相信这是显而易见的,因为这种情况肯定一直在发生。
我也对任何其他形式的组件层次结构持开放态度,例如,如果我需要一个容器以某种方式包装所有这些东西,那很好。
反应15.3.2
您看到的问题似乎是,当您按tab键时,页面上没有更多可聚焦的元素,因此焦点转到地址栏。由于某些原因,当焦点位于地址栏上时,只需调用this.\u input.focus()
不会像您预期的那样获取焦点。
为了解决这个问题,我添加了一个空div,并根据是否显示第二个输入设置tabIndex
属性。
为了让事情更简单,我将输入焦点放在挂载上,而不是使用隐藏属性。这可能在你的情况下工作,也可能不工作,但它似乎更干净,因为如果它是一个受控的输入,它将防止输入在每个键盘上调用焦点。
let Component = React.Component;
class SecondInput extends Component {
componentDidMount(){
this.textInput.focus()
}
render(){
return (
<input type="text" ref={(input) => this.textInput = input} />
)
}
}
class NewItem extends Component {
state = { itemEntered: false }
itemBlurred = (e) => {
//e.preventDefault()
//e.stopPropagation()
this.setState({ itemEntered: true })
}
render = () =>
<div>
Item: <input type="text" onBlur={this.itemBlurred} />
{
this.state.itemEntered ? [
<SecondInput/>
] : []
}
<div tabIndex={this.state.itemEntered ? null : 0}/>
</div>
}
ReactDOM.render(<NewItem />, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.0/react-dom.min.js"></script>
问题内容: 呈现组件后,将焦点设置在特定文本字段上的反应方式是什么? 文档似乎建议使用引用,例如: 在渲染函数中的输入字段上进行设置,然后调用: 但是我应该在哪里称呼它呢?我已经尝试了几个地方,但无法正常工作。 问题答案: 您应该这样做,而不是。像这样
我正在使用react,希望输入文本显示内存数据存储中的值,然后在值更改时更新存储,从而触发重新渲染。我看到的问题是,我的输入文本在重读时失去了焦点。我已经尝试设置key属性,覆盖shouldComponentUpdate并返回false,以防止react重新为组件命名,但没有效果。不管怎样,后者似乎不是一个好的长期解决方案。 从文档: 请注意,在未来的React中,可能会将ashidCompone
问题内容: 呈现组件后,将焦点设置在特定文本字段上的反应是什么? 文档似乎建议使用引用,例如: 在渲染函数中的输入字段上进行设置,然后调用: 但是我应该在哪里称呼它?我已经尝试了几个地方,但无法正常工作。 问题答案: 您应该这样做,而不是。像这样
问题内容: 我有一些自定义验证代码,其中包括$ formatter。(为了正确起见,我将货币以便士存储,但以磅为便士显示。) 如果用户在输入中键入“ 10”(这是一个有效值),则输入移至下一个字段后,输入仍显示“ 10”。 我希望它显示10.00以保持一致性。 如果模型将值更改为1000,那么格式化程序将使该字段显示为“ 10.00”。 我希望格式化程序在field.blur()上运行(只要输入有
我想在我停止在输入文本框中键入字符(而不是在键入字符时)后触发一个事件。 我尝试过: 但是这个例子为每个输入的字符产生一个超时,如果我输入20个字符,我会收到大约20个AJAX请求。 在这个小提琴上,我用一个简单的警报而不是AJAX来演示同样的问题。 有解决办法吗,还是我只是用了一个糟糕的方法?
我有一个表单,其中有一条错误消息,如下例所示: http://codepen.io/anon/pen/dYWyEM?editors=101 重现问题的步骤如下: 打开coDepen链接后, 1)专注于输入领域 2) 按提交按钮 3) 由于首先触发模糊事件,因此首先隐藏错误消息,从而更改提交按钮的位置。因此,点击事件根本没有注册,我需要再次点击以提交表单。 有没有办法先发送提交事件? 我需要检测触发