javascript - 如何覆盖高阶组件的默认道具?
问题描述
我有一个具有这些默认道具的高阶:
defaultProps = {
className: null,
duration: 400
};
现在我有另一个组件,例如<InnerBox />
使用这个高阶组件作为扩展。如何从<InnerBox />
高阶组件的 defaultProps 值中覆盖?
当我尝试从内部做同样的事情时<InnerBox />
:
static defaultProps = {
className: "classnameforthiscomponent"
duration: 300
};
它不起作用。我为 定义不同的默认组件的原因是因为该组件是由路由器生成的(即在另一个文件上设置)所以我不能从外部将道具传递给它,如下所示:
<InnerBox
duration={300}
className="classnameforthiscomponent"
/>
我该如何解决这个问题?
解决方案
如何从
<InnerBox />
高阶组件的 defaultProps 值中覆盖?
海事组织 你不能,因为<InnerBox />
不知道它是如何被调用的。
一旦它得到它props
,它就不知道它们来自哪里;作为道具传递给 HOC 或 defaultProps 或其他;至少它应该是这样的。
defaultProps
您可以提供将要为该 HOC 包装的组件旁边传递的能力
const wrapper = (component, defaultProps) => // your HOC
或者您的 HOC 可以使用包装组件的 defaultProps
//maybe like
const wrapper = (component) => {
return class {
static defaultProps = Object.assign({}, HOC.defaultProps, component.defaultProps);
}
}
或者你或你根本不使用defaultProps
这个 HOC。
任何一个:
render(){
let props = {
...defaults,
...InnerBox.defaultProps,
...this.props
}
return <InnerBox {...props} />;
}
或者您只是通过props
, don't useHOC.defaultProps
但现在包装的组件必须处理可能未定义的道具。
无论如何,您必须修复 HOC。
InnerBox
不能操纵它所包裹的组件。 HOC 需要考虑它所包裹的组件。
推荐阅读
- javascript - 如何使数据绑定属性不区分大小写?
- javascript - 如何在第 2 次之后停止执行第 1 项功能?
- c++ - 在c++中声明一个对象类并在同一个类中使用
- r - 在 R 中绘制多个条件
- entity-relationship - GET_DDL() 到 ERD 图雪花工具
- django - 通过django模板中的外键关系快速访问模型属性
- django - Django Forn 不保存额外信息
- python - 如何通过 Python 向 Selenium 动态提交命令?
- javascript - Flip Clock 代码可在 Codepen 上运行,但不能在本地运行
- directory - 如何在 Squarespace 上创建可搜索目录?