Перенаправление ссылки в функциональном компоненте с помощью react-redux (версия 6.0.1)

#reactjs #react-redux

#reactjs #react-redux

Вопрос:

Я пытаюсь использовать forwardRef в своем функциональном компоненте, который также использует react-redux . Мой компонент выглядит следующим образом:

 const InfiniteTable = ({
  columns,
  url,
  data,
  stateKey,
  loading,
  loadMore,
  fetchData,
  customRecordParams,
  ...rest
}, ref) => {
  const [start, setStart] = useState(0);
  const tableRef = React.createRef();

  console.log(rest);

  let dataSource = data;
  if (customRecordParams) dataSource = _.map(dataSource, customRecordParams);
  if (dataSource.length > FETCH_LIMIT)
    dataSource = _.slice(dataSource, 0, start   FETCH_LIMIT);

  useEffect(() => setupScroll(setStart, tableRef), []);
  useEffect(() => {
    if (loadMore) fetchData(url, stateKey, { start });
  }, [start, loadMore]);

  useImperativeHandle(ref, () => ({
    handleSearch: term => console.log(term),
    handleReset: () => console.log("reset")
  }));

  return (
    <Table
      columns={columns}
      dataSource={dataSource}
      pagination={false}
      showHeader
      loading={loading}
    />
  );
}; 

const mapStateToProps = (state, ownProps) => ({
  data: Object.values(state[ownProps.stateKey].data),
  loading: state[ownProps.stateKey].isFetching,
  loadMore: state[ownProps.stateKey].loadMore
});

export default connect(
  mapStateToProps,
  { fetchData },
  null,
  { forwardRef: true }
)(InfiniteTable);
  

Однако я получаю эту ошибку при попытке использовать мой компонент с ссылкой prop:

Предупреждение: Функциональным компонентам нельзя указывать ссылки. Попытки получить доступ к этой ссылке завершатся неудачей. Вы имели в виду использовать React.forwardRef()?

Что я делаю не так?

Ответ №1:

InfiniteTable подпись неверна, это устаревшее context , которое принимается в качестве второго параметра в функциональных компонентах, а не ref . Чтобы получить объект ref для его использования useImperativeHandle , компонент должен быть обернут React.forwardRef .

Как указано в ссылке,

useImperativeHandle настраивает значение экземпляра, которое предоставляется родительским компонентам при использовании ссылки. Как всегда, в большинстве случаев следует избегать императивного кода, использующего ссылки. useImperativeHandle следует использовать с forwardRef

Это должно быть:

 const InfiniteTable = forwardRef((props, ref) => { ... });

export default connect(
  mapStateToProps,
  { fetchData },
  null,
  { forwardRef: true }
)(InfiniteTable);