我如何告诉 Masonry 组件它的单元格已经改变了高度?

2024-02-14

我有一个反应组件,它以网格模式显示一维项目列表。每个项目都具有相同的宽度和高度,并且它们位于三列内。可能有很多这样的东西,所以我决定使用 Masonry 组件来尝试一下 React-virtualized,该组件似乎是专门为这个用例而编写的。它工作得很好,但有一点需要注意:如果项目改变了它们的高度,我无法让 Masonry 注意到。

这是一个简化的示例:

constructor(props) {
    [...]
    this.cellMeasurerCache = new CellMeasurerCache({
        defaultHeight: this.state.height,
        fixedWidth: true,
    });

    this.cellPositioner = createMasonryCellPositioner({
        cellMeasurerCache: this.cellMeasurerCache,
        columnCount: 3,
        columnWidth: 250,
        spacer: 20,
    });
}

[...]

cellRenderer({ index, key, parent, style }) {
    return (
        <CellMeasurer
            cache={this.cellMeasurerCache}
            index={index}
            key={key}
            parent={parent}
        >
            <div style={style}>
                [...]
            </div>
        </CellMeasurer>
    );
}

resetMasonry() {
    this.cellMeasurerCache.clearAll();

    this.cellPositioner.reset({
        cache: this.cellMeasurerCache,
        columnCount: 3,
        columnWidth: 250,
        spacer: 20,
    });

    this.masonryRef.recomputeCellPositions();
}

render() {
    return (
        <AutoSizer>
            {({ height, width }) =>
                <Masonry
                    cellCount={this.state.list.length}
                    cellMeasurerCache={this.cellMeasurerCache}
                    cellPositioner={this.cellPositioner}
                    cellRenderer={this.cellRenderer}
                    height={height}
                    ref={this.setMasonryRef}
                    width={width}
                />
            }
        </AutoSizer>
    );
}

resetMasonry当组件的高度状态发生变化时调用。我从几个 stackoverflow 答案和其他资源中对当前代码进行了货物崇拜,甚至检查了源代码,但没有任何效果。我注意到我没有告诉 cellMeasurerCache 或任何其他有关高度变化的信息,所以我真的不应该期望它能够工作,但似乎没有办法在那里获取该信息,甚至不能通过实例化新的CellMeasurerCache.

顺便说一句,如果我改变内的columnWidthcellPositioner.reset,Masonry组件相应更新,果然。

有谁知道我缺少什么才能让它适应高度变化?谢谢!


If your Masonry单元格的大小发生变化,您需要清除缓存中的大小CellMeasurerCache然后确保cellPositioner也知道新尺寸。例如:

// Clear cached measurements since sizes have changed:
cellMeasurerCache.clearAll()

// Let your component know it needs to re-render
this.setState({...}, () => {
  // Assuming you're using the default createCellPositioner()
  // Let it know of any values that may have changed:
  cellPositioner.reset({
    columnCount,
    columnWidth,
    spacer
  })

  // Tell Masonry to discard any cached position data:
  masonryRef.clearCellPositions()
})

您可以看到一个演示Masonry组件上的列高度发生变化RV site https://bvaughn.github.io/react-virtualized/#/components/Masonry只需更改列宽即可。该演示的源代码可用在 GitHub 存储库中 https://github.com/bvaughn/react-virtualized/blob/master/source/Masonry/Masonry.example.js also.

根据你的描述,我不建议使用Masonry。我实际上只是建议使用List与我在本例中的做法类似:http://plnkr.co/edit/zjCwNeRZ7XtmFp1PDBsc?p=preview http://plnkr.co/edit/zjCwNeRZ7XtmFp1PDBsc?p=preview

关键是根据可用宽度动态计算每行的项目数,然后给出List调整后的rowCount:

  const itemsPerRow = Math.floor(width / ITEM_SIZE);
  const rowCount = Math.ceil(ITEMS_COUNT / itemsPerRow);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何告诉 Masonry 组件它的单元格已经改变了高度? 的相关文章

随机推荐

  • Node.js、MongooseError 中的操作 `users.insertOne()` 缓冲在 10000 毫秒后超时

    我正忙于创建一个项目 允许用户输入 电子邮件 和 密码 来注册该网站 当我尝试使用 电子邮件 和 密码 输入用户来进入此网站时 出现以下错误 MongooseError 操作 users insertOne 缓冲超时 10000毫秒 未处理
  • 如何从现有类型定义类型但使用可选键(不使用 Partial)?

    我正在 React Redux 中进行一些状态合并 const newStateSlice state activeData entities action payload localId action payload isModified
  • 是否有 NSLog(@"%s", __PRETTY_FUNCTION__) 的 Swift 替代方案

    在 Objective C 中 您可以使用以下命令记录正在调用的方法 NSLog s PRETTY FUNCTION 通常这在日志记录宏中使用 虽然 Swift 不支持宏 我认为 但我仍然想使用包含被调用函数名称的通用日志语句 这在斯威夫特
  • 标签内的图像和文本

    这是生成的 html asp net 删除了一些客户端识别详细信息 在 Windows XP IE 7 中 单击图像不会执行任何操作 单击文本执行超链接 右键单击任意位置 然后选择open in new window or open也有效
  • Django:如何使用另一个应用程序中的模型

    我有两个应用程序 homepage and blog 我有一个模型Post在应用程序中blog 我可以将此模型用于应用程序blog但不适用于应用程序homepage 我如何在应用程序中使用这个模型homepage 我想在主页中显示我最近的一
  • 立即检测 iOS 方向变化

    我有一个游戏 其中设备的方向会影响游戏的状态 用户必须在横向 纵向和反向横向方向之间快速切换 到目前为止 我一直在通过以下方式注册游戏以获得方向通知 UIDevice currentDevice beginGeneratingDeviceO
  • jQuery 按值选择选项元素

    我有一个由 span 元素包裹的 select 元素 我不允许使用 select id 但可以使用 span id 我正在尝试编写一个 javascript jquery 函数 其中输入是数字 i 它是 select 选项的值之一 该功能会
  • R 在 Leaflet 中使用热图

    我有一个运行 Shiny 的 Linux 机器 我正在尝试根据演示获取传单运行的代码here https rpubs com bhaskarvk leaflet heatmap and here http leaflet github io
  • getRealPath() 返回 false(Laravel 5.2 和图像干预)

    上传图片时 getRealPath 总是返回false image file request gt file image file image file gt getRealPath gt FALSE 这是结果dd image file 另
  • 如何将 char 数组定义为常量?

    这里是 C C 菜鸟 我已经在头文件中定义了它 typedef unsigned char BitChar 9 8 data bytes chars and one width byte char extern BitChar BitFon
  • 使用 XCode 增加堆栈大小

    我在Linux上开发了一个命令行应用程序 需要增加其堆栈 在 Linux 上我只是使用了解决方法 ulimit s unlimited在运行程序之前 在 Mac OS X 上 使用 G 命令行 我添加到编译选项 Wl stack size
  • 使用代码清理时在 Resharper 中禁用/自定义注释(重新)格式化

    有没有办法定义如何使用 Resharper 6 清理 注释 我没有找到解决这个问题的方法 代码清理之前
  • 为什么 IntelliSense 无法将我的查询所选项目识别为元素?

    Problem 我试图弄清楚为什么当我使用以下命令访问 HTML 元素时 VSCode 的 IntelliSense 不会建议元素对象属性 document querySelector 每当我使用document querySelector
  • 重试 Javascript.Promise.reject 有限次数或直到成功

    我有一个函数说myMainFunction从客户端调用 然后调用mypromisified功能 设想 mypromisified函数可能会间歇性失败 我需要延迟 以指数增长 调用此函数 直到成功或达到最大尝试次数 到目前为止我所拥有的 以下
  • icmp 端口不可达错误消息

    我正在将 UDP 数据包从一台 PC 发送到另一台 PC 我正在使用 Wire Shark 观看整个活动 我注意到有一段时间数据包从一个系统到另一个系统的传输很顺利 然后突然间ICMP有错误的数据包 port unreachable 开始出
  • Bash 脚本中的这一行是如何工作的?

    我试图弄清楚顶部的某一行代码是如何BASH 手册页选项卡补全脚本 https github com scop bash completion blob 52315ef2ceb3f8e6b7fe45a09f8df24b73394da4 com
  • 是否可以通过 GitHub 的 Web 界面恢复提交

    我正在 Chromebook 上教授 HTML 课程 我们使用 GitHub 进行修订控制 我想向我的学生展示如何恢复提交 由于我们在 Chromebook 上没有 shell 访问权限 因此我希望通过 GitHub 网站找到一种在线执行此
  • Laravel 5.2 - pluck() 方法返回数组

    我正在尝试升级我的项目 L5 1 gt L5 2 在升级指南 http laravel com docs 5 2 upgrade upgrade 5 2 0有一件事我不清楚 The listsCollection 上的方法 查询生成器和 E
  • 如何使用 datetime.time 绘图

    我有 HH MM SS 格式的时间戳列表 并希望使用 datetime time 绘制某些值 看来 python 不喜欢我这样做的方式 有人可以帮忙吗 import datetime import matplotlib pyplot as
  • 我如何告诉 Masonry 组件它的单元格已经改变了高度?

    我有一个反应组件 它以网格模式显示一维项目列表 每个项目都具有相同的宽度和高度 并且它们位于三列内 可能有很多这样的东西 所以我决定使用 Masonry 组件来尝试一下 React virtualized 该组件似乎是专门为这个用例而编写的