在聊到Vue性能优化的时候,经常会提到v-show和v-if,对于性能优化来说v-show是一个绕不过去的话题,可是React中并没有类似的Api,那么如果React要实现类似的功能应该怎么处理呢?
首先v-show的原理是基于对元素的display属性的控制来实现的,明确这一点之后,结合HOC,一切似乎就变得明朗起来
import React from 'react';
function withShowHide(Component) {
return function ShowHideWrapper(props) {
const { visible, ...rest } = props;
const displayStyle = { display: visible ? 'block' : 'none' };
return (
<div style={displayStyle}>
<Component {...rest} />
</div>
);
};
}
export default withShowHide;
这里定义了一个名为withShowHide的高阶组件,接受一个普通组件作为参数,并返回一个新的组件。新组件将原始组件包裹在一个
标签中,并根据visible属性的值来控制display属性的值,从而实现显示与隐藏的效果。
使用方式也很简单,只需要将需要封装的组件作为参数传递给withShowHide函数,然后使用返回的新组件即可
import React from 'react';
import withShowHide from './withShowHide';
function My(props) {
return <div>Hello World</div>;
}
const ShowHideComponent = withShowHide(My);
function App() {
return (
<div>
<button onClick={() => setVisible(!visible)}>Toggle</button>
<ShowHideComponent visible={visible} />
</div>
);
}
export default App;
这里将visible属性设置为一个状态变量visible的值,从而控制组件的显示与隐藏。通过点击Toggle按钮,可以切换visible变量的值,从而实现显示与隐藏的切换。