【发布时间】:2020-09-27 05:29:13
【问题描述】:
当没有任何东西用于触发重新渲染组件时,我很难弄清楚发生了什么。
Events.js 当我从 Event.js 中删除 useState() 时,组件会呈现两次,但我需要保留它。当我在 Event 组件中使用 useEffect() 时,第四次渲染。
我只是保留了虚拟数据给你填补空白,并试图删除React.memo,没有任何反应。我相信问题出在Event.js 组件上。我也在使用 Context API,但是第四次渲染太多了。
App.js 中的 useEffect 正在从 localStorage 中获取一些值,我无法直接访问该值,因为默认情况下该值未定义
这里的沙盒代码:https://codesandbox.io/s/event-manager-reactjs-nbz8z?file=/src/Pages/Events/Events.js
Events.js 文件位于 /Pages/Events/Events.js
示例代码如下
Event.js(子组件)
function Events() {
// Sate Managing
const [allEvents, setAllEvents] = React.useState(null);
console.log('Rendering EventsJs', allEvents);
React.useEffect(() => {
setAllEvents(['apple', 'banana']);
}, []);
return (
<div className="events">
{ console.log('Event Rendered.js =>') }
</div>
)
}
export default React.memo(Events, (prevProps, nextProps) => {
return true;
} );
App.js(父组件)
import { BrowserRouter, Route, Redirect } from 'react-router-dom';
function App() {
const [userId, setUserId] = React.useState(null);
React.useEffect(() => {
setUserId(1);
}, []);
// Login
return (
<BrowserRouter>
<Navigation />
<Route path='/events' component={Events} />
{console.log('App Rendered')}
</BrowserRouter>
);
}
export default App;
错误:
【问题讨论】:
-
当您删除 which
useState时,您为什么要以这种方式使用 useEffect ?您可以通过useState(1)直接将 userId 设置为 1 -
您是否启用了StrictMode?
-
setAllEvents 在效果中是没有意义的,你可以做
React.useState(['apple', 'banana']);并防止挂载后重新渲染。很多人已经告诉过你,你使用 React.memo 是错误的(我建议省略第二个参数)。除此之外,没有显示会导致 6 次重新渲染的代码,因此如果没有 minimal, reproducible example(不是带有调试请求的代码转储),任何人都无能为力。 -
@AjeetShah 我将代码部署在沙箱codesandbox.io/s/nbz8z?file=/src/App.js
标签: javascript reactjs react-router-dom