javascript - 作为类属性的功能组件是 React 中的反模式吗?
问题描述
在我处理的现有代码库中,有几个地方有一个功能组件作为 React 组件的类属性,以避免将状态、道具和回调传递给子组件。下面是一个示例,或者在CodeSandbox中。
import React from "react";
import "./styles.css";
class App extends React.Component {
state = {
counter: 0
};
ClassPropComponent = () => {
return (
<>
<div>Count is {this.state.counter}</div>
<button
onClick={() => {
this.setState({
counter: this.state.counter + 1
});
}}
>
+
</button>
</>
);
};
render() {
return (
<div className="App">
<this.ClassPropComponent />
</div>
);
}
}
export default App;
这种模式有什么本质上的错误吗?
我相信这将为
ClassPropComponent
.App
不过,我想因为它是一个功能组件,所以不会有太多额外的开销(如果有的话)。就在 中使用钩子而言,是否有任何危险或陷阱
ClassPropComponent
?据我所知,它没有违反任何Hooks 规则。与仅返回一些 JSX 的类上的函数相比,这种模式有什么优势吗?似乎唯一的区别是它被用作组件而不是函数调用(例如
<this.ClassPropComponent />
vsthis.renderComponent()
)?
(下一部分部分离题,可能更适合另一个问题)
当我们有一个作为类属性的组件渲染另一个作为类属性的组件时,会发生另一个有趣的边缘情况。我们的代码库在 Typescript 中,如果我们使用ts-loader
then 通过 babel 运行结果,一切正常。如果我们使用@babel/preset-typescript
and @babel/preset-react
(使用 @babel/plugin-proposal-class-properties),this
在另一个类 prop 组件渲染的类 prop 组件中是未定义的。
解决方案
推荐阅读
- linux - inotifywait 不适用于 Visual Studio Code
- scala - scala pass a variable list of parameters and types to a function
- google-sheets - Google 表格上 =IMPORTXML 的正确路径
- python - 将 URL 作为命令行参数,我得到一个“socket.gaierror: [Errno 8] nodename nor servname provided, or not known”错误
- r - calculation average from a few month at the turn of the year for 3 diffrent indexs and for 30 years
- c# - Regular Expression to find a match and append symbol to result
- angularjs - Continuous data save & reload - best practice
- excel - 使用 VBA 操作 Range.Adress 值
- python - 在 Python 中按降序对 txt 文件进行排序
- postgresql - 如何使用内连接更新两个表中的多个字段