在React组件中需要特定类型的子组件
Require children of certain type in React Component
我正在为下拉菜单创建一个自定义React组件。我想到的使用这个组件的结构是在
行之间的东西。<Dropdown>
<DropdownTrigger> // The button that triggers the dropdown to open or close
open me
</DropdownTrigger>
<DropdownButton> // A button inside the dropdown
Option 1
</DropdownButton>
</Dropdown>
我想实现这一点的方式,是通过让Dropdown
组件检查其子组件中是否有DropdownTrigger
组件,如果有,使用React.cloneElement
克隆给定的DropdownTrigger
组件并传递onClick
属性,该属性调用Dropdown
组件上的状态更新。
Dropdown.js
的小代码片段
import DropdownTrigger from './DropdownTrigger';
_toggleDropdown () {
this.setState({
isOpen: !this.state.isOpen
});
}
_renderTriggerButton () {
const triggerChild = this.props.children.find(child => child.type === DropdownTrigger);
return React.cloneElement(triggerChild, {
...triggerChild.props,
onClick: () => this._toggleDropdown()
});
}
这是正确的方法吗?如果是,验证Dropdown
组件有DropdownTrigger
作为子组件的最干净/最好的方法是什么?因为这意味着开发人员总是必须包含DropdownTrigger
作为Dropdown
组件的子组件,我希望有一个很好的方法告诉开发人员他们应该传递<TriggerButton>
组件作为下拉菜单的子组件。
我也愿意听取关于结构变化的建议。谢谢!
使用React。cloneElement将附加属性传递给子组件。结合instanceof,你可以做你想做的事情。
可能是这样的…
import React from 'react';
import DropdownTrigger from './DropdownTrigger';
class DropDown extends React.Component {
constructor(props) {
super(props);
}
...
render() {
return (
<div>
{React.Children.map(this.props.children, child => {
const additionalProps = {}
// add additional props if it's the DropdownTrigger
if (child instanceof DropdownTrigger) {
additionalProps.toggleDropDown = () => { } ...
}
return React.cloneElement(child, additionalProps);
})}
</div>
);
}
}
export default DropDown;
相关文章:
- 组件类型角度指令 ng 模板
- React 组件流类型检查中的可选函数属性失败
- 嵌入 API 自定义组件:未捕获类型错误:无法读取未定义的属性“ViewSelector2”
- 如何访问 enyo 类型的儿童组件
- 未捕获的错误:不变冲突:元素类型无效:需要字符串(对于内置组件)或类/函数,但得到:对象
- React dnd-不确定如何为相同类型的嵌套组件启用拖放
- react router问题未捕获错误:不变冲突:元素类型无效:应为字符串(用于内置组件)
- ReactJS组件PropTypes——用一组参数指定一个函数类型
- React无状态功能组件的流返回类型是什么?
- 另一个组件中的组件测试类型
- ReactJS: '类型未定义'加载组件时
- 从react组件'数组类型状态属性弹出的正确方式
- 类型错误在谷歌分析图表web组件
- 在React组件中需要特定类型的子组件
- 查找所有类型为reactjs的组件
- 使用React,我如何基于类型呈现组件
- 如何允许输入类型=file在react组件中选择相同的文件
- 类型转换:组件到RadioButtonStyle
- 如何声明React.来自外部模块的组件类型,具有单独的声明文件
- 元素类型无效:期望是字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义