reactjs - 如果使用 React.memo,则 Parent 中的 React useCallback() 函数只能与 Child 正常工作,没有它不起作用,任何帮助?
问题描述
父组件
父组件包含在更改时将状态设置为“本地”的输入,以及在单击时获取此“本地”状态的值并将其设置为“sendLocal”的按钮
功能
changehandler :触发输入类型更改。
sendLocalValue :将“本地”值放入“sendLocal”变量中,单击按钮时触发。
sendValue :这个带有依赖“sendLocal”的记忆函数作为子组件中的道具传递,一旦孩子被渲染,就会触发。
import React, { useState, useCallback } from "react"; import ChildComponent from "./ChildComponent"; function ParentComponent() { const [local, setLocal] = useState(); const [sendLocal, setsendLocal] = useState(); const changehandler = (e) => { console.log("parent"); setLocal(e.target.value); }; const sendLocalValue = () => { setsendLocal(local); }; const sendValue = useCallback(() => { return sendLocal; }, [sendLocal]); return ( <> <input type="text" onChange={changehandler} defaultValue={local} /> <button onClick={sendLocalValue}>send</button> <ChildComponent getValue={sendValue} /> </> ); } export default ParentComponent;
子组件
getValue prop 调用 parent 的memoized "sendValue" 函数,该函数返回 sendLocal 的值。
问题
一切正常,子组件仅在单击按钮时“sendLocal”值发生变化时呈现,但如果我删除子组件中的 React.memo(),即使使用了 useCallback(),组件在输入类型上的呈现也会发生变化,为什么?
import React, { useEffect, useState } from "react";
function ChildComponent({ getValue }) {
console.log("child");
return <div>child's {getValue()}</div>;
}
export default React.memo(ChildComponent);
解决方案
有一个普遍的误解,认为 React 组件会在 props 或 state 改变时重新渲染。虽然这部分是正确的,但可能会导致误解:当它的状态改变或它的父级重新渲染时(因为它的状态改变或因为它的父级重新渲染,等等),一个反应组件会重新渲染。
所以这意味着每次ParentComponent
重新渲染时,它的所有(非记忆的)孩子都会重新渲染。
为避免这种情况,您可以使用React.memo
或React.PureComponent
。
您可以通过删除React.memo
而不将任何道具传递给 ChildComponent 来验证这一点。即使没有道具,它也会在每次其父级重新渲染时重新渲染。
推荐阅读
- javascript - 使用 vanilla JavaScript 向下滚动所有(垂直)可滚动条
- javascript - reactjs和nodejs上传图片时出现404错误怎么解决?
- apache - sling 框架的哪一部分添加了包装 div 和 css 类
- jquery - 从模板jQuery获取输入值
- r - 如何将宽数据转换为长格式以进行交叉分类模型 [R, GLMM]
- tensorflow - 如何将对象检测的(帧号、边界框信息、置信度)打印到 tensorflow 对象检测器中的文本文件中?
- c - 放在 C 程序开头的“main()”是什么意思?
- assembly - 'callq *(%rax)' 是什么意思?
- c++ - C++ cout 损坏
- ruby-on-rails - 使用omniauth-facebook使用facebook登录执行过期错误