使用 React / Redux 将面板滑开 0.3 或 0.6 秒,我们是否已经必须分派两个操作来处​​理它?

问题描述

如果一个 React 面板在渲染过程中计算量有点大,并且我们想让它在主页面也在渲染某些东西时消失,它会通过向左或向右滑动面板来加速页面更新页面并隐藏它。 (页面在面板和主页中都在不断地进行数据可视化)。

但是,如果由于状态 width: 0isMainPageConstantlyUpdating 而面板突然变为空白或变为 true 并且面板具有以下行:

    if (isMainPageConstantlyUpdating) return <div></div>;

这种情况下,我们真的要调度一个动作,设置isMainPageConstantlyUpdating的redux状态,然后将面板向左滑动,然后在transitionend事件处调度另一个诸如isMainPageConstantlyUpdatingForFullWindow之类的操作,如果这是真的,那么执行return <div></div>? (因为面板已经看不见了)。

看来不管我怎么处理,大概都得把这两个动作分派出去。能不能用更简单的方式处理,比如能不能让面板里面的内容不更新,面板滑走?这样,它所涉及的一切都可以是一种状态,即 isMainPageConstantlyUpdating,我们让它不更新面板,将其滑开并完成。但这与冻结数据有关,这通常不是React / Redux 的工作方式(数据通常会不断更新到 redux 存储中并提供给组件)。

看来我们或许可以用 useMemo 来记忆 props,或者最终的 JSX,比如:

const jsx = useMemo(() => {  return someResults(); },[isMainPageConstantlyUpdating || someTimeStamp]);

所以当 isMainPageConstantlyUpdating 为假时,数组元素获取时间戳,并重新计算,但当 isMainPageConstantlyUpdating 为真时,它将继续为真,因此不会调用函数更新内容,但这也让它变得相当复杂。

解决方法

我正在尝试,似乎一种解决方案是我们不必管理 0.3 秒后的这种“微观状态”。

我们可以简单地使用本地状态,例如

const [isNotToRender,setIsNotToRender] = useState(false);

这样对于任何动画结束,我们都有一个监听器,然后将 isNotToRender 设置为 true,如果为 true,则不返回任何复杂的渲染,如果我们只返回 return <div></div>想要。

我知道官方 Redux 示例文档基本上可以调度所有内容。它几乎只是为了最终完成某件事而派遣。我认为它正在调度某些东西,然后使用 useEffect(fn,[someState]) 启动一些行为。这可能是一种方式,但有时我的风格更像是:在需要完成的时候做事情,并且只调度改变与应用程序的数据或重要状态更相关的事情。