javascript - React.useMemo 无法防止重新渲染

标签 javascript reactjs typescript react-hooks

我有以下简单组件:

const Dashboard = () => {
  const [{ data, loading, hasError, errors }] = useApiCall(true)

  if (hasError) {
    return null
  }

  return (
    <Fragment>
      <ActivityFeedTitle>
      <ActivityFeed data={data} isLoading={loading} />
    </Fragment>
  )
}

export default Dashboard

我想阻止 ActivityFeedTitle 组件的所有重新呈现,以便它只在加载时呈现一次。我的理解是,我应该能够使用带有空依赖项数组的 React.useMemo Hook 来实现这一点。我通过 return 更改为:

return (
    <Fragment>
        {React.useMemo(() => <ActivityFeedTitle>, [])}
        <ActivityFeed data={data} isLoading={loading} />
    </Fragment>
)

就我而言,这应该会阻止该组件的所有重新渲染?但是,ActivityFeedTitle 组件仍然会在每次呈现 Dashboard 组件时重新呈现。

我错过了什么?

编辑:

使用 React.memo 仍然会导致同样的问题。我尝试按如下方式内存我的 ActivityFeedTitle 组件:

const Memo = React.memo(() => (
  <ActivityFeedTitle />
))

然后在我的返回中像这样使用它:

return (
    <Fragment>
        {<Memo />}
        <ActivityFeed data={data} isLoading={loading} />
    </Fragment>
)

出现同样的问题。我还尝试将以下内容作为 React.memo 的第二个参数传入 () => false,但这也没有用。

最佳答案

使用React.memo()而不是根据 Prop 内存组件。

React.memo(function ActivityFeedTitle(props) {
  return <span>{props.title}</span>
})

注意:

This method only exists as a performance optimization. Do not rely on it to “prevent” a render, as this can lead to bugs.

关于javascript - React.useMemo 无法防止重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58496154/

相关文章:

angular - 类型错误 : Cannot read property 'prod_id' of undefined

嵌套对象中的 TypeScript 额外键

javascript - CRM 9 - 根据 JS 的记录动态绑定(bind) HTML 表/网格

javascript - IE 7/8 javascript排序错误 "Number Expected"

javascript - 图像在 safari 和 chrome 中缩放,但在 ff 和 opera 中不缩放

javascript - app.jsx 中未定义 <。使用react.js、react router 和 webpack

javascript - React 应用程序是否应该在文件刷新时进行完全刷新?

javascript - Jquery 自动完成显示名称和发送 ID

javascript - React 惯用的方式来更新状态中的 Map 对象

带有 ngx-translate 的 Angular + Electron