在React的内部标记中添加事件处理程序/道具
Adding Event Handlers/Props to inner markup in React
我试图在React中创建一个可重复的组件。目标是,它可以给定任何有效的React组件group
,并接受任何callbacks
列表,并将这些回调应用于group
元素。下面是我的工作原理,我将解释它与我想要做的有什么不同。链接到codepen:
http://codepen.io/cirsca/pen/vKqzjZ?编辑= 0011
我的包装组件:
class App extends React.Component {
constructor(props){
super(props)
this.state = {
callbacks: {
onClick: (e) => console.log('I was clicked!')
}
}
}
render(){
return <div>
<Repeatable
group={<Group />}
{...this.state.callbacks}
/>
</div>
}
}
我的中继器组件:
class Repeatable extends React.Component {
constructor(props){
super(props)
const {group, ...callbacks} = this.props
this.state = {
group: group || <div>This is awesome!</div>,
list: [group],
callbacks
}
}
addGroup = () => this.setState({
list: [
...this.state.list,
this.state.group
]
});
render(){
return <div id={this.props.cssID || 'react_repeatable'}>
<button onClick={this.addGroup}>Add Group</button>
<div className="repeated__list">
{this.state.list.map(el => {
return React.cloneElement(el, {...this.state.callbacks})
})}
</div>
</div>
}
}
我的dummy Group组件是:
const Group = ({className, ...callbacks}) => (
<div className={className || 'repetable__block'} {...callbacks}>
<p>Here is a repeatable group!</p>
</div>
)
只要我想将我的回调附加到Group
组件中的根元素,这就可以工作。我想要的是一种方式,我的callbacks
可以针对嵌套的p
标签,或者我不能对每个底层组件和动作进行十亿次onClick={callbacks.onClick ? ....}
检查(以防出现新的onAction,我没有放入我的代码中)。
我觉得我在这里过于复杂的事情,但我不确定去哪里找,或者谷歌什么开始。
可以递归克隆子元素并向下传递props
const recursiveCloneChildren = (children, props) => {
return React.Children.map(children, child => {
let childProps = {};
if (React.isValidElement(child)) {
childProps = props;
}
childProps.children = this.recursiveCloneChildren(child.props.children);
return React.cloneElement(child, childProps);
})
}
const Group = ({className, children, ...callbacks}) => (
<div className={className || 'repetable__block'} {...callbacks}>
{recursiveCloneChildren(children, callbacks)}
</div>
)
相关文章:
- 正在将事件处理程序添加到不存在的类
- 动态添加对象的jQuery事件处理程序
- 如何将 Promise 添加到 javascript 中的事件处理程序
- 在 javascript 中添加事件处理程序的位置
- 为什么在模糊事件处理程序中添加setTimeout会修复“;掩蔽”;另一个单击处理程序的
- 是否存在添加两个相同事件处理程序的默认行为
- 递归添加单击事件处理程序
- 可以't将事件处理程序添加到ID为的按钮中
- AngularJS:如何从指令添加的元素中删除事件处理程序
- Javascript事件处理程序总是被添加到数组中的最后一个对象
- 将事件处理程序动态添加到选择框中
- 如何将事件处理程序添加到单击按钮时呈现的元素
- Resharper 9 在 JavaScript 事件处理程序中为 HTML 元素添加了空格
- 添加事件处理程序以获取按钮单击LeadPage,我可以在其中对正文进行编码
- 是否可以将事件处理程序添加到 JavaScript 函数/类中
- Tinymce 4 如何添加事件处理程序
- 当函数绑定在构造函数中时,如何在 ES6 React 中向事件处理程序添加参数
- 使用 on() 将事件处理程序添加到尚不存在的元素
- Facebook社交插件:如何在Facebook评论框中为“查看更多”评论添加事件处理程序
- 调试JavaScript和css代码:添加一个事件处理程序