【问题标题】:converting from classes to Functional component with composition parent-child从类转换为具有组合父子的功能组件
【发布时间】:2021-04-02 12:51:03
【问题描述】:

我正在尝试将具有继承的 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 中的这些功能,因为我有一些“SpecificTables”。我正在考虑创建 ReactContext,但仍然遇到问题。

【问题讨论】:

  • 您需要发布您尝试过的内容以及您认为哪里出错了。
  • React 明确鼓励组合优于继承——即从 React.Component 以外的东西扩展的类组件是一种反模式。如果您已经转换为功能组件,那么现在是摆脱它的好时机。您可以通过钩子重用函数。

标签: javascript reactjs react-functional-component


【解决方案1】:

编辑:添加链接到我对composition over inheritance的评论

在功能组件中,您可以通过创建一个可重用的钩子来实现,该钩子可由以前扩展 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];
}


【讨论】:

  • 感谢@Adam 的回答!您能否进一步扩展您的答案,使其更接近我的示例?我阅读了有关组合与继承的 React 文章,但仍然无法使用父母钩子管理孩子的状态。
猜你喜欢
  • 2021-02-21
  • 2021-02-08
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2020-08-26
  • 1970-01-01
相关资源
最近更新 更多