【React】List使用QueueAnim动画效果不生效——QueueAnim与函数组件兼容性问题

版本

  • "antd-mobile": "^5.37.1",
  • "rc-queue-anim": "^2.0.0",

问题

在使用 QueueAnim 时,如果动画的子元素是 Ant Design Mobile 中的组件(如 List.Item),可能会遇到动画不生效的问题,并且会看到类似以下警告:

复制代码
Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

原因

Ant Design Mobile 中的组件(如 List.Item)在新版v5中是函数组件,而 QueueAnim 使用 ref 来控制动画,但函数组件不能直接使用 ref,导致动画无法正常执行。


解决方法

  1. 使用 div 包裹组件

    因为 QueueAnim 需要将 key 放在最外层元素上,而且 div 能正常支持 ref,所以可以使用 div 包裹需要动画的组件(例如 List.Item),并将 key 放在 div 上。

  2. 代码更新

    你只需要在 div 上设置 key,并且确保 QueueAnim 的动画应用在 div 上,而不是直接应用在 List.Item 上。

代码示例

jsx 复制代码
import React from 'react';
import { List } from 'antd-mobile';
import QueueAnim from 'rc-queue-anim';

function Chat({ msgs }) {
  return (
    <QueueAnim type="left" delay={100}>
      {/* 只在 div 上设置 key,包裹 List.Item */}
      {msgs.map((msg) => (
        <div key={msg._id}>
          <List.Item>
            {msg.content}
          </List.Item>
        </div>
      ))}
    </QueueAnim>
  );
}

export default Chat;

总结

  • 函数组件不支持 ref :新版的 Ant Design Mobile 组件(如 List.Item)是函数组件,它们不能直接使用 ref,导致 QueueAnim 动画效果无法生效。
  • 使用 div 包裹 :通过将 List.Item 组件包裹在 div 元素内,并在 div 上添加 key,可以避免上述问题,并使动画正常工作。
相关推荐
q***38511 天前
TypeScript 与后端开发Node.js
javascript·typescript·node.js
leoufung1 天前
LeetCode 61. 旋转链表(Rotate List)题解与思路详解
leetcode·链表·list
用户47949283569151 天前
别再当 AI 的"人肉定位器"了:一个工具让 React 组件秒定位
前端·aigc·ai编程
Nan_Shu_6141 天前
学习:Sass
javascript·学习·es6
WYiQIU1 天前
面了一次字节前端岗,我才知道何为“造火箭”的极致!
前端·javascript·vue.js·react.js·面试
qq_316837751 天前
uniapp 观察列表每个元素的曝光时间
前端·javascript·uni-app
小夏同学呀1 天前
在 Vue 2 中实现 “点击下载条码 → 打开新窗口预览 → 自动唤起浏览器打印” 的功能
前端·javascript·vue.js
芳草萋萋鹦鹉洲哦1 天前
【vue】导航栏变动后刷新router的几种方法
前端·javascript·vue.js
zero13_小葵司1 天前
JavaScript性能优化系列(八)弱网环境体验优化 - 8.3 数据预加载与缓存:提前缓存关键数据
javascript·缓存·性能优化
1***y1781 天前
Vue项目性能优化案例
前端·vue.js·性能优化