【发布时间】:2020-08-09 05:48:14
【问题描述】:
示例 是一个功能组件,我在其中有条件地呈现div。我希望这个div 在有条件渲染时淡入,反之亦然淡出。
为此,我维护了两个局部状态变量:render 和 fadeIn,它们是根据传递给 Example 组件的 show 属性计算得出的。
我所做的是:
- 当
show支持它true 时,我将render设置为true,因此div有条件地呈现,并且在10ms超时后我设置fadeInas true 这会将我的 div 的 CSS 类名设置为show。 - 当
show支持它false时,我将fadeIn设置为false,这会将我的div的CSS类名设置为hide,并在超时后200ms(CSS 中的转换时间)我将render设置为 false,因此有条件地隐藏了div。
代码:
interface Props {
show: boolean;
}
const Example: React.FC<Props> = ({ show, }) => {
const [render, setRender] = useState(false);
const [fadeIn, setFadeIn] = useState(false);
useEffect(() => {
if (show) {
// render component conditionally
setRender(show);
// change state to for conditional CSS classname which will
// animate opacity, I had to give a timeout of 10ms else the
// component shows up abruptly
setTimeout(() => {
setFadeIn(show);
}, 10);
} else {
// change state to change component classname for opacity animation
setFadeIn(false);
// hide component conditionally after 200 ms
// because that's the transition time in CSS
setTimeout(() => {
setRender(false);
}, 200);
}
}, [
show,
]);
return (
<div>
{render && (
<div className={`container ${fadeIn ? 'show' : 'hide'}`} />
)}
</div>
);
};
样式表:
.container {
width: 100px;
height: 100px;
background-color: black;
transition: opacity 0.2s ease;
}
.show {
opacity: 1;
}
.hide {
opacity: 0;
}
我认为这不是一个好的编码实践来实现该功能,并且应该只在我的组件中维护一个本地状态。我需要您的建议,了解如何以更好的方式在不使用任何第三方库的情况下解决此问题。 谢谢:)
【问题讨论】:
-
你应该去看看 React Transition Group。它基本上解决了你试图用一个非常干净的 API 做的事情。 reactcommunity.org/react-transition-group
-
@StephanOlsen 谢谢,但我不想集成任何第三方库。
标签: css reactjs react-hooks css-transitions conditional-rendering