在我的项目中,我有一个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>
)
}
和主要的App
export function App(props) {
const [refreshList, setRefreshList] = useState(0);
return (
<div className='App'>
<Header />
<Navigation />
<Page setRefreshList={setRefreshList} />
</div>
);
}
每次添加到Navigation
中时,我都需要刷新Page
组件,所以我使用了setState
。现在,每当状态发生变化时,它也会呈现所有其他组件。
我试着使用React.memo()
,但是它在这里没有效果,因为props
包含一个函数。合并Page
和Navigation
并不是一种选择,因为在整个项目中,它们是分开的。
链接到联机代码编辑器的示例:https://playcode.io/953730/。
发布于 2022-09-02 20:24:37
“我试着使用React.memo
,但是它在这里没有作用,因为道具包含函数”,好吧,这种用例有一个钩子,叫做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>
发布于 2022-09-03 08:06:46
在您的简化示例中,您只需更新key
属性并强制响应重呈现Navigation
组件。
function App(props) {
const [refreshList, setRefreshList] = React.useState(0);
return (
<div className="App">
<Header />
<Navigation key={refreshList} />
<Page setRefreshList={setRefreshList} />
</div>
);
}
您还可以使用全局响应上下文,并让Page
和Navigation
通过上下文共享refreshList
。
https://stackoverflow.com/questions/73586727
复制相似问题