react/display-name
开发时,有时会遇到 ESLint: Component definition is missing display name (react/display-name),这个原因是什么及如何处理呢,这里讨论下。
react/display-name
组件添加display-name唯一的好处是服务于调试,如下图,在react拓展程序调试时会方便我们找到对应的组件,从而再找到文件。
但日常开发,很多时候我们没有明确写display-name,那这些名字如何来的,因为react会帮我们赋值,一般组件创建有两种方式
- 函数,函数名称即display-name
- 类,类名称即display-name
但有时也会出现没有displayname,比如我们使用匿名函数创建组件,或者react.createElement,都会出现displayname缺失,这样在实际开发调试时,对于快速找到渲染组件逻辑就会是个负担,因此从最佳实践的角度出发,__建议都需要有react/display-name__,比如函数组件,明确函数名称。
自定义display-name
如上react会使用函数/类名称作为display-name,但是我们也可以再次修改这个名称方法即componentName.displayName = 'xxxxx'
类/函数均如此。
注意,react调试组件中看到的名称并非我们标签形式使用组件时的名称,比如即使我们在import时使用as进行别名化,其实并不会work。
举个例子,以下类组件,进行displayname修改,在调试时发现修改成功。
1 | export class CardToc extends React.PureComponent { |
eslint-react/display-name
ESLint下该规则建议打开,且设置error级。
我司实践如上。
1 | "react/display-name": ["error"] |
antd等组件库下的table column render
如上所说,很多时候并不会遇到这个问题,在table列自定义渲染时经常会报错。首先这并非antd的锅,比如腾讯tea的表单组件在使用中也会存在这个问题,真正的原因是检测会将其看成函数组件,但实际上这里只是个函数,只是返回结果是reactNode,解决办法如下。
- 如果只是简单的渲染,比如超链接等,直接行级别
// eslint-disable-next-line react/display-name
- 如果是较为复杂的渲染,建立抽离为函数,这样lint会识别正确,不会报错,同时也实现代码可读性提高-render函数提取。
写在最后
Mark.
相关文档
- https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/display-name.md
- https://github.com/ant-desigen/ant-design/issues/26111
- https://github.com/yannickcr/eslint-plugin-react/issues/2313
- https://stackoverflow.com/questions/43356073/how-to-set-displayname-in-a-functional-component-react