javascript - 在 Reactjs 中停止事件传播
问题描述
我正在尝试创建一个父子组件。就我而言,子组件<Person/>
具有包装器div
和input
元素。我对配置的div
和更改事件有一个点击事件input
。
我需要点击事件来删除这个人,而当我输入输入时,它应该更新名称。出于某种原因,当我开始在输入字段中输入时,这两个事件都会被触发。preventDefault()
我尝试使用and取消事件,stopPropagation()
但不起作用。任何帮助将不胜感激。
请找到下面的演示代码。
(function () {
class Person extends React.Component {
render() {
return (
<div onClick={this.props.onClickParent}>
<h1>{this.props.name} : {this.props.age}</h1>
<input
value={this.name}
onChange={this.props.onNameChange}
onFocus={
ev => {
ev.preventDefault();
ev.stopPropagation();
ev.nativeEvent.stopImmediatePropagation();
ev.nativeEvent.preventDefault();
ev.nativeEvent.stopPropagation();
this.props.onNameChange();
}
}
/>
</div>
)
}
}
class App extends React.Component {
state = {
people: [{
age: 36,
id: 1,
name: 'Jon'
}, {
age: 28,
id: 2,
name: 'Bob'
}],
}
onNameChange() {
console.log('onNameChange')
}
onClickParent() {
console.log('onClickParent')
}
render() {
return (
<div>
{
this.state.people.map(person => {
return (
<Person
name={person.name}
age={person.age}
key={person.id}
onClickParent={this.onClickParent}
onNameChange={this.onNameChange}
/>
)
})
}
</div>
);
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
解决方案
我相信你应该只需要停止在onClick
输入元素的处理程序中传播。这是否按预期工作?
(function () {
class Person extends React.Component {
render() {
return (
<div onClick={this.props.onClickParent}>
<h1>{this.props.name} : {this.props.age}</h1>
<input
value={this.name}
onChange={this.props.onNameChange}
onClick={e => {
e.stopPropagation()
}}
onFocus={
ev => {
this.props.onNameChange();
}
}
/>
</div>
)
}
}
class App extends React.Component {
state = {
people: [{
age: 36,
id: 1,
name: 'Jon'
}, {
age: 28,
id: 2,
name: 'Bob'
}],
}
onNameChange() {
console.log('onNameChange')
}
onClickParent() {
console.log('onClickParent')
}
render() {
return (
<div>
{
this.state.people.map(person => {
return (
<Person
name={person.name}
age={person.age}
key={person.id}
onClickParent={this.onClickParent}
onNameChange={this.onNameChange}
/>
)
})
}
</div>
);
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
推荐阅读
- jquery - 为什么我收到 TypeError: $(...).DataTable is not a function?
- amp-html - 使用 AMP 插件时如何将 'controls' 属性添加到 'amp-carousel'?
- android - 在 RecyclerView 中滚动时,单选按钮会丢失值
- ios - Flutter IOS使用连接或wifi插件读取wifi名称
- python - keras - 嵌入层 mask_zero 导致后续层出现异常
- asynchronous - 记录异步通信
- python - 使用独特的函数从excel文件中返回数据
- javascript - 如何在nestjs中执行嵌套路由?
- google-cloud-platform - 保护未经身份验证的 Cloud Run 端点
- laravel - 如何在 Laravel 中手动重新发送电子邮件验证?