【发布时间】:2020-09-19 02:58:58
【问题描述】:
我有以下 React 测试应用:
class MemoTestApp extends React.Component {
constructor(props) {
super(props)
this.state = {
showOverlay: false,
}
}
render() {
return (
<div>
<div>
<MemoComponent str="Hello World" />
</div>
<div>
<input type="button" onClick={() => this.setState({showOverlay: true})} value="Show Overlay"/>
</div>
{this.state.showOverlay && (
<div className="overlay">
<h2>Overlay</h2>
<MemoComponent str="Hello World" />
</div>
)}
</div>
)
}
}
const Component = (props) => {
console.info('render ' + props.str);
return <div>{props.str}</div>;
}
const MemoComponent = React.memo(Component);
ReactDOM.render(<MemoTestApp />, document.querySelector("#app"))
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
position: relative;
min-height: 200px;
}
.overlay {
position: absolute;
padding: 20px;
left: 0;
top: 0;
right: 0;
bottom: 0;
background-color: white;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="app"></div>
如您所见,有一个记忆功能组件,它使用相同的道具渲染两次。第一次渲染立即进行,第二次在用户按下按钮后进行。
但是,正如您在控制台中看到的那样,组件确实被渲染了两次。 React.memo 阻止对组件的第一个实例进行第二次渲染,但第二个实例似乎“现在知道”该组件已经使用给定的 props 进行了渲染。
有没有办法让记忆化“全局化”,即渲染的输出在组件的不同实例之间共享?
React.memo默认不是全局的是什么原因?
【问题讨论】:
-
您的实际目标是只有一个
MemoComponent实例并在切换覆盖时在 React 树中移动它吗? -
@ford04 不,这不是我的目标(但可能是我的“全局记忆”也有意义的场景)。我一般会问,如果相同的组件出现在 UI 的不同位置,可能使用相同的道具,那么为什么需要渲染两次?即,为什么记忆是本地的而不是全局的?
标签: reactjs memoization