javascript - Hur man modifierar koden så att man kan använda usehook med React och TypeScript?
Ett popup-fönster visas när lägg till-knappen klickas på och räkningen är större eller mindre än 0.
nedan är koden,
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]);
}
Detta fungerar men anropar trigger-metoden endast när enabled är true.
Jag vill ändra koden ovan så att när användaren klickar på lägg till-knappen, vill jag att detta useTrigger ska hända. Jag vill inte kontrollera om det är aktiverat och kalla på trigger.
Jag har försökt följande borttagna kontrollera om aktiverad.
export function useTrigger(enabled: boolean, count: number) {
const { trigger } = usePopupContext();
React.useEffect(() => {
trigger(count);
}, [enabled, count, trigger]);
}
Detta fungerar men popup-fönstret visas när antalet är mindre än eller lika med 0. Men jag vill att det först ska kontrollera om lägg till-knappen har klickats eller inte.
Så snart användaren klickar på knappen lägg till i on_add_click vill jag att popup-fönstret ska visas. Hur kan jag ändra koden ovan? Jag är ny på att använda hooks. Kan någon hjälpa mig med detta? Tack.
REDIGERA:fet text Jag har försökt göra något som nedan och jag får ett fel
Okontrollerat invariantbrott: Ogiltigt hook-anrop. Hooks kan bara kallas inom kroppen av en funktionskomponent.
on_add_click = () => {
Trigger(count);
}
export function Trigger(count: number) {
const { trigger } = usePopupContext();
React.useEffect(() => {
trigger(count);
}, [count, trigger]);
}
hur kan jag fixa detta.
Svar #1
Om jag förstod dig rätt, behöver du bara lägga till ett state till din hook och returnera settern för att anropa den 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
}
Sedan i din komponent med knappen gör du något som detta:
const Component = (props) => {
const onClick = useTrigger(props.count)
/* ... */
return <button onClick={onClick}/>
}
