我正在使用react-router
5.1和react
16.10。
对于主从页面,我正在使用useParams()
从URL获取ID以打开当前组的页面。打开发生在useEffect()
中。结果,必须id
作为依赖项来提供这种效果。但是,在创建新组时,如果有足够的数据使该组有效,则API发送该组的id
并将URL设置为/group/:id
。结果,效果再次运行。
function Groups(props) {
const { id } = useParams();
const history = useHistory();
const [group, setGroup] = useState(NEW_GROUP);
const getData = useCallback(async () => {
await Promise.resolve(Api.getGroups());
}, []);
const getGroup = useCallback(async group => {
history.push(`/groups/${group.id}`);
await Promise.resolve(Api.getGroup(group)).then(data => {
setGroup(data.group);
});
}, [getData, history]);
useEffect(() => {
getData();
if (id !== undefined) {
getGroup({ id });
}
}, [props.actions, id, getData, getGroup]);
// Saving data
const saveGroup = useCallback(async () => {
setSaved(SAVING);
await Promise.resolve(Api.storeGroup(group)).then(data => {
if (!group.hasOwnProperty('id')) {
history.push(`/groups/${data.id}`);
setGroup(prevGroup => ({ ...prevGroup, id: data.id }));
}
getData();
setSaved(SAVED);
}).catch(() => setSaved(FAILED));
}, [getData, group, history]);
}
如何在不破坏“钩子规则”的情况下防止这种情况发生?
答案 0 :(得分:5)
我遇到了同样的问题,我解决的方法是将id从useParams传递给函数,并仅在useEffect中设置id。
function Groups(props) {
const { id } = useParams();
...
useEffect(() => {
getData(id);
if (id !== undefined) {
getGroup({ id });
}
}, [id]);
...
}