简体   繁体   中英

Error: React Hook "useCallback" is called conditionally. React Hooks must be called in the exact same order in every component render

Getting a build error usecallback hook called conditinally. if i dont use useCallback i get the error JSX props should not use arrow functions
const LinkComp = <T extends {}>(props: LinkProps & T extends AnchorProps? AnchorProps: ButtonProps) => { const { title, hideTitle, children, url = '', action, label, newWindow, className, iconName, isExternal, inheritColor = true, underlineOnHover = true, underline = false, theme = '', bold = false, onClick, modal = false, forceAnchorTag = false, appendQueryParams = true, showOutline = true, ...linkProps } = props; const [handleClick] = useRouter(action, url); const forwardedParams = useSelector(selectForwardedQueryParams);

const linkContent = (
    <>
        {iconName && <Icon name={iconName} className='mr-3' />}
        {!hideTitle && (title || children)}
    </>
);

if (modal) {
    if (linkProps.modalTitle) delete linkProps.modalTitle;

    return (
        <button {...(anchorProps as ButtonProps)} role='link' onClick={onClick as ButtonProps['onClick']}>
            {linkContent}
        </button>
    );
}

// queryString.stringifyUrl combines the params from both url and forwarded params.
// don't append the params for `tel` links
const forwardedParamsUrl = queryString.stringifyUrl({ url, query: !url?.includes('tel:') && forwardedParams });

const handleAnchorClick = useCallback((e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) =>  {
    if (handleClick) handleClick(e);
    
    return true;
},[handleClick]);

if (forceAnchorTag) {
    return (
        <a href={forwardedParamsUrl} {...(anchorProps as AnchorProps)} onClick={handleAnchorClick}>
            {linkContent}
        </a>
    );
}
// search extras uses the query params in a different way, so no need to append them here
const fullUrl = appendQueryParams ? forwardedParamsUrl : url;

return (
    <Link href={fullUrl} passHref={isExternal || newWindow}>
        <a {...(anchorProps as AnchorProps)} onClick={handleClick}>
            {linkContent}
        </a>
    </Link>
);

};

export default LinkComp;

You shouldn't be passing a function into a useCallback hook. Why are you doing that?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM