javascript - 从类转换为具有组合父子的功能组件
问题描述
我正在尝试将具有继承的 React 类转换为功能组件,并且不会错过任何功能。到目前为止,我阅读了大量文章,但无法弄清楚如何做到这一点。主要问题是我的父组件修改了子组件的状态。
# Base class
class BaseTable extends React.Component {
// function to filter table when search text is changed
_onChangeText = (ev, text) => {
// storing filterText as a state, so onDropdownChange() can refresh filter
this.setState({ filterText: text });
if (this.state.items[0] && this.state.items[0].hasOwnProperty(this.state.filterBy)) {
// refreshing the filteredItems array with new query
this.setState({
filteredItems: text ? this.state.items.filter(item => item[this.state.filterBy].toLowerCase().indexOf(text.toLowerCase()) > -1) : this.state.items,
selectedPageIndex: 0
});
}
};
}
export default BaseTable;
通过this
引用扩展它并使用父类方法的子类:
class SpecificTable extends BaseTable {
constructor(props) {
super(props);
}
this.state = {
items: [],
filteredItems: [],
filterText: "",
selectedPageIndex: 0,
isError: false,
errMsg: ''
};
return (
<TextField
label="Search Query:"
onChange={this._onChangeText}
styles={controlStyles}
value={this.state.filterText}
/>
);
}
export default SpecificTable;
目标是将其转换为没有类的功能组件并重用 BaseTable 中的这些函数,因为我有一些“特定表”。我正在考虑创建 ReactContext 但仍然遇到问题。
解决方案
编辑:将链接添加到我关于组合而不是继承的评论
在功能组件中,您可以通过创建一个可重用的钩子来实现,该钩子可由以前扩展 BaseTable 的各种表组件使用
const useBaseTable = () => {
const [state,setState] = useState(your_base_state);
const onChangeText = useCallback((arg) => {
... your onChangeText
},[...relevant dependencies]);
// return your state, setState (if necessary), and your callback
// in reality, you can return whatever you want from this hook
return [state, setState, onChangeText];
}
推荐阅读
- java - 使用 Java Spring RestController 进行条带化 - webhook 错误 404 无效编码:ISO-8859-1
- javascript - REACT - 如何有效地调用依赖异步操作
- flutter - 如何过滤每个类别的显示小部件
- r - 正确的摘要分配
- azure - 将 KEDA 与 Azure 函数队列一起使用时 Pod 突然终止
- python - 从嵌套模块导入函数的简写
- python-3.x - 正确注释类型
和 在蟒蛇? - excel - 使用Text函数在excel中将1K,1M转换为1000,1000 000并转换为数字
- mysql - 在库存数据库系统中保存产品数量的最佳实践是什么
- nginx - 在 mac 上使用 brew 命令安装特定版本的 nginx