Javascript 使用x27作出反应;parentNode';正确地
假设我有一系列静态的Javascript 使用x27作出反应;parentNode';正确地,javascript,reactjs,events,Javascript,Reactjs,Events,假设我有一系列静态的divs,它们创建了包含少量子元素的行。其中一个子项有一个单击处理程序,它应该触发特定于其父项的事件div。事件需要以父级div为目标,因为我们仅在父级中更改某些样式 我在下面的代码中针对每个孩子的parentNode是否正确?(基本上,这是最佳实践吗?) 谢谢 class ClickExample extends Component { handleClick = (e) => { const parentDiv = e.target.parentNod
div
s,它们创建了包含少量子元素的行。其中一个子项有一个单击处理程序,它应该触发特定于其父项的事件div
。事件需要以父级div
为目标,因为我们仅在父级中更改某些样式
我在下面的代码中针对每个孩子的parentNode
是否正确?(基本上,这是最佳实践吗?)
谢谢
class ClickExample extends Component {
handleClick = (e) => {
const parentDiv = e.target.parentNode;
parentDiv.classList.toggle('someClass');
}
render() {
return (
<div>
<div>
<h1 onClick={(e) => { this.handleClick(e) }}>Click Me!</h1>
</div>
<div>
<h1 onClick={(e) => { this.handleClick(e) }}>No, Click Me!</h1>
</div>
</div>
);
}
}
export default ClickExample
类ClickExample扩展组件{
handleClick=(e)=>{
const parentDiv=e.target.parentNode;
parentDiv.classList.toggle('someClass');
}
render(){
返回(
{this.handleClick(e)}>点击我!
{this.handleClick(e)}>不,点击我!
);
}
}
导出默认单击示例
这种方法与React理念背道而驰。您应该为此定义一个组件。您应该多读一点React哲学,但正确的方法如下:
class ClickableComponent extends React.Component {
render() {
return (
<div onClick={this.props.onClick}>
{ this.props.children }
</div>
);
}
}
class ClickExample extends React.Component {
handleClick() {
this.setState({
active: null
});
}
render() {
return (
<div>
<div className={this.state.active === 1 ? 'someClass' : null}>
<ClickableComponent onClick={() => this.setState({ active: 1 })}>
ClickMe
</ClickableComponent>
</div>
<div className={this.state.active === 2 ? 'someOtherClass' : null}>
<ClickableComponent onClick={() => this.setState({ active: 2 })}>
No, ClickMe!
</ClickableComponent>
</div>
</div>
);
}
}
export default ClickExample
类ClickableComponent扩展React.Component{
render(){
返回(
{this.props.children}
);
}
}
类ClickExample扩展了React.Component{
handleClick(){
这是我的国家({
活动:空
});
}
render(){
返回(
this.setState({active:1})}>
点击我
this.setState({active:2})}>
不,点击我!
);
}
}
导出默认单击示例
Hmm。。。这并不能解决我的问题。在您的代码中,ClickableComponent
与其父容器之间仍然没有意识到。我想用onClick
更改标记的直接父级的样式,但您的代码只需更改用于包装ClickableComponent
的子级的div
的样式,而不是ClickableComponent
的父级。这就是我的意思。子元素不应直接访问父元素。我编辑我的答案是为了告诉你如何实现你想要的ClickExample
处理代码中单击的逻辑,并将类正确地添加到div容器中ClickableComponent
现在只需在其道具中搜索onClick
,然后调用ClickExample
logic。因此,子组件不知道有关其父组件的任何信息,但会在单击时告知,以便父组件调整其样式。