ESLint: в определении компонента отсутствует displayName (реакция/отображаемое имя)

Я использую компонент хука реакции с antd. При настройке столбцов для таблицы функция рендеринга выдает ошибку ESLint:

ESLint: Component definition is missing displayName (react/display-name)

Я пытался добавить displayName к объекту, но это не работает.

Вот как выглядит ошибка: ESLint: в определении компонента отсутствует 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)

вы смотрели на этот github.com/yannickcr/eslint-plugin-react/blob/master/docs/ru‌​les/…? Вы можете опубликовать код компонента?

duc mai 10.04.2019 22:22

@duc-mai Да, но я не вижу там решения моей проблемы. Я попытался добавить displayName к объекту, но это не решает проблему. Я вижу, что проблема вызвана методом рендеринга столбца antd, но я не могу понять, как это исправить.

Leo Farmer 10.04.2019 22:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
26
2
47 335
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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>».

Leo Farmer 10.04.2019 22:38

Просто установите функцию, определенную как значение клавиши render, в ее собственную переменную, и все должно быть хорошо.

Loïc Goyet 10.04.2019 22:40
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, } ]
Loïc Goyet 10.04.2019 22:41

Это помогло! Спасибо большое.

Leo Farmer 10.04.2019 22:46

Наткнулся на эту проблему github.com/yannickcr/eslint-плагин-реакция/проблемы/2404, если кто-то хочет отследить постоянное решение

lony 01.05.2020 08:51

Использование обычной функции для клавиши 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> } Первая версия — это анонимная функция, назначенная члену объекта. Вторая — это именованная функция, назначенная тому же члену.

Juan Lanus 22.01.2020 17:54

Использование анонимных функций и стрелочных функций будет продолжать появляться 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"
  }
}

Другие вопросы по теме