gpt4 book ai didi

javascript - 带有警告的 react useEffect Hook react-hooks/exhaustive-deps

转载 作者:行者123 更新时间:2023-12-04 15:39:16 26 4
gpt4 key购买 nike

我正在将使用 componentDidMount/Update/Unmount 生命周期的代码转换为 React Hooks,并不断在控制台中遇到 react-hooks/exhaustive-deps 作为警告.

我们的新代码似乎按预期工作,因此我的想法是关闭这些警告。但是,如果我遗漏了什么,下面代码中的警告是否有必要。

旧的 componentDidMount/Update/Unmount 代码

  state = {
container: canUseDOM ? createContainer(this.props.zIndex) : undefined,
portalIsMounted: false,
};

componentDidUpdate(prevProps: Props, prevState: State) {
const { container } = this.state;
const { zIndex } = this.props;
if (container && prevProps.zIndex !== zIndex) {
const newContainer = createContainer(zIndex);

getPortalParent().replaceChild(container, newContainer);
this.setState({ container: newContainer });
} else if (!prevState.container && container) {
getPortalParent().appendChild(container);
}
}

componentDidMount() {
const { container } = this.state;
const { zIndex } = this.props;
if (container) {
getPortalParent().appendChild(container);
} else {
const newContainer = createContainer(zIndex);
this.setState({ container: newContainer });
}
this.setState({
portalIsMounted: true,
});

firePortalEvent(PORTAL_MOUNT_EVENT, Number(zIndex));
}

componentWillUnmount() {
const { container } = this.state;
const { zIndex } = this.props;
if (container) {
getPortalParent().removeChild(container);
const portals = !!document.querySelector(
'body > .portal-container > .portal',
);
if (!portals) {
getBody().removeChild(getPortalParent());
}
}

firePortalEvent(PORTAL_UNMOUNT_EVENT, Number(zIndex));
}

新的 React Hooks 代码

const [container, setContainer] = useState(canUseDOM ? createContainer(zIndex) : undefined);
const [portalIsMounted, setPortalIsMounted] = useState(false);

useEffect(() => {
if (container) {
const newContainer = createContainer(zIndex);
getPortalParent().replaceWith(container, newContainer);
setContainer(newContainer);
}
}, [zIndex]);

useEffect(() => {
if (container) {
getPortalParent().appendChild(container);
}
}, [container]);

useEffect(() => {
if (container) {
getPortalParent().appendChild(container);
} else {
const newContainer = createContainer(zIndex);
setContainer(newContainer);
}
setPortalIsMounted(true);
firePortalEvent(PORTAL_MOUNT_EVENT, Number(zIndex));
}, []);

useEffect(() => {
if (container) {
getPortalParent().removeChild(container);
const portals = !!document.querySelector(
'body > .portal-container > .portal'
);
if (!portals) {
getBody().removeChild(getPortalParent());
}
}

firePortalEvent(PORTAL_UNMOUNT_EVENT, Number(zIndex));
}, []);

最佳答案

在这里,您在 useEffect 中使用了容器,但是由于您也在该效果中设置容器状态,因此您不能将其作为依赖项,否则您将陷入无限循环(效果将在每次调用 setContainer 时运行)。

我认为这可能是使用 //eslint-disable-line 的可接受时间

useEffect(() => {       
if (container) {
const newContainer = createContainer(zIndex);
getPortalParent().replaceWith(container, newContainer);
setContainer(newContainer);
}
// eslint-disable-line
}, [zIndex]);

可能还有其他示例,但您可以找出哪些 useEffects 需要哪些依赖项。

关于javascript - 带有警告的 react useEffect Hook react-hooks/exhaustive-deps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58549846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com