On this page
业务组件设计个人实践
Mar 15, 2021
- 基础组件:提供基本功能,适用通用场景
- 业务组件:在基础组件的基础上,加入特定功能,适用特定场景
-
集成复杂度:业务侧使用该组件的复杂程度
越高越复杂
-
控制反转(IoC):代码耦合程度
越高耦合度越低
组件
一个受控组件,外部数据为 “单一真实来源”
class SearchTable extends React.Component {
render() {
const {
dataSource,
loading,
onPaginationChange,
} = this.props;
return (
<Fragment>
<Form />
<Table dataSource={dataSource} loading={loading} />
</Fragment>
);
}
}
state = {
loading,
dataSource,
};
const fetchData = async () => {
state.loading = true;
await fetch();
state.loading = false;
state.dataSource = [];
};
const handleChangePage = () => {
fetchData();
};
const doSotine = () => {
ref.doSomething();
};
return <SearchTable ref={ref} loading dataSource onChangePage={handleChangePage} />;
- 数据交互都是放在业务侧的,仍旧会有许多样板代码
- 需要通过 ref 来操作组件事件
- 组件臃肿,随着功能增强,越来越难维护
一个集成了数据来源逻辑,功能逻辑,已经传好参数的组件的hooks
const BaseSearchTable = ({ ...props }) => <Table {...props} />
const useSearchTable = ({ fetchMethod, tableProps }) => {
const [dataSource, setDataSource] = useState()
const [loading, setLoaidng] = useState()
const fetchData = await () => {
setData()
}
const SearchTable = ({ props }) => {
<BaseSearchTable
dataSource={dataSource}
loading={loading}
{...tableProps}
{...props}
/>
}
return {
SearchTable,
dataSource,
}
}
const { SearchTable, deleteRow } = useSearchTable({
fetchMethod: 'xxx',
rowKey: 'xxx',
});
const handleDoSomething = () => {
deleteRow();
};
return <SearchTable />;
- hooks 逻辑肿,随着功能增强,越来越难维护。
- 又可以向 hooks 传参、又可以向导出的组件传参,容易出问题。
- hooks 应该是干净的,抽象的,而这里不仅复杂,还暴露了组件。
一个只处理数据、内部逻辑的,返回组件所需 props 的 hooks
const useSearchTableProps = ({ fetchMethod }) => {
const fetchData = () => {}
return {
dataSource,
loaing,
deleteRow,
updateRow,
}
}
const useSearchTable = () => {
}
const SearchTable = ({ props }) => {
const {
dataSource,
loaing,
} = useSearchTableProps({
...props
})
return (
<BaseSearchTable
dataSource,
loaing
/>
)
}
可以直接使用集成好的(也可以单用 hook,自己定义功能)
const searchTable = useSearchTable();
const doSomething = () => {
searchTable.deleteRow();
};
console.log(searchTable.dataSource);
return (
<SearchTable
searchTable={searchTable}
fetchMethod="xxx"
{...otherProps}
/>
);
- 实现复杂度变高
- 缺乏可见性,需要很好的理解 hooks 的内部逻辑
(只评价集成好的 SearchTable,而非 hooks)
- 业务组件:应该是低集成复杂度,提高业务编写效率,但是相对的代价是控制反正程度也会低
- 想要更多的控制权,就会增加业务集成复杂度
- 基础组件库:会为了更好的通用性,更低的耦合度,带来高的复杂度