首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >React :超过最大更新深度

React :超过最大更新深度
EN

Stack Overflow用户
提问于 2021-04-17 18:49:04
回答 2查看 78关注 0票数 0

还有我的react项目,现在我正在学习钩子,也许我有一个关于‘无限循环’的问题(超过了最大更新深度),我不知道如何处理这个问题。我有redux来处理状态。我使用useEffect,因为当我点击一个div时,它正在显示,或者正在做我想做的事情,总是晚一步

代码语言:javascript
运行
复制
function OffersWhatTypeOfWebsiteComponent(props) {

    const dispatch = useDispatch()

    const [active, setActive] = useState(1)
    const [typeWebSite, setTypeWebSite] = useState('withCMS')

    const updateTypeWebSite = () => {
        dispatch({
            type: "TYPE_WEBSITE",
            payload: typeWebSite
        })
    }

    useEffect(() => {
        updateTypeWebSite();
      }, [updateTypeWebSite()]);

    const renderElements = (props) => {
        switch (active) {
            case 1 :
                return (
                    <>
                        <OffersChooseYourPackageCMSComponent
                        />
                    </>
                );
                break
            case 2 :
                return (
                    <>
                        <OffersChooseYourPackageLikeAProComponent/>
                    </>
                )
            default:
                return 'error'
        }
    }

    return (
        <div>
            <OffersTitleCardComponent
                titleNumber='2'
                titleSection='What type of Website'
            />
            <div className='chooseYourProject'>
                <OffersCardsWithCheckComponent
                    titleCard='With CMS'
                    subtitleCard='xxxx'
                    active={active === 1 ? 'listing-active' : 'listing'}
                    onClick={() => {
                        setActive(1);
                        setTypeWebSite('withCMS');
                        updateTypeWebSite()
                    }}
                />
                <OffersCardsWithCheckComponent
                    titleCard='Like a pro'
                    subtitleCard='xxx'
                    active={active === 2 ? 'listing-active' : 'listing'}
                    onClick={() => {
                        setActive(2);
                        setTypeWebSite('like a pro');
                        updateTypeWebSite()

                    }}
                />
            </div>
            {
                renderElements({})
            }
        </div>

    );
}

export default OffersWhatTypeOfWebsiteComponent;

这是子组件:

代码语言:javascript
运行
复制
function OffersChooseYourPackageCMSComponent(props) {

    const dispatch = useDispatch()

    const [active, setActive] = useState(1)
    const [packageWebSite, setPackageWebSite] = useState('Shopify')
    const [pricePackageWebSite, setPricePackageWebSite] = useState(300)

    const updatePackageWebSite = () => {
        dispatch({
            type: "PACKAGE_WEBSITE",
            payload: {packageWebSite, pricePackageWebSite}
        })
    }

    useEffect(() => {
        updatePackageWebSite();
    }, [updatePackageWebSite()]);


    const renderElements = () => {
        switch (active) {
            case 1 :
                return (
                    <>
                        <OffersNumbersOfProductsComponent/>
                    </>
                );
                break
            case 2 :
                return (
                    <>
                        <OffersNumbersOfPagesComponent/>
                        <OffersWoocommerceComponent/>
                    </>
                );
                break
            default :
                return 'error'
        }
    }


    return (
        <div>
            <OffersTitleCardComponent
                titleNumber='3'
                titleSection='Choose your package'
            />
            <div className="shopify">
                <OffersCardsWithCheckComponent
                    onClick={() => {
                        setActive(1);
                        setPackageWebSite('Shopify');
                        setPricePackageWebSite(300);
                        updatePackageWebSite()
                    }}
                    active={active === 1 ? "listing-active" : "listing"}
                    titleCard='Shopify'
                    subtitleCard='xxx'
                    pricePackage='$54349'
                    detailPrice='(1 landing page + up to 5 products)'
                />
                <OffersCardsWithCheckComponent
                    onClick={() => {
                        setActive(2);
                        setPackageWebSite('WordPress');
                        setPricePackageWebSite(900);
                        updatePackageWebSite()
                    }}
                    active={active === 2 ? "listing-active" : "listing"}
                    titleCard='WordPress'
                    subtitleCard='xxxx'
                    pricePackage='$23349'
                    detailPrice='(1 landing page)'
                />
            </div>
            {renderElements()}
        </div>
    );
}

export default OffersChooseYourPackageCMSComponent;

也请不要犹豫地告诉我一些好的做法,如果需要的话,我也应该安排什么。

谢谢你的帮忙

EN

回答 2

Stack Overflow用户

发布于 2021-04-17 19:02:46

您也应该将其复制到您的子组件中

代码语言:javascript
运行
复制
const updateTypeWebSite = useCallback(() => {
    dispatch({
        type: "TYPE_WEBSITE",
        payload: typeWebSite
    })
}, [typeWebSite])

useEffect(() => updateTypeWebSite(), [updateTypeWebSite]);

在reactjs上阅读this文档

票数 1
EN

Stack Overflow用户

发布于 2021-04-17 21:23:08

找到了有效的解决方案,不知道这是否是最好的解决方案:

代码语言:javascript
运行
复制
    const [typeWebSite, setTypeWebSite] = useState('withCMS')

    const updateTypeWebSite = () => {
        dispatch({
            type: "TYPE_WEBSITE",
            payload: typeWebSite
        })
    }

    useEffect(() => {
      updateTypeWebSite()
    },[typeWebSite,setTypeWebSite]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67137297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档