问答

怎么处理 react hook 依赖问题?

作者:admin 2021-05-07 我要评论

不懂就问,假如有以下 hooks: import React from 'react';const Demo = () = { const { userId } = useUser(); const { address } = useUserAddress(userId); c...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

不懂就问,假如有以下 hooks:

import React from 'react';

const Demo = () => {
    const { userId } = useUser();
    const { address } = useUserAddress(userId);
    const { favious } = useUserFavious(userId);
    
    return (
        <div>Hello World</div>
    );
};

其中,useUserAddressuseUserFavious依赖userId的值,我如何确保userId获取成功后才运行下面的 hooks。目前想到的方案:

  • 方案一:在 useUserAddressuseUserFavious 里判断userId 是否存在值。但是这样如果 hooks 多,每个都得加这个判断很繁琐
  • 方案二:把后面的hooks提取到子组件或者 HOC:
import React from 'react';

const ChildrenDemo = ({ userId }) => {
    const { address } = useUserAddress(userId);
    const { favious } = useUserFavious(userId);
    
    return (
        <div>Hello World</div>
    );
};

const Demo = () => {
    const { userId } = useUser();
    
    if(!userId) return null;
    
    return <ChildrenDemo userId={userId} />
};

请问有没有更好的处理方式吗?感觉都挺麻烦的

###

我觉得可以修改一下你的hooks, 提供设置值的方法, 再使用useEffect去监听userId的变化:

import React from 'react';

const Demo = () => {
    const { userId } = useUser();
    const [address, setAddress] = useUserAddress(userId);
    const [favious, setFavious] = useUserFavious(userId);
    
    useEffect(() => {
        setAddress(userId);
        setFavious(userId);
    }, [userId]);
    
    return (
        userId && <div>Hello World</div>
    );
};
###

试试?

useEffect(() => {
    new Promise(res => {
        const { userId } = useUser();
        res(userId);
    }).then(data => {
        const { address } = useUserAddress(userId);
        const { favious } = useUserFavious(userId);
    })
})

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 怎么处理 react hook 依赖问题?

    怎么处理 react hook 依赖问题?

  • JS对象展平问题。想得到[{"a":12,"d

    JS对象展平问题。想得到[{"a":12,"d

  • vue-router 问题

    vue-router 问题

  • 我的redis 的 watch 和 get 调换位置为

    我的redis 的 watch 和 get 调换位置为

腾讯云代理商
海外云服务器