reactjs - 泛型还是分解?什么是正确的反应方法
问题描述
我有一个在 Angular 中使用 typescript 开发的应用程序,它有 20 多个屏幕,其中包含不同实体的列表视图,例如电影列表、演员列表、剧院列表等。我创建了一个BaseListComponent<T extends Base>
角度并封装了大多数常见功能,例如如查看、过滤、删除、搜索、分页等BaseListComponent
。我正在创造它的孩子MoviesListComponent extends BaseListComponent<Movies>
。这样,我需要在子类中添加最少的功能,以减少错误范围以及单元测试用例的工作量。
现在我正在将此应用程序转换为带有 typescript 的 React。我正在研究 React hooks 并了解到许多开发人员更喜欢基于函数的方法而不是基于类的组件。如何使用函数创建上述结构。据我了解,函数没有继承。所以我怀疑泛型在功能上是否可行。如果没有,我该如何使用 react 流行的分解方法来解决这个问题?是否有在反应中使用泛型或分解的指南?
解决方案
要做到“反应风格”,首先你必须制作一个组件BaseListComponent
。然后把你列出的功能“查看、过滤、删除、搜索、分页等”放在这个里面。但是,当您希望某些函数在派生类时表现不同时,您可以在该函数中放置一个回调。
例如:
renderView = () => { // function of BaseListComponent
const header = (
<div>--I am Header--</div>
);
const footer = () => (
<div>--------</div>
);
const letDerivedClassDecide = this.props.renderCenter();
return (
<div style={{ display: 'flex', flexDirection: 'column' }}>
{header}
{letDerivedClassDecide}
{footer}
</div>
);
}
这个例子的意思是,你可以将基本布局控制为一个垂直的 flex div,但是你让派生类实现this.props.renderCenter
,以便它的结果可以与基本布局结合起来。
view = () => { // function of BaseListComponent
let someResult = 100;
someResult = this.props.view();
return someResult;
}
同样的想法,this.props.view
是通过派生类来实现的。
最后在派生类中它会像:
render() { // function of DeriveComponent; can be MoviesListComponent
return (
<BaseListComponent
renderCenter={this.renderCenter}
view={this.view}
>
);
}
请注意,派生类实际上并不是“派生”或扩展基本组件,它只是将其组合在render()
函数中。所以两者都BaseListComponent
扩展MoviesListComponent
(React.Component
或React.PureComponent
在考虑性能问题时)。
推荐阅读
- mysql - mysql重复id
- docker - 是否可以创建一个仅包含从主机复制的非可执行文件的 docker 映像?
- javascript - 如何在 django-tables 中添加行 ID 以从特定行中获取选定的单选按钮
- php - 在两个表 PDO 上插入数据
- php - mysql检索层次结构中的所有节点,并总结他们的个人销售额和团体销售额
- mysql - 我如何只替换 SQL 函数中的第一个结果
- python - 如何检查我的列表中是否有两个以上的值不同于 0?
- scala - 无法在 GCP Dataproc 上运行 Spark Scala JAR
- javascript - three.js - 修改样条曲线
- if-statement - 如何将 if 语句添加到结构初始化