React.js URL-адрес маршрутизатора разрешается из браузера, но не из ссылки внутри приложения

#reactjs #routes

#reactjs #маршруты

Вопрос:

У меня есть настройка компонента в маршрутизаторе react, который имеет следующий URL

 http://localhost:3000/editing/5f0d7484706b6715447829a2
  

Компонент вызывается из родительского компонента с помощью

Ошибка относится к первой манипуляции, которую компонент выполняет с данными, что указывает мне, что приложение запущено до того, как данные будут доступны. Этого не происходит нигде в приложении.

 ×
TypeError: Cannot read property 'reduce' of undefined
  

Если я затем обновлю URL-адрес в браузере, он будет работать так, как задумано. Компонент также загружается нормально, если я просто вставляю указанный выше URL-адрес в браузер.

Код приведен ниже

 const Button = (props) => {
  //main props
  const { buttonFunction, buttonIconName, buttonStyle, visible } = props;


  return (
        <Link
        to='./editing/' props.documentId}
        </Link>

  );
};


export default Button;

  

Вызываемый компонент находится ниже

 mport React, { useContext, useEffect } from 'react';
import DocumentEditor from '../documentEditor/documentEditor';
import DocumentContext from '../../context/Document/DocumentContext';
import Spinner from '../layout/Spinner';



//For testing this Id works
// 5f0d7484706b6715447829a2

//Wrappers

const Editing = ({ match }) => {

  //styling
  const documentContext = useContext(DocumentContext);
  const { Documents, myFiltered, getDocuments, loading, getDocument } = documentContext;


  useEffect(() => {
    getDocument(match.params.documentid);
    // eslint-disable-next-line
  }, []);

  return (
    <div>
      {Documents !== null amp;amp; !loading ? (
        <DocumentEditor
          Document={Documents}
          DocumentContext={documentContext}
          documentMode='edit'
        />
      ) : (
        <Spinner />
      )}
    </div>
  );
};
export default Editing;
  

Мои мысли

Я подозреваю, что это может быть связано с загрузкой формы до получения данных, но я не вижу, как код

 {Documents !== null amp;amp; !loading ? (
  

наряду с моими функциями, которые извлекали данные, они работали нормально целую вечность, и использование async / await должно предотвратить это. Может быть, мне не следует использовать ссылку таким образом?

Комментарии:

1. ошибка связана reduce() с вызовом метода для undefined значения. Где код с reduce() вызовом метода?

2. Привет, ошибка reduce () является ошибкой, поскольку причина ошибки связана с отсутствием данных. (Я ввел функцию, указанную в вопросе)

3. Я ввел функцию, которая указана в вопросе — где эта функция? Я не вижу этого в вашем вопросе

Ответ №1:

Как говорит @Yousaf в комментариях, ваша конкретная ошибка связана с reduce() вызовом, и мы не видим этого в опубликованном вами коде.

Я вижу, что кажется опечаткой, и это может быть вашей проблемой.

В верхней части вашего файла вы импортируете DocumentContext с большой буквы «D»

 import DocumentContext from '../../context/Document/DocumentContext';
  

И внутри вашего Editing компонента вы разрушаете documentContext строчную букву «d»:

 const { Documents, myFiltered, getDocuments, loading, getDocument } = documentContext;
  

Это приведет ко { Documents, myFiltered, getDocuments, loading, getDocument } всему сущему undefined . Затем вы передаете Documents и documentContext в DocumentEditor , который, предположительно, пытается вызвать reduce() одну из тех вещей, которые передаются, которые есть undefined .

Комментарии:

1. извините за это. Я удалил строку с ошибкой, которая извлекла контекст » const DocumentContext = useContext (DocumentContext);» когда я очистил код для его отправки. Я вставил полный код в вопрос

2. Предназначен getDocument ли вызов из контекста для обновления Documents из контекста? Можем ли мы увидеть ваш контекстный код?