网站搜索

javascript - 如何修改代码以便可以使用 react 和 typescript 调用 usehook?


当点击添加按钮且计数大于或小于0时,会显示一个弹出窗口。

下面是代码,

function AddButton () {
    const [isOpen, setIsOpen] = React.useState(false);
    const count = useGetCount();
    useTrigger(isOpen, count);
    const on_add_click = ()  => {
        setIsOpen(true);
    }

    return (
        <button onClick={on_add_click}>add</button>
    );  
}


interface ContextProps {
    trigger: (count: number) => void;
}

const popupContext = React.createContext<ContextProps>({
    trigger: (count: number) => {},
});

const usePopupContext = () => React.useContext(popupContext);

export const popupContextProvider = ({ children }: any) => {
    const [show, setShow] = React.useState(false);
    const limit = 0;

    const dismiss = () => {
        if (show) {
            sessionStorage.setItem(somePopupId, 'dismissed');
            setShow(false);
        }

    };

    const isDismissed = (dialogId: string) =>
        sessionStorage.getItem(dialogId) === 'dismissed';

        const context = {
            trigger: (count: number) => {
            if (!isDismissed(somePopupId) && count <= limit) {
                setShow(true);
            } else if (count > limit) {
                setShow(false);
            }
        },
    };

    return (
        <popupContext.Provider value={context}>
            {children}
            {show && (
                <Popup onHide={dismiss} />
            )}
        </popupContext.Provider>
    );
};


export function useTrigger(enabled: boolean, count: number) {
    const { trigger } = usePopupContext();
    React.useEffect(() => {
        if (enabled) {
            trigger(count);
        }
    }, [enabled, count, trigger]);
}

这可以工作,但只有当 enabled 为 true 时才会调用触发方法。

我想修改上面的代码,这样当用户点击添加按钮时,我希望这个 useTrigger 发生。我不想检查是否启用并调用 trigger。

我已经尝试了以下取消勾选启用的操作。

export function useTrigger(enabled: boolean, count: number) {
    const { trigger } = usePopupContext();
    React.useEffect(() => {
        trigger(count);
    }, [enabled, count, trigger]);
}

这个可以工作,但当计数小于或等于0时会显示弹出窗口。但我希望它首先检查是否点击了添加按钮。

就在用户在 on_add_click 中点击添加按钮后,我希望弹出窗口显示。我该如何修改上面的代码?我刚开始使用 hooks。有人能帮我吗?谢谢。

编辑:加粗文本 我尝试做如下操作,但出现错误

未捕获的不变性违规:无效的 Hook 调用。Hook 只能在函数组件体内部调用。

on_add_click = () => {
    Trigger(count);
}

export function Trigger(count: number) {
    const { trigger } = usePopupContext();
    React.useEffect(() => {
        trigger(count);
    }, [count, trigger]);
}

我该如何修复这个。

答案#1

如果我理解正确的话,你只需要在你的 hook 中添加一个状态,并返回 setter,以便在 onclick 时调用它:

export function useTrigger(count: number) {
    const [clicked, setClicked] = React.useState(false)
    const { trigger } = usePopupContext();
    React.useEffect(() => {
        if(clicked) {
            trigger(count);
        }
 
    }, [count, trigger, clicked]);
    const clickCb = useCallback(() => {setClicked(true)}, [])
    return cb
}

然后在你的带有按钮的组件中,你可以这样做:

const Component = (props) => {
    const onClick = useTrigger(props.count)
    /* ... */
    return <button onClick={onClick}/>
}