ESLint在反应项目上给了我这个错误。
ESLint - 组件应该写成纯函数(反应首选/无状态函数)
它指向组件的第一行。
export class myComponent extends React.Component {
render() {
return (
//stuff here
);
}
}
如何摆脱此错误?
答案 0 :(得分:38)
两种选择。
暂时停用警告
(未经测试;有多种方法可以做到这一点。)
p4 sync //depot/path/...
使用纯无状态组件
返回值是将要呈现的内容(例如,您基本上是在编写基于类的组件' // eslint-disable-next-line react/prefer-stateless-function
export class myComponent extends React.Component {
...
}
方法:
render
(或者,如果那是你的话,请使用非ES6表示法。)
对于这样没有其他支持逻辑的组件,我更喜欢隐式返回,例如,
export const myComponent = () => {
return (
// JSX here
)
}
这是一个偏好的问题。我会说你应该遵循React命名约定,并保持所有组件以大写字母开头。
ESLint可能会抱怨多行JSX表达式周围缺少parens,因此请禁用该规则或使用parens。
如果你需要道具,它们会作为函数的参数传入:
export MyComponent = () =>
<div>
// Stuff here
</div>
为方便起见,您可以像往常一样对参数进行解构:
const MyComponent = (props) =>
<div>
<Something someProp={props.foo} />
</div>
export MyComponent
如果您使用本地变量,这可以使隐式返回更容易一些。除非您声明,否则您将收到有关丢失const MyComponent = ({ foo }) =>
<div>
<Something someProp={foo} />
</div>
的ESLint警告;因为它不是一个类,你不能简单地在课堂上使用PropTypes
,它们必须附加到函数(许多人都喜欢)。
答案 1 :(得分:4)
将您的组件编写为无状态函数:
export myComponent = () => { //stuff here };
React中实际上有两种定义组件的样式:功能组件(它们只是从道具到React组件的函数)和类组件。
它们之间的主要区别在于,类组件可以具有state
和生命周期方法,例如componentDidMount
,componentDidUpdate
等。
每当您不需要生命周期状态方法时,您应该将组件编写为无状态函数,因为无状态组件通常更容易推理。
要编写功能组件,可以编写一个带有单个参数的函数。这个论点将获得组件的道具。因此,您不能使用this.props
来访问组件的道具 - 您只需使用该函数的参数。
答案 2 :(得分:3)
如果你依赖于props
,那么有一个更好的(有点可论证的,在撰写本文时)方法来解决这个错误而不写出无状态函数 - 写一个PureComponent并使用这个eslint规则 [source]:
"react/prefer-stateless-function": [2, { "ignorePureComponents": true }],
根据上述规则,以下代码段有效(因为它取决于props
)
class Foo extends React.PureComponent {
render() {
return <div>{this.props.foo}</div>;
}
}
React团队计划围绕SFC进行优化,但他们还没有。因此,在此情况发生之前,SFCs
将不会提供超过PureComponents
的任何好处。事实上,它们会稍微恶化,因为它们不会阻止浪费的渲染。
答案 3 :(得分:1)
如果您所做的只是呈现jsx模板,而不是使用constructor(props)
声明状态,那么您应该将您的组件编写为props的纯函数,而不是使用class
关键字来定义它。
离。
export const myComponent = () => (
// jsx goes here
);
答案 4 :(得分:1)
只有当您的类没有任何生命周期方法或构造函数时,才会出现此错误。 要解决此问题,您必须禁用lint属性或将其作为纯函数或为类创建构造函数。
答案 5 :(得分:1)
添加以下构造函数():
exports class myComponent extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
<div>Hello</div>
);
}
}
答案 6 :(得分:1)
export class myComponent extends PureComponent {
...
}
答案 7 :(得分:1)
你需要添加构造函数(props)
export class myComponent extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
//stuff here
);
}
}
答案 8 :(得分:0)
const myComponent = () => {
return (
//stuff here
);
};
export default myComponent;
在app.js文件中,只需导入此组件,就像我们为类
那样import myComponent from './myComponent.js'
并致电
<myComponent />
它肯定会起作用。