React.js对this.props.children的设计实践
React.js design practice for this.props.children
我想我正在跟上React的速度,但有一件事我不确定,那就是如何做得最好。
我有一个页面,上面有三个小部件。由于我希望在所有小部件上具有相同的行为和样式,因此我将每个组件包装在一个<PageAreaTemplate/>
标记中,该标记负责样式和布局。使用这种方法的一个原因是,在不需要PageAreaTemplate
或其他模板的地方,我也使用了内部组件。
在PageAreaTemplate
中,我简单地将this.props.children
包裹在样式化所需的组件中。
现在我需要让一些小部件在PageAreaTemplate
的标题中添加工具栏(每个工具栏不同)(如果它被模板包装)。通过克隆children
并在PageAreaTemplate
中添加setToolbar
函数,这是可行的,但这肯定感觉不对。
你的经验是什么是最好的方法来实现这一点?
通常的做法是接受一个子元素,克隆它,然后稍微修改一下返回——无论是添加额外的属性还是功能。
function renderChildren(props) {
return React.Children.map(props.children, child => {
return React.cloneElement(child, {
setToolbar: () => ()
})
})
}
这只是扩展当前子元素,就像你说的,Object.assign
,而不是操纵当前子元素。
上面的函数应该允许你添加任何需要的逻辑,以确保你得到你想要的。检查组件的类型或某些属性值
我使用@kelly-j-andrews建议的方法解决了我的问题,在父组件上设置工具栏,但它需要更多的技巧,通过设置内部组件的状态来真正使工具栏上的更新工作并可见(内部组件的工具栏部分),因为内部组件上的更新不会触发父组件的渲染。
我最后做的是:
- 在外部组件(
PageAreaTemplate
)中,我克隆了每个子组件并根据上面的示例修改了它。 - 在内部组件中,在生命周期函数调用
componentDidMount
中执行setToolbar
设置初始组件 - 由于单击工具栏上的按钮会改变内部组件的状态,因此我再次在
componentDidUpdate
上设置工具栏(setToolbar
)以强制渲染外部组件。在较早的阶段调用setToolbar
会产生一个反映更新前状态的工具栏。
这可能不是什么新东西,但是因为我的问题不仅是能够在父组件中设置组件,而且还要确保内部组件的状态正确反映在工具栏中,我回答了我自己的问题。
它仍然不像是一个最佳的解决方案,但再次,它是有效的…!
- 可以't让我的if语句处理js中的html表单输入
- 使用agility.js进行页面布局和合成
- 使用Clipboard.js复制span文本
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 强制模板刷新ember.js
- 如何编写HTML输入的JS内联
- Angular JS IE9 Hashbang url rewriting
- 使用JS将数组转换为json对象
- Node.js v6.2.0类扩展不是函数错误
- 当js函数's已执行
- 要求未定义JS回调参数
- 在自定义mean.io包中使用angular-chart.js作为依赖项
- 无法在数据endVal中设置值=“”;{{ucount}}”;使用Angular JS的CountUp
- 如何从Java/scala调用js美化程序
- 如何更改<svg>标记为<img>用js标记
- Three.js将映射分配给object.children[0]会更改整个object's地图
- Vue.js $children按组件名称
- Xui.js .children() alternative
- React.js对this.props.children的设计实践
- 我可以通过props.children React JS将道具传递给孩子们吗