Ошибка типа React js: не удается прочитать свойство ‘id’ неопределенного

#javascript #json #reactjs #ecmascript-6 #frontend

#javascript #json #reactjs #ecmascript-6 #интерфейс

Вопрос:

Я разрабатываю сайт, на котором на экране будут отображаться сообщения пользователей с их электронной почтой, при нажатии кнопки он перейдет к деталям этого конкретного сообщения. Я могу изменить маршрут, но он не дает мне подробностей. Скорее, это говорит о том, что переменная уменьшена в PostDetails.js имя ‘id’ не определено.

App.js код

`

 //app.js code
import React from 'react';
import './App.css';
import {
  BrowserRouter as Router,
  Switch,
  Route,
  Link
} from "react-router-dom";
import AllPosts from './Components/AllPosts/AllPosts';
import NoMatch from './Components/NoMatch/NoMatch';
import PostDetails from './Components/PostDetails/PostDetails';

function App() {
  return (
    <Router>
      <Switch>
        <Route exact path='/'>
          <AllPosts></AllPosts>
        </Route>
        <Route to='/PostDetails/:id'>
            <PostDetails></PostDetails>
        </Route>
        <Route path='*'>
            <NoMatch></NoMatch>
        </Route>
      </Switch>
    </Router>
     
  )
}

export default App;

//ShowPost.js code  

`

ShowPost.js код

`

 //ShowPost.js code

 import React from 'react';
import { Link } from 'react-router-dom';

const ShowPost = (props) => {
const {title, id} = props.post;
return (
    <div>
        <h1>{title}</h1>
        <p>{id}</p>
        <button><Link to={`/PostDetails/${id}`}>Click</Link></button>
    </div>
);
};

export default ShowPost;  

 //PostDetails.js code

import React, { useState, useEffect } from 'react';
import { useParams } from 'react-router-dom';

const PostDetails = () => {
    let {id} = useParams();
    const {singlePost,setSinglePost} = useState();
    useEffect(()=>{
        fetch(`https://jsonplaceholder.typicode.com/posts/${id}`)
        .then(res => res.json())
        .then(data => setSinglePost(data))
    },[])
    return (
        <div>
            <h1>This is details {singlePost.id} </h1>
        </div>
    );
};

export default PostDetails;  

Ответ №1:

Попробуйте передать пустое значение по умолчанию для singlePost и убедитесь, что вы можете консольно регистрировать возвращаемые данные из fetch

 const {singlePost,setSinglePost} = useState('');
  

Ответ №2:

Вам нужно установить начальное состояние на то, которое вы хотите, чтобы ваше сообщение отображалось по умолчанию, например

 const {singlePost,setSinglePost} = useState({title: "Loading", id: "Loading"});
  

Если вы не хотите показывать сообщение во время выборки сообщения, вы можете выполнить условный рендеринг компонента. Затем вы можете использовать свой текущий способ настройки состояния: const {singlePost,setSinglePost} = useState(); и отобразить сообщение условно:

 return (
    <div>
        {singlePost ? <h1>This is details {singlePost.id} </h1> : null}
    </div>
);
  

Это скроет сообщение до тех пор, пока оно не будет извлечено.

На ваш первоначальный вопрос: singlePost будет undefined , и попытка получить доступ к свойству id приведет к ошибке. Это связано с тем, что выборка выполняется асинхронно и не устанавливает состояние немедленно.

Ответ №3:

В обоих приведенных выше ответах не упоминается самое важное — useState hook не возвращает объект, вы не можете использовать деструктурирование объекта, поскольку useState возвращает array . Вместо этого вам придется использовать разрушение массива.

неверно:

 const { singlePost, setSinglePost } = useState('');
  

исправить:

 const [singlePost, setSinglePost] = useState('');