[英]Avoid infinite loop with useEffect hook
每次使用表单添加新项目时,我都试图显示更新的项目列表。 使用 useEffect 钩子,我不断陷入使页面崩溃的无限循环中。 我不确定如何添加某种验证,仅在添加新项目时才要求重新渲染我的组件。
@app.route('/assets')
def get_assets():
print('this is a test')
cursor = assets.find()
list_cur = list(cursor)
assets = dumps(list_cur)
return assets
function Assets() {
const [currentAsset, setCurrentAsset] = useState(0);
useEffect(() => {
(async () => {
const result = await fetch('/assets')
const data = await result.json()
setCurrentAsset(data)
})()
}, [currentAsset]);
return (
<div>
<header>
<table className="table table-striped">
<thead>
<tr>
<th>Ip Address</th>
<th>Asset Type</th>
<th>Username</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
{Object.values(currentAsset).map((item, index) => (
<tr key={item._id? item._id.$oid: null}>
<td>{item.ip_address}</td>
<td>{item.asset_type}</td>
<td>{item.username}</td>
<td>{item.notes}</td>
</tr>
)
)}
</tbody>
</table>
</header>
</div>
);
}
export default Assets;
注意:每次添加新项目时,我想呈现更新数据而无需重新加载页面。 我试图实现与此演示相同的结果: https : //taniarascia.github.io/react-hooks/是否有仅使用 Hooks 的方法?
在“useEffect”内部,它将更新状态“currentAsset”。 然后它会触发组件再次重新渲染。 结果,“useEffect()”将再次运行并更新状态。 接下来,整个过程再次重复,你被困在一个无限循环中。
useEffect(() => {
(async () => {
const result = await fetch('/assets')
const data = await result.json()
setCurrentAsset(data)
})()
}, []);
您不能更新state variable
,在依赖关系为useEffect
里面,你可以让多个useEffects
你应该找回它首先在空useEffect
然后再拍一次听上currentAsset
变化
useEffect(() => {
/// this will work as componentDidMount
// will be called only once at the first after rendering the component
(async () => {
const result = await fetch('/assets')
const data = await result.json()
setCurrentAsset(data)
})()
}, []);
useEffect(() => {
// listen on the change of the currentAsset here but DONOT update it here
}, [currentAsset]);
通常,查询会使项目发生变化,我们应该监听查询的变化,并更新项目。 只需添加一个查询状态即可使逻辑清晰。
function Assets() {
const [currentAsset, setCurrentAsset] = useState({});
const [query, setQuery] = useState('');
useEffect(() => {
(async () => {
const result = await fetch('/assets?query=' + query)
const data = await result.json()
setCurrentAsset(data)
})()
}, [query]);
return (
<div>
<header>
<table className="table table-striped">
<thead>
<tr>
<th>Ip Address</th>
<th>Asset Type</th>
<th>Username</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
{Object.values(currentAsset).map((item, index) => (
<tr key={item._id? item._id.$oid: null}>
<td>{item.ip_address}</td>
<td>{item.asset_type}</td>
<td>{item.username}</td>
<td>{item.notes}</td>
</tr>
)
)}
</tbody>
</table>
</header>
</div>
);
}
export default Assets;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.