Javascript 在另一个功能组件中声明React.memo是否提供了预期的记忆性能?

Javascript 在另一个功能组件中声明React.memo是否提供了预期的记忆性能?,javascript,reactjs,Javascript,Reactjs,最近,我一直在考虑如何记忆功能组件的一些子组件,基于。这些子组件可能/可能没有使用主组件中的一些道具 让组件按如下方式编写: export const main component=({a,b})=>{ const AComponent=React.memo(()=>这是{a}的字符串) 返回( 这是{b}的字符串 ) } 假设main组件在父组件的生命周期中多次重新呈现 const-App=()=>{ const[a,setA]=useState(0);//仅当按下按钮时才更新a const

最近,我一直在考虑如何记忆功能组件的一些子组件,基于。这些子组件可能/可能没有使用主组件中的一些道具

让组件按如下方式编写:

export const main component=({a,b})=>{
const AComponent=React.memo(()=>这是{a}

的字符串) 返回( 这是{b}的字符串

) }
假设
main组件在父组件的生命周期中多次重新呈现

const-App=()=>{
const[a,setA]=useState(0);//仅当按下按钮时才更新a
const[b,setB]=useState(0);//每1秒更新一次
constonclick=()=>setA(a=>a+1);
useffect(()=>{
const interval=setInterval(()=>setB(b=>b+11000);
return()=>clearInterval(interval);
}, []);
返回(
增量a
)
}
我理解,随着
应用程序中
a
b
状态的更新,需要重新呈现,这反过来又必须重新呈现
main组件,这取决于
a
b

有两个问题:

  • App
    中的
    interval
    更新
    b
    时,
    a
    根本不更新,因此当
    main组件重新呈现时,是否应该使用记忆的
    a组件
    ,而不支付呈现成本

  • 我知道当按下按钮时,
    App
    中的
    a
    被更新,这使得
    main组件
    重新渲染;
    a组件
    无法使用记忆版本,因此需要再次支付渲染成本,但之后它会被记忆,为
    main组件的下一次重新渲染做好准备。我说的对吗?虽然在这个渲染周期中,
    b
    没有更新,
    这是{b}

    (未记忆)的字符串被重新渲染,并支付渲染成本


  • 我是否正确使用React的备忘录?这些备选方案中哪一个更好?它们在功能上是否相同

  • 反应备忘录
  • const AComponent=React.memo(props=>这是{props.a}的字符串

  • 使用备忘录
  • constacomponent=React.usemo(()=>这是{a}[a]的字符串)
    //然后像这样使用它
    返回{aComponent}
    
    我在一个小实验中使用了备忘录,我上传了图片,也许它会有用

    Title.js:

    App.js:

    a)在我的测试中,记忆总是更快(尽管有些博客帖子不这么说)。话虽如此,除非你有一个特别重的组件,或者这个组件有很多孩子,否则你不会看到任何明显的收益。如果您正在键入,并且由于父项的原因,输入被重新呈现,那么它还可以避免您失去焦点

    b) 简而言之,它们都不起作用,
    React.memo
    必须位于渲染函数之外,它不是维护引用的“magic”
    use
    hook函数的一部分。您必须使用
    usemo
    进行内部渲染。下面是一个示例:不会每秒重新渲染的组件是
    CComponent
    DComponent

    const CComponent=React.memo({count})=>(
    未每秒重新渲染:{count}

    )); 常量主组件=(道具)=>{ 常量AComponent=React.memo(()=>( 当父对象执行以下操作时重新渲染:{props.count}

    )); 常量BComponent=React.memo({count})=>( 当父对象执行以下操作时重新呈现:{count}

    )); 常量DComponent=React.useMoom(()=>( 不每秒重新渲染:{props.count}

    ),[props.count]); 返回( {DComponent} 父计数:{props.count}

    父另一个计数器:{props.anotherCounter}

    ); }; 函数App(){ const[count,setCount]=React.useState(0); 常数[anotherCounter,setAnotherCounter]=React.useState(100); React.useffect(()=>{ 常数h=setInterval(()=>{ 设置计数((c)=>c+1); }, 6000); 常数h2=setInterval(()=>{ setAnotherCounter((c)=>c+1); }, 1000); return()=>{ 净距(h); 间隙(h2); }; }, []); 返回( ); } ReactDOM.render(,document.querySelector('#container')
    
    
    这是一个很好的尝试,但它并没有真正回答任何问题。感谢您的见解。我错误地认为
    React.memo
    可以在功能组件的渲染中使用,但我很高兴
    usemo
    实际上允许这样做。