如何在 React 中触发 useCallback

Posted

技术标签:

【中文标题】如何在 React 中触发 useCallback【英文标题】:How to trigger the useCallback in React 【发布时间】:2020-01-21 04:30:35 【问题描述】:

我有一个 React(版本使用 16.8)组件,我有一个 const updateDiffText = useCallback(() 锚点点击回调 GENERATE DIFF onclick onClick=updateDiffText 我回调这个 updateDiffText

我的要求是我不想在我的 UI 中有一个锚代码,只要我有 oldTextnewText 它应该触发方法 updateDiffText 并显示结果。用户不应单击锚链接来执行此操作。

我的代码沙盒在这里 - https://codesandbox.io/s/react-diff-view-demo-htp06 如果我在 oldtext 和 newText 中有值,它应该调用 updateDiffText 这个方法

我的代码 -

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>
    );
;

如果查询不清楚,请告诉我。谢谢。

【问题讨论】:

【参考方案1】:

尝试使用 useEffect 而不是 useCallback。在您的情况下,您没有在渲染阶段调用 memoized 函数。 useCallback 将返回一个记忆函数。检查修改后的版本。

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

【讨论】:

你能告诉我[oldText.value, newText.value], setDiff这是做什么用的吗谢谢。 我们不需要 setDiff,它会被 useEffect 忽略。我现在已经删除了。 谢谢。我有一个查询 [***.com/questions/58004555/… 你认为 useEffect 是否也会帮助我。 我在 useEffect 中的 oldText.value 和 newText.value 上总是有相同的值,再次点击它的值不会更新。因为 useEffect 只调用了一次。当组件加载时。有什么建议吗? useEffect 将在每次依赖项更改时调用,在您的情况下,如果 oldText.value 或 newText.value 发生任何更改,它将被调用。【参考方案2】:
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]);

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 updateDiffText = () => 
// do what you wanna do 

并像这样使用 useEffect 而不是 useCallback

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

【讨论】:

谢谢你的回答,但这不起作用,我有两个道具的价值,但它仍然没有进入这个函数。 如果我知道你到底想做什么并知道你的代码结构,我想我可以更好地帮助你 这是我创建的代码沙箱,codesandbox.io/s/react-diff-view-demo-htp06 如果我在 oldtext 和 newText 中有值,它应该调用 updateDiffText 这个方法。 你有 oldtext 和 newText 作为道具吗? reactjs.org/docs/hooks-effect.html你可以从这里看到如何将生命周期方法替换为useEffect

以上是关于如何在 React 中触发 useCallback的主要内容,如果未能解决你的问题,请参考以下文章

UseCallback,UseMemo,memo

React - 无法在 usecallback 函数中调用道具值

我们应该在 React 功能组件的每个函数处理程序中使用 useCallback

React Hooks useCallback 的简单示例的问题

如何在功能组件中混合使用 useCallback 和 useRef

react useCallback notice