useLocation 无法识别处于状态的 JSON 对象
useLocation doesn't recognize JSON object in state
我一直在尝试使用 react-router-dom 中的 useNavigate() 和 useLocation() 将 JSON 对象从一个组件传递到另一个组件。
按照 , and this,我尝试了各种方法来做到这一点。问题是,我在单击按钮后触发的异步函数中调用 navigate(),因此我无法使用我想象的 Link 组件。
它的工作原理是单击提交按钮后,它会触发 API 调用。理想情况下,一旦收到 JSON 对象,就会调用 navigate() ,将 JSON 对象传递给下一个组件。但是,我一直收到“null”或空对象。
请检查此 link 了解我的意思。
Screenshot of console log output of result when accessed from useLocation
App.JS 路线:
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/start/:id" element={<Start/>} />
<Route path="/quiz/:id" element={<Quiz/>} />
<Route path="/results" element={<Results />} />
</Routes>
</BrowserRouter>
从 'quiz' 导航到“/results”,将结果(JSON 对象)传递给:
import { useLocation } from "react-router-dom";
...
const toResults=()=>{
console.log(results); // *Properly displays JSON object in console)*
navigate('/results', {state: results});
}
从“/results”访问JSON(不工作):
import { useLocation } from "react-router-dom";
...
const { state } = useLocation();
useEffect(() => {
console.log("Results from results page: ");
console.log(state);
}, [])
API 在调用 toResults() 的地方调用:
async function submitQuiz(event){
event.preventDefault();
console.log(id);
console.log(answer);
//Post request passes question ID and student answer to server.
const response = await fetch('http://localhost:3001/api/quiz', {
method: 'POST',
headers:{
'Content-Type': 'application/json' ,
'Accept': 'application/json'
},
body: JSON.stringify({
id,
answer
})
} ) .then(response => response.json())
.then(data => {
console.log(data);
setResults(data);
toResults();
});
}
如果有任何关于如何从 useLocation 正确访问数据的指导,或者是否有更有效的方法来完成此操作,我将不胜感激。
谢谢!
问题
这里的问题是 results
是您的 React 状态,并且不会立即处理排队的 React 状态更新。
.then(data => {
console.log(data);
setResults(data); // <-- enqueued state update
toResults(); // <-- uses current `results` state
});
...
const toResults=()=>{
console.log(results); // <-- not updated state yet
navigate('/results', {state: results});
}
解决方案
您很可能根本不需要 result
状态。由于您正在离开此组件,因此状态无论如何都会被垃圾收集。只需使用响应数据发出命令式导航请求。
示例:
async function submitQuiz(event){
event.preventDefault();
console.log(id);
console.log(answer);
//Post request passes question ID and student answer to server.
const response = await fetch(
'http://localhost:3001/api/quiz',
{
method: 'POST',
headers: {
'Content-Type': 'application/json' ,
'Accept': 'application/json'
},
body: JSON.stringify({
id,
answer
})
})
.then(response => response.json())
.then(data => {
console.log(data);
navigate('/results', { state: data }); // <-- navigate with result here
});
}
我一直在尝试使用 react-router-dom 中的 useNavigate() 和 useLocation() 将 JSON 对象从一个组件传递到另一个组件。
按照
它的工作原理是单击提交按钮后,它会触发 API 调用。理想情况下,一旦收到 JSON 对象,就会调用 navigate() ,将 JSON 对象传递给下一个组件。但是,我一直收到“null”或空对象。
请检查此 link 了解我的意思。
Screenshot of console log output of result when accessed from useLocation
App.JS 路线:
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/start/:id" element={<Start/>} />
<Route path="/quiz/:id" element={<Quiz/>} />
<Route path="/results" element={<Results />} />
</Routes>
</BrowserRouter>
从 'quiz' 导航到“/results”,将结果(JSON 对象)传递给:
import { useLocation } from "react-router-dom";
...
const toResults=()=>{
console.log(results); // *Properly displays JSON object in console)*
navigate('/results', {state: results});
}
从“/results”访问JSON(不工作):
import { useLocation } from "react-router-dom";
...
const { state } = useLocation();
useEffect(() => {
console.log("Results from results page: ");
console.log(state);
}, [])
API 在调用 toResults() 的地方调用:
async function submitQuiz(event){
event.preventDefault();
console.log(id);
console.log(answer);
//Post request passes question ID and student answer to server.
const response = await fetch('http://localhost:3001/api/quiz', {
method: 'POST',
headers:{
'Content-Type': 'application/json' ,
'Accept': 'application/json'
},
body: JSON.stringify({
id,
answer
})
} ) .then(response => response.json())
.then(data => {
console.log(data);
setResults(data);
toResults();
});
}
如果有任何关于如何从 useLocation 正确访问数据的指导,或者是否有更有效的方法来完成此操作,我将不胜感激。
谢谢!
问题
这里的问题是 results
是您的 React 状态,并且不会立即处理排队的 React 状态更新。
.then(data => {
console.log(data);
setResults(data); // <-- enqueued state update
toResults(); // <-- uses current `results` state
});
...
const toResults=()=>{
console.log(results); // <-- not updated state yet
navigate('/results', {state: results});
}
解决方案
您很可能根本不需要 result
状态。由于您正在离开此组件,因此状态无论如何都会被垃圾收集。只需使用响应数据发出命令式导航请求。
示例:
async function submitQuiz(event){
event.preventDefault();
console.log(id);
console.log(answer);
//Post request passes question ID and student answer to server.
const response = await fetch(
'http://localhost:3001/api/quiz',
{
method: 'POST',
headers: {
'Content-Type': 'application/json' ,
'Accept': 'application/json'
},
body: JSON.stringify({
id,
answer
})
})
.then(response => response.json())
.then(data => {
console.log(data);
navigate('/results', { state: data }); // <-- navigate with result here
});
}