Я использую компонент хука реакции с antd. При настройке столбцов для таблицы функция рендеринга выдает ошибку ESLint:
ESLint: Component definition is missing displayName (react/display-name)
Я пытался добавить displayName к объекту, но это не работает.
Это код:
const columns_payment_summary_table = [
{
title: FooConstants.LABEL_QUANTITY_SELECTED,
dataIndex: 'group',
key: 'group',
render: text => (
<span>{getCountForCountry(text)}</span>
),
}
]
Кто-нибудь может помочь?
Вот полный код компонента (ну только соответствующие биты)
import * as FooConstants from './constants'
import {connect} from 'react-redux'
import React, {useState, useEffect} from 'react'
import {Card, Table} from 'antd'
import PropTypes from 'prop-types'
const propTypes = {
foos: PropTypes.object.isRequired,
}
function Foos(props) {
const [selectedFooRows, setSelectedFooRows] = useState([])
useEffect(() => {
getFooDetails()
}, [])
function getFooDetails() {
props.dispatch({
type: FooConstants.GET_FOO_PAYMENT_SUMMARIES,
params: {
'group_by': 'country_code',
'type': FooConstants.CLAIM_FOO,
}
})
props.dispatch({
type: FooConstants.GET_FOO_PAYMENTS,
params: {'type': FooConstants.CLAIM_FOO, }
})
}
const columns_payment_summary_table = [
{
title: FooConstants.LABEL_QUANTITY_SELECTED,
dataIndex: 'group',
key: 'group',
render: text => (
<span>{getCountForCountry(text)}</span>
),
}
]
function getCountForCountry(country_code){
let selected_country = selectedFooRows.filter(function(row){
return row.group === country_code
})
if (selected_country && selected_country.length > 0){
return selected_country[0].ids.length
} else {
return 0
}
}
return (
<div>
<Card
title = {FooConstants.LABEL_FOO_SUMMARY}>
<Table
columns = {columns_payment_summary_table}
bordered = {true}
dataSource = {props.foos.foo_payment_summaries}
loading = {props.foos.foo_payment_summaries_pending && !props.foos.foo_payment_summaries}
rowKey = {record => record.group}
/>
</Card>
</div>
)
}
Foos.propTypes = propTypes
const mapStateToProps = (state) => {
return {foos: state.foosReducer}
}
export default connect(
mapStateToProps,
)(Foos)
@duc-mai Да, но я не вижу там решения моей проблемы. Я попытался добавить displayName к объекту, но это не решает проблему. Я вижу, что проблема вызвана методом рендеринга столбца antd, но я не могу понять, как это исправить.
ESLint считает, что вы определяете новый компонент, не присваивая ему никакого имени.
Это объясняется тем, что ESLint не может распознать визуализировать шаблон опоры, потому что вы не записываете эту поддержку рендеринга напрямую в компонент, а в объект.
Вы можете либо поместить render
prop непосредственно в свою jsx-реализацию компонента <Column>
, либо отключить ошибку ESLint, выполнив следующие действия:
const columns_payment_summary_table = [
{
title: SettlementConstants.LABEL_QUANTITY_SELECTED,
dataIndex: 'group',
key: 'group',
// eslint-disable-next-line react/display-name
render: text => (
<span>{getCountForCountry(text)}</span>
),
}
]
Надеюсь помог ;)
Я уже знаю, как отключить ошибки eslint ;-) Пожалуйста, не могли бы вы расширить часть вашего ответа «Вы можете поместить поддержку рендеринга непосредственно в свою реализацию jsx компонента <Column>».
Просто установите функцию, определенную как значение клавиши render
, в ее собственную переменную, и все должно быть хорошо.
js const columns_payment_summary_table_render = text => ( <span>{getCountForCountry(text)}</span> ) const columns_payment_summary_table = [ { title: SettlementConstants.LABEL_QUANTITY_SELECTED, dataIndex: 'group', key: 'group', // eslint-disable-next-line react/display-name render: columns_payment_summary_table_render, } ]
Это помогло! Спасибо большое.
Наткнулся на эту проблему github.com/yannickcr/eslint-плагин-реакция/проблемы/2404, если кто-то хочет отследить постоянное решение
Использование обычной функции для клавиши render
также удалит предупреждение ESLint без необходимости его отключения.
const columns_payment_summary_table = [
{
title: SettlementConstants.LABEL_QUANTITY_SELECTED,
dataIndex: 'group',
key: 'group',
render: function countForCountry(text) {
return <span>{getCountForCountry(text)}</span>
},
}
]
Я попробовал это в другом контексте, где мой код является методом класса, отличного от React (не расширяет компонент). Сначала я написал renderX = ( x ) => <p>{ x }</p>
и получил ошибку. Увидев это, я добавил отсутствующее имя renderX = function renderX( x ){ <p>{ x }</p> }
Первая версия — это анонимная функция, назначенная члену объекта. Вторая — это именованная функция, назначенная тому же члену.
Использование анонимных функций и стрелочных функций будет продолжать появляться ESLint: Component definition is missing displayName (react/display-name)
, я думаю, это потому, что когда мы визуализируем компонент через функцию, мы даем им отображаемое имя, также называя функцию рендеринга.
Но использования обычной функции недостаточно, вы все равно можете встретить следующее предупреждение:
Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.
Вы должны выполнить обычную функцию сразу после ее рендеринга. Я передал два правила, используя следующий код.
render: () => {
return (function Actions() {
return (
<Button>
View
</Button>
);
})();
},
Это подробно описано в эта проблема ESLint.
Как и Лоикпредложенный, подавление ошибки lint является здесь самым простым вариантом.
Однако ошибка lint существует по причине — displayName
может быть полезно для отладки, особенно в представлении компонентов React DevTools. Самый простой способ присвоить вашей функции displayName
— использовать объявление именованной функции и поднять определение:
function renderTable(text) {
return (<span>{getCountForCountry(text)}</span>);
}
const columns_payment_summary_table = [
{
title: SettlementConstants.LABEL_QUANTITY_SELECTED,
dataIndex: 'group',
key: 'group',
render: text => (
<span>{getCountForCountry(text)}</span>
),
}
]
Однако это, очевидно, более многословно, и если вы не предполагаете, что вам нужно будет искать отображаемый компонент по имени в DevTools, проще всего просто подавить ошибку.
Иногда мы можем обойти правила, если у нас есть ошибка только в одном или двух местах. Что, если у нас есть один и тот же вариант использования в нескольких местах. Каждый раз приходится отключать правила.
Вместо этого мы можем обойти эту ошибку, назначив функцию свойству рендеринга.
const getMyHTML = (text) => <span>{getCountForCountry(text)}</span>
const columns_payment_summary_table = [
{
title: SettlementConstants.LABEL_QUANTITY_SELECTED,
dataIndex: 'group',
key: 'group',
render: getMyHTML,
}
]
Если кому-то нужно избежать этого во всех файлах, добавьте ниже в раздел правил файла .eslintrc.js
,
{
...
"rules": {
"react/display-name": "off"
}
}
вы смотрели на этот github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/…? Вы можете опубликовать код компонента?