为什么当同级节点的“display”属性发生更改时,React 组件的 onClick 事件处理程序不会触发
Why does a React component's onClick event handler not fire when the "display" attribute of a sibling node is changed?
我们遇到了一个问题,不确定我们做错了什么。我们在这里重新创建
问题
我们有 3 个组件,一个父表单组件,它有 2 个子组件,一个输入和一个按钮。该按钮已注册onMouseDown
和onClick
处理程序。输入已注册onBlur
处理程序。如果聚焦输入,然后单击按钮,按钮的onMouseDown
将触发,然后是输入的onBlur
。onBlur
触发父表单组件的重新呈现,以更新其 CSS 类。这个error
的新类会导致输入和按钮的同级div
变得可见,根据 jsFiddle 中的 CSS 规则。看来,此 CSS 规则的更改是导致按钮的onClick
处理程序永远不会触发的原因。如果您尝试再次单击该按钮,它将按预期工作。
有人知道这里会发生什么吗?
这是JS代码:
var state = {
messages: []
}
var MessageCenter = React.createClass({
messages: function () {
return this.props.messages.map(function (message, i) {
return <div key={i}> {message}</div>
})
},
render: function () {
return <div>
<h3>Events</h3>
<div>{this.messages()}</div>
</div>
}
})
ReactDOM.render(
<MessageCenter messages={[]}/>,
document.getElementById('messageCenter')
)
function printMessage(message) {
state.messages.push(message)
ReactDOM.render(
<MessageCenter messages={ state.messages }/>,
document.getElementById('messageCenter')
)
}
var Button = React.createClass({
handleClick: function (event) {
this.props.handleClick(event)
},
handleMouseDown: function (event) {
printMessage('Button Mouse Down handled')
},
render: function () {
printMessage('Button Rendered')
return <div>
<button onClick={ this.handleClick } onMouseDown={ this.handleMouseDown }> Click Me</button>
</div>
}
})
function updateForm(className, errorMessage) {
ReactDOM.render(
React.createElement(Form, {
className: className,
errorMessage: errorMessage
}),
document.getElementById('container')
)
}
var Form = React.createClass({
getInitialState: function () {
return {
showButton: false
}
},
classNames: function () {
return this.props.className
},
handleButtonClicked: function (event) {
printMessage('Button Click handled')
updateForm('success', '')
},
handleBlur: function (event) {
printMessage('Input Blurred')
updateForm('error', 'Why did the buttons onClick handler not ever run?')
},
showChild: function (event) {
this.setState({
showButton: true
})
},
button: function () {
if (this.state.showButton) {
return <Button className="" handleClick={ this.handleButtonClicked }/>
}
},
render: function () {
printMessage('Parent Rendered')
return <div>
<div className={ this.classNames() }>
<input onBlur={ this.handleBlur } onFocus={ this.showChild }/>
<div className="error-message"> { this.props.errorMessage } </div>
{ this.button() } </div>
</div>
}
})
ReactDOM.render(
<Form className="" errorMessage=""/>,
document.getElementById('container')
)
和 CSS:
body {
font-family: sans-serif;
}
#instructions,
#content {
width: 50%;
float: left;
}
#messageCenter,
#container {
margin-top: 10px;
width: 100%;
}
#messageCenter div,
#container div {
padding: 5px 0px;
width: 300px;
margin: 0 auto;
}
.error {
border: solid 1px red;
}
.success {
border: solid 1px green;
}
div.error-message {
display: none;
}
.error div.error-message {
display: block;
}
一个
click
事件是一个mousedown
后跟一个mouseup
,而不离开或改变元素。
按钮上放了一些东西,或者鼠标在鼠标向上之前移动,或者您在鼠标向上之前手动重置input.focus()
,或者......
。别的东西。。。
然后没有点击。
onBlur
将按钮从鼠标指针下方移出。这发生在处理单击之前,因此您最终不会实际单击按钮。这是相当标准的行为。
相关文章:
- React重新渲染但未显示正确的组件
- React组件等待所需道具进行渲染
- 如何在react js中将值从一个组件发送到另一个组件
- React Native通过Navigator将用户输入数据传递到选项卡栏IOS中的组件
- React组件-设置页面标题
- 为react组件传递道具的最佳方式
- react组件中的绑定方法
- 如何在react js中移动第二个组件
- 如何在react路由器的组件中使用参数
- React+Redux性能优化与组件ShouldUpdate
- React-将jSON数据传递给子组件的子组件
- React js更改状态不会更新组件
- 加载服务器端渲染的React组件后执行脚本
- React ClickDrag子组件回调
- 如何在渲染函数中检查 react 中子组件的状态
- 以最封装的方式封装/封装ScalaJS react js组件(react stick)
- bind():您正在将一个组件方法绑定到该组件.React会自动为您执行此操作
- 如何将值从父组件传递到子组件(react)
- 将函数从HOC传递到组件(React, React native)
- 根据屏幕大小以不同的顺序呈现组件(React)