reactjs - 如何在这里传递状态?
问题描述
我有一个ModifyWordPartButton
具有 stateisHovered
和 child的组件IconButton
。IconButton
onclick
那是另一个组件的子组件,SelectWordPartToModify
,它有一个方法handleClickOpen()
。IconButton
应该能够拥有它的onClick
= 。SelectWordPartToModify
handleClickOpen()
使用此代码时:
ModifyWordPartButton
:
.
.
.
render() {
return (
<div>
<IconButton className={this.state.isHovered ? 'hoveredClass' : null />
</div>
);
}
SelectWordPartToModify
:
.
.
.
render() {
<ModifyWordPartButton />
}
导致IconButton
继承ModifyWordPartButton
的isHovered
状态而不是继承SelectWordPartToModify
的状态handleClickOpen()
。
当我使用此代码时
ModifyWordPartButton
:
.
.
.
render() {
return (
<div>
{this.children}
</div>
);
}
SelectWordPartToModify
:
.
.
.
render() {
<ModifyWordPartButton onClick={this.handleClickOpen}>
<IconButton onClick={this.handleClickOpen}
</ModifyWordPartButton
}
IconButton
不继承ModifyWordPartButton
的isHovered
状态。
我尝试用ModifyWordPartButton
'srender()
替换this.props.children
:
this.props.children.map(
child => {
React.cloneElement(child, this.state)
}
)
但是 React 给了我一个关于不识别IconButton
'isHovered
属性的错误。
这是我使用的完整代码: https ://codesandbox.io/s/zwlz41mo93?codemirror=1&eslint=1&fontsize=14
我该如何解决这个问题?
解决方案
抱歉,我不完全理解你的问题,但是.. 你不能传递多个道具给IconButton
? 类似于以下内容:
SelectWordPartToModify
render() {
return <ModifyWordPart handleClick={this.handleClickOpen} />
}
ModifyWordPart
render() {
return (
<IconButton
className={this.state.isHovered ? 'hoveredClass' : null}
handleClick={this.props.handleClick} />
);
}
这种方式,handleClickOpen
必须在 中定义SelectWordPartToModify
,并且可以在IconButton
using中执行this.props.handleClick()
。此外,您还拥有基于属性的className
ofIconButton
isHovered
ModifyTwoPart
编辑:关于你的沙箱:
在第 78 行,
ModifyWordPartButton
你不应该写handleClickOpen={this.handleClickOpen}
,而是onClick={this.handleClickOpen}
:作为div
一个简单的 DOM 元素,你不能像你自己的组件一样向它传递属性。同样,在同一文件的第 71 行,您应该使用
onClick
代替handleClickOpen
:IconButton
确实是一个组件,但它属于 Material UI 并且似乎需要一个onClick
道具。此外,在这两行中你不应该写
this.handleClickOpen
,而是this.props.handleClickOpen
,因为函数被传递给ModifyWordPartButton
使用道具!我猜第
IconButton
60-68 行的行SelectSuffixToModify
可以在没有任何成熟的情况下被删除(如果我做对了你想做的事,那么把它留在那里根本没有用)。
我已经分叉了你的 sandCodebox,在这里 → https://codesandbox.io/s/6wxj4nyn6z我认为它可以满足你的要求。
不过,我认为您需要澄清一下,因为根据您所写的内容,我认为您的脑海中有些混乱。当您编写自己的组件时,您可以让他们期待您想要的道具:在您的示例中,ModifyWordPartButton
是您自己的组件,并且您以期望名为的道具的方式创建了他handleClickOpen
;因此,当您从SelectSuffixToModify
render()
方法中调用它时,您可以使用handleClickOpen={...}
.
相反,IconButton
它是由其他人制作的,因此您应该知道它的道具是什么!我猜你可以在材料 UI 的官方文档中找到它的信息 :)
推荐阅读
- c# - 根据请求对象属性动态构建查询
- java - Java Spring-boot 由以下原因引起:org.springframework.data.mapping.PropertyReferenceException:找不到类型的属性 ID
- mysql - 如何在 Windows 中使用 MySQL Workbench 批量编辑 .sql 转储文件?
- python - 为大型 hdf5 文件重命名组中的所有 HDF5 数据集时出现问题
- javascript - 尝试确定是否已加载所有图像时,Node.js 挂起
- wordpress - Visual Composer 前端仅供用户使用
- mysql - edmx 错误'无法转换'MySql.Data.MySqlClient.MySqlProviderServices''System.Data.Common.DBProviderServices'类型的对象
- java - 数据模型类可以为抽象对象及其子对象保存多个列表吗
- javascript - JsGrid 跳过一行
- vba - 拆分 MailMerge 文档:为什么最后一个文档是空的?