简体   繁体   English

如何在 React 中触发 useCallback

[英]How to trigger the useCallback in React

I am having a React(version used 16.8) component, I have a const updateDiffText = useCallback(() callback on click of anchor GENERATE DIFF onclick onClick={updateDiffText} I call call back this updateDiffText我有一个 React(版本使用 16.8) 组件,我有一个const updateDiffText = useCallback(()点击锚点GENERATE DIFF onclick onClick={updateDiffText}回调我回调这个updateDiffText

My requirement is I don't want one anchor code in my UI, I want whenever I have oldText and newText It should trigger the method updateDiffText and show the result.我的要求是我不想在我的 UI 中有一个锚代码,只要我有oldTextnewText就应该触发方法updateDiffText并显示结果。 User should not click on anchor link to perform this.用户不应单击锚链接来执行此操作。

My Code sand box here - https://codesandbox.io/s/react-diff-view-demo-htp06 if I have values in oldtext and newText it should call updateDiffText this method我的代码沙箱在这里 - https://codesandbox.io/s/react-diff-view-demo-htp06如果我在 oldtext 和 newText 中有值它应该调用 updateDiffText 这个方法

My Code -我的代码 -

const DiffViewer = props => {
    const oldText = useInput(props.startupConfigData);
    const newText = useInput(props.runningConfigData);
    const [{ type, hunks }, setDiff] = useState("");
    const updateDiffText = useCallback(() => {
        const diffText = formatLines(diffLines(oldText.value, newText.value), {
            context: 3
        });
        const [diff] = parseDiff(diffText, { nearbySequences: "zip" });
        setDiff(diff);
    }, [oldText.value, newText.value, setDiff]);

    const tokens = useMemo(() => tokenize(hunks), [hunks]);

    return (
        <div style={{ height: "450px", overflow: "auto" }}>
            <a href="#" onClick={updateDiffText}>
                GENERATE DIFF
            </a>

            {setDiff ? (
                <Diff
                    viewType="split"
                    diffType={type}
                    hunks={hunks || EMPTY_HUNKS}
                    tokens={tokens}
                >
                    {hunks => hunks.map(hunk => <Hunk key={hunk.content} hunk={hunk} />)}
                </Diff>
            ) : (
                ""
            )}
        </div>
    );
};

Let me know if query is not clear.如果查询不清楚,请告诉我。 Thanks.谢谢。

const updateDiffText = useCallback(() => {
    const diffText = formatLines(diffLines(oldText.value, newText.value), {
        context: 3
    });
    const [diff] = parseDiff(diffText, { nearbySequences: "zip" });
    setDiff(diff);
}, [props.startupConfigData, props.runningConfigData]);

to

const updateDiffText = useCallback(() => {
    const diffText = formatLines(diffLines(oldText.value, newText.value), {
        context: 3
    });
    const [diff] = parseDiff(diffText, { nearbySequences: "zip" });
    setDiff(diff);
}, [oldText.value, newText.value, setDiff]);

////////////// Older solution before i understood /////////////////////// ////////////// New solution i suggest /////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// ////// 我建议的新解决方案 /////////////////////////////

const updateDiffText = () => {
// do what you wanna do 
}

and use useEffect instead of useCallback like this并像这样使用 useEffect 而不是 useCallback

useEffect(() => {
   updateDiffText();
},[props.startupConfigData, props.runningConfigData])

Try to use the useEffect instead of useCallback.尝试使用 useEffect 而不是 useCallback。 In your case you are are not calling the memoized function in the render stage.在您的情况下,您没有在渲染阶段调用记忆的 function。 useCallback will return a memoized function. useCallback 将返回一个记忆的 function。 Check the modified version.检查修改后的版本。

  1. https://codesandbox.io/s/react-diff-view-demo-izdyi https://codesandbox.io/s/react-diff-view-demo-izdyi

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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