如何修复状态变量内容不显示
How to fix state variable contents not displaying
我正在构建一个小型应用程序。目前我一直在尝试显示后端给出的响应。
我一直在使用 this guide 来实现数据获取挂钩,除了尝试在列表中显示返回的条目外,一切正常。
组件中的代码如下所示:
import React, { Fragment, useState, useEffect } from "react";
import axios from 'axios';
function Search() {
const [zone, setZone] = useState('');
const [results, setResults] = useState({entries: []});
const [url, setUrl] = useState(
`http://localhost:4000/entries/view/`
);
useEffect(() => {
const fetchEntries = async () => {
const result = await axios.get(url);
setResults({entries: result.entries});
};
fetchEntries();
}, [url]);
return (
<Fragment>
<input type="text" value={zone} onChange={e => setZone(e.target.value)} />
<button type="btn-primary" onClick={() =>
setUrl(`http://localhost:4000/entries/view/${zone}`)
}>
Search
</button>
<ul>
{results.entries.map(item => (
<li key={item._id}>
<div>{item.entry_description}</div>
</li>
))}
</ul>
</Fragment>
);
}
export default Search;
下面是 API 响应的示例:
{
"entries": [
{
"_id": "5d365d9af8b0625f345a8cea",
"entry_description": "Test ui",
"entry_time": "Now",
"entry_author": "Me",
"entry_zone": "12345",
"__v": 0
},
{
"_id": "5d367e3bbd8b13188c0d638b",
"entry_description": "Test still?",
"entry_time": "Now",
"entry_author": "Me",
"entry_zone": "12345",
"__v": 0
}
]
}
我收到的当前错误消息是:
The above error occurred in the <Search> component:
in Search (created by Context.Consumer)
in Route (at App.js:21)
in div (at App.js:14)
in Router (created by BrowserRouter)
in BrowserRouter (at App.js:13)
in App (at src/index.js:7)
Consider adding an error boundary to your tree to customize error handling behavior.
TypeError: results.entries is undefined
home.component.js:30
TypeError: results.entries is undefined
home.component.js:30
非常感谢您帮助我找出造成这种情况的原因。
您似乎将 api 结果包装在一个数组中,而您只需要将其分配给 enteries
useEffect(() => {
const fetchEntries = async () => {
const result = await axios.get(url);
setResults({entries: result.entries});
};
fetchEntries();
}, [url]);
所以我现在已经可以使用了,虽然我不太明白。我使用 this code 并更改了一些名称以使用我的变量名称。我认为修复与此代码中的 useEffect() 依赖关系有关,包括查询变量。在我的原始代码中,我将它们组合成一个 url,然后在依赖项中也没有包含区域变量。
这是我的最终代码:
import React, { useState, useEffect } from "react";
import axios from 'axios';
function Search() {
const [data, setData] = useState({ entries: [] });
const [query, setQuery] = useState('Enter zone');
useEffect(() => {
let ignore = false;
async function fetchData() {
const result = await axios('http://localhost:4000/entries/view/' + query);
if (!ignore) setData(result.data);
}
fetchData();
return () => { ignore = true; }
}, [query]);
return (
<>
<input value={query} onChange={e => setQuery(e.target.value)} />
<ul>
{data.entries.map(item => (
<li key={item._id}>
<p>{item.entry_description}</p>
</li>
))}
</ul>
</>
);
}
export default Search;
我正在构建一个小型应用程序。目前我一直在尝试显示后端给出的响应。
我一直在使用 this guide 来实现数据获取挂钩,除了尝试在列表中显示返回的条目外,一切正常。
组件中的代码如下所示:
import React, { Fragment, useState, useEffect } from "react";
import axios from 'axios';
function Search() {
const [zone, setZone] = useState('');
const [results, setResults] = useState({entries: []});
const [url, setUrl] = useState(
`http://localhost:4000/entries/view/`
);
useEffect(() => {
const fetchEntries = async () => {
const result = await axios.get(url);
setResults({entries: result.entries});
};
fetchEntries();
}, [url]);
return (
<Fragment>
<input type="text" value={zone} onChange={e => setZone(e.target.value)} />
<button type="btn-primary" onClick={() =>
setUrl(`http://localhost:4000/entries/view/${zone}`)
}>
Search
</button>
<ul>
{results.entries.map(item => (
<li key={item._id}>
<div>{item.entry_description}</div>
</li>
))}
</ul>
</Fragment>
);
}
export default Search;
下面是 API 响应的示例:
{
"entries": [
{
"_id": "5d365d9af8b0625f345a8cea",
"entry_description": "Test ui",
"entry_time": "Now",
"entry_author": "Me",
"entry_zone": "12345",
"__v": 0
},
{
"_id": "5d367e3bbd8b13188c0d638b",
"entry_description": "Test still?",
"entry_time": "Now",
"entry_author": "Me",
"entry_zone": "12345",
"__v": 0
}
]
}
我收到的当前错误消息是:
The above error occurred in the <Search> component:
in Search (created by Context.Consumer)
in Route (at App.js:21)
in div (at App.js:14)
in Router (created by BrowserRouter)
in BrowserRouter (at App.js:13)
in App (at src/index.js:7)
Consider adding an error boundary to your tree to customize error handling behavior.
TypeError: results.entries is undefined
home.component.js:30
TypeError: results.entries is undefined
home.component.js:30
非常感谢您帮助我找出造成这种情况的原因。
您似乎将 api 结果包装在一个数组中,而您只需要将其分配给 enteries
useEffect(() => {
const fetchEntries = async () => {
const result = await axios.get(url);
setResults({entries: result.entries});
};
fetchEntries();
}, [url]);
所以我现在已经可以使用了,虽然我不太明白。我使用 this code 并更改了一些名称以使用我的变量名称。我认为修复与此代码中的 useEffect() 依赖关系有关,包括查询变量。在我的原始代码中,我将它们组合成一个 url,然后在依赖项中也没有包含区域变量。
这是我的最终代码:
import React, { useState, useEffect } from "react";
import axios from 'axios';
function Search() {
const [data, setData] = useState({ entries: [] });
const [query, setQuery] = useState('Enter zone');
useEffect(() => {
let ignore = false;
async function fetchData() {
const result = await axios('http://localhost:4000/entries/view/' + query);
if (!ignore) setData(result.data);
}
fetchData();
return () => { ignore = true; }
}, [query]);
return (
<>
<input value={query} onChange={e => setQuery(e.target.value)} />
<ul>
{data.entries.map(item => (
<li key={item._id}>
<p>{item.entry_description}</p>
</li>
))}
</ul>
</>
);
}
export default Search;