在我的项目中,我有一个Page组件,用于添加项,然后在Navigation面板中显示它们:

import React, { useState } from 'react'

const Page = ({setRefreshList}) => {
  console.log("PAGE RENDER");
  const addItem = () => {
    // adding item to database
    setRefreshList();
  }

  return (
    <button onClick={addItem}>Add Item</button>
  )
}

Navigation个组件,带有站点菜单和项目:

const Navigation = () => {
  console.log("Navigation RENDER");
  return (
    <div>
    List of all items:
    </div>
  )
}

页面中还有一些组件,如Header:

const Header = () => {
  console.log("HEADER RENDER");
  return (
    <div>
    HEADER
    </div>
  )
}

和Main App:

export function App(props) {
  const [refreshList, setRefreshList] = useState(0);

  return (
    <div className='App'>
    <Header />
    <Navigation />
    <Page setRefreshList={setRefreshList} />
    </div>
  );
}

我需要刷新Navigation组件每次添加到Page项,所以我使用setState.现在,每次状态更改时,它也会呈现所有其他组件.

我try 使用React.memo(),但在这里没有效果,因为props包含一个函数.PageNavigation的组合不是一个选项,因为在整个项目中,它们是分开的.

链接到在线代码编辑器,示例为:https://playcode.io/953730/.

推荐答案

"I tried to use 101 but it has no effect here because props contains function",有一个用于这类用例的钩子,称为useCallback,您可以这样使用:

const Page = React.memo(({ setRefreshList }) => {
  console.log("PAGE RENDER");
  const addItem = React.useCallback(() => {
    // adding item to database
    setRefreshList(Math.random());
  }, []);

  return <button onClick={addItem}>Add Item</button>;
});

const Navigation = () => {
  console.log("Navigation RENDER");
  return <div>List of all items:</div>;
};

const Header = React.memo(() => {
  console.log("HEADER RENDER");
  return <div>HEADER</div>;
});

function App(props) {
  const [refreshList, setRefreshList] = React.useState(0);

  return (
    <div className="App">
      <Header />
      <Navigation />
      <Page setRefreshList={setRefreshList} />
    </div>
  );
}

ReactDOM.render(
  <App />,
  document.getElementById("root")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.0/umd/react-dom.production.min.js"></script>
<div id="root"></div>

Javascript相关问答推荐

如何使用React渲染器放置根dis?

reaction useEffect KeyDown for each 条目配音输出

fetch在本地设置相同来源的cookie,但部署时相同的代码不会设置cookie

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

查找最长的子序列-无法重置数组

无法使用单击按钮时的useState将数据从一个页面传递到另一个页面

使用Java脚本导入gltf场景并创建边界框

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

如何将innerHTML字符串修剪为其中的特定元素?

Eval vs函数()返回语义

JavaScript是否有多个`unfined`?

Puppeteer上每页的useProxy返回的不是函数/构造函数

在画布中调整边上反弹框的大小失败

如何在JAVASCRIPT中合并两组对象并返回一些键

如果一个字符串前面有点、空格或无字符串,后面有空格、连字符或无字符串,则匹配正则表达式

当代码另有说明时,随机放置的圆圈有时会从画布上消失

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

如何为仅有数据可用的点显示X轴标签?

为什么在运行于<;img>;事件处理程序中的JavaScript中x和y是不可变的?

如何在Java脚本中并行运行for或任意循环的每次迭代