【发布时间】:2020-09-10 18:53:09
【问题描述】:
我想限制父容器组件可以容纳的组件数量。
假设我有一个项目容器,我在其中渲染了数十个 Item 组件。容器的高度限制为220px,每个Item 的高度为50px(为简单起见,实际代码中的Item 高度不同)。
使用 React,我想限制容器可以容纳的 Item 组件的数量,相对于它的高度。因此,在将每个Item 放入容器之前,我需要验证容器是否没有溢出,如果是,则停止向其中渲染更多项目。
我使用以下代码来实现:
const [canRender, setCanRender] = useState(true);
useEffect(() => {
const parent = ref.current.parentElement;
setCanRender(parent.clientHeight <= parent.scrollHeight);
}, []);
在给定的示例中,应该只渲染 3 个 Item 组件,因为容器无法容纳更多。 我的问题是 React 会立即渲染所有组件(由于未同步设置状态?)。
如何有条件地渲染Item组件并检查容器溢出?
【问题讨论】:
-
我想你可以一个一个地设置Items数组,并有一个每次检查滚动高度的挂载钩子?它很可能会破坏你正在做的任何事情的目的。我建议你对太多的项目使用最佳的猜测时间,然后根据它进行调整,或者使用无限滚动插件或其他东西。当然,我不知道你到底想用这个实现什么,所以可能你必须这样做。
-
@user120242 使用钩子不会有什么不同,因为我将处理相同的状态问题并且一次性渲染项目。插件对我来说不是一个选项,因为我只想在某些情况下有条件地显示或隐藏项目。所以与无限滚动无关。
-
问题的核心部分是您想要一个生命周期,以便您可以根据父参考进行优化。由于它是无状态的,因此您将无法使用函数式语法来获得它。您将需要使用类语法并使用
shouldComponentUpdate来检查父级的状态。 stackoverflow.com/questions/40909902/… -
我不建议这样做,但是根据您的要求,您可以为每个 Item 一个一个渲染的 Items 设置数据数组,以强制按顺序重新渲染每个 Item。您显然会挂钩 setState ,以便它无法捆绑 setState 更新和挂钩安装。您将向每个渲染的项目传递一个回调函数(可能作为道具)以挂钩它们的安装以进行您的滚动高度检查。 Jango 的建议听起来更好,但我不知道您将如何处理明确要求每个项目的 DOM 回流计算,这肯定会是一个 PITA。
-
@user120242 是的,我觉得这种相对简单的任务缺少功能。
标签: javascript css reactjs react-hooks