#node.js #reactjs #parameters #react-router
#node.js #reactjs #параметры #реагировать-маршрутизатор
Вопрос:
У меня проблема, когда, когда я начинаю с корня и щелкаю по ссылкам, все состояния загружаются нормально, но когда я копирую и вставляю URL-адрес в новое окно, он не отображается, правильно ли я предполагаю, что это потому, что предыдущий компонент не отображается для установки состояния?
Надеюсь, кто-нибудь может указать мне на несколько полезных статей или даже испытал это раньше?
Вот ссылка на запись экрана, которую я сделал, чтобы лучше показать, что я имею в виду https://youtu.be/M0390D4oJDg
код
import React from "react";
import { useLocation, useParams } from "react-router";
import PostBlock from "./PostBlock";
const PostList = () => {
const {thread} = useParams()
const { state: { description, title } = {} } = useLocation();
return (
<div>
<div className="m-10 flex justify-center">
<div style={{ width: "1216px" }}>
<div className="flex justify-center">
<div className="flex-1 justify-center mb-5 p-5 h-64 border border-gray-300">
<div>{title}</div>
<div>{description}</div>
</div>
</div>
<table className="min-w-full table-auto">
<thead className="justify-between">
<tr className="bg-gray-800">
<th className="px-8 py-2 text-left text-white">Posts</th>
</tr>
</thead>
<tbody className="bg-gray-200">
<PostBlock thread={thread}/>
</tbody>
</table>
</div>
</div>
</div>
);
};
export default PostList;
Ссылка
<Link to={{ pathname: `/thread/${thread}`, state: {title: title, description: description} }}>
URL
http://localhost:3000/thread/jxvgOKPrSiCnI2ocDxgJ
Ответ №1:
Этот реагирующий материал сложнее, чем я изначально думал
Не сдавайтесь легко. Это одна из прекрасных вещей!
Начните с необязательной цепочки.
const title = useLocation()?.state?.title;
const description = useLocation()?.state?.description;
Если это не поддерживается, используйте amp;amp;
:
const title = useLocation() amp;amp; useLocation().state amp;amp; useLocation().state.title;
const description = useLocation() amp;amp; useLocation().state amp;amp; useLocation().state.description;
И только тогда, когда title
и description
нет null
, визуализируйте свое содержимое.
const PostList = () => {
const { thread } = useParams();
const title = useLocation() amp;amp; useLocation().state amp;amp; useLocation().state.title;
const description = useLocation() amp;amp; useLocation().state amp;amp; useLocation().state.description;
return title amp;amp; description ? <div></div> : null;
};
Теперь код не будет отображать содержимое до тех пор, пока не будут установлены оба значения. И это гарантирует, что ваш код загружается без каких-либо ошибок.
Комментарии:
1. Спасибо за ваш ответ и мотивацию, я проверю это!
2. У Антонио, другого комментатора, было чистое решение, чтобы предотвратить сбой, но я все еще не понимаю, в каком состоянии я сделал небольшую запись youtu.be/M0390D4oJDg чтобы, может быть, лучше объяснить мою проблему
3. @Erykj97 Понял. Можете ли вы отправить мне код, скажем, CodeSandbox.io ? Я готов проверить это досконально.
4. Большое вам спасибо, codesandbox.io/s/reverent-sea-z9wdb?file=/src/App.js извините за недостающий стиль
5. @Erykj97 сейчас проверяю.
Ответ №2:
Я немного смущен тем, в чем на самом деле заключается ваш вопрос, но у вас есть некоторые проблемы с вашим кодом. Попробуйте это:
const PostList = () => {
const { thread } = useParams();
const { state: { description, title } = {} } = useLocation();
return <div></div>;
};
Нет никаких причин для useLocation()
повторной инициализации. Вы могли бы также инициализировать его в одну константу, а затем получить доступ к описанию и состоянию через него.
const PostList = () => {
const { thread } = useParams();
const location = useLocation();
console.log(location.state.title, location.state.description);
return <div></div>;
};
Кроме того, вы можете включить object?.property
метод в качестве отказоустойчивого, если ваше состояние пустое:
console.log(location?.state?.title);
Взгляните на правильное useLocation
использование здесь
Комментарии:
1. Спасибо, за советы, я изменил способ инициализации useLocation на тот, который вы показали, теперь я больше не получаю сообщение об ошибке, но состояние по-прежнему не отображается, я только что сделал быструю запись экрана, что я имею в виду, потому что мне трудно объяснить словами => youtu.be/M0390D4oJDg