React - 单个组件的动画安装和卸载

2024-03-10

这么简单的事情应该很容易完成,但我却对它的复杂程度感到抓狂。

我想做的就是为 React 组件的安装和卸载设置动画,仅此而已。以下是我迄今为止尝试过的方法以及每个解决方案不起作用的原因:

  1. ReactCSSTransitionGroup- 我根本没有使用 CSS 类,它都是 JS 样式,所以这不起作用。
  2. ReactTransitionGroup- 这个较低级别的 API 很棒,但它要求您在动画完成时使用回调,因此仅使用 CSS 过渡在这里不起作用。动画库总是有的,这就引出了下一点:
  3. GreenSock - 在我看来,许可对于商业用途来说过于严格。
  4. React Motion - 这看起来很棒,但是TransitionMotion对于我的需要来说非常混乱且过于复杂。
  5. 当然,我可以像 Material UI 那样做一些欺骗,其中元素被渲染但保持隐藏(left: -10000px)但我宁愿不走那条路。我认为它很hacky,而且我want我的组件要卸载,这样它们就会清理干净并且不会弄乱 DOM。

我想要的东西是easy来实施。在安装时,为一组样式设置动画;卸载时,为相同(或另一组)样式设置动画。完毕。它还必须在多个平台上具有高性能。

我在这里碰壁了。如果我遗漏了什么并且有一个简单的方法可以做到这一点,请告诉我。


这有点长,但我已经使用了所有本机事件和方法来实现此动画。不ReactCSSTransitionGroup, ReactTransitionGroup 等等。

我用过的东西

  • React 生命周期方法
  • onTransitionEnd event

这是如何运作的

  • 根据传递的 mount 属性安装元素(mounted) 并使用默认样式(opacity: 0)
  • 挂载或更新后,使用componentDidMount (componentWillReceiveProps进一步更新)更改样式(opacity: 1)并设置超时(以使其异步)。
  • 卸载时,向组件传递一个 prop 来标识卸载,再次更改样式(opacity: 0), onTransitionEnd,从 DOM 中删除卸载元素。

继续循环。

看看代码你就明白了。如果需要任何澄清,请发表评论。

class App extends React.Component{
  constructor(props) {
    super(props)
    this.transitionEnd = this.transitionEnd.bind(this)
    this.mountStyle = this.mountStyle.bind(this)
    this.unMountStyle = this.unMountStyle.bind(this)
    this.state ={ //base css
      show: true,
      style :{
        fontSize: 60,
        opacity: 0,
        transition: 'all 2s ease',
      }
    }
  }
  
  componentWillReceiveProps(newProps) { // check for the mounted props
    if(!newProps.mounted)
      return this.unMountStyle() // call outro animation when mounted prop is false
    this.setState({ // remount the node when the mounted prop is true
      show: true
    })
    setTimeout(this.mountStyle, 10) // call the into animation
  }
  
  unMountStyle() { // css for unmount animation
    this.setState({
      style: {
        fontSize: 60,
        opacity: 0,
        transition: 'all 1s ease',
      }
    })
  }
  
  mountStyle() { // css for mount animation
    this.setState({
      style: {
        fontSize: 60,
        opacity: 1,
        transition: 'all 1s ease',
      }
    })
  }
  
  componentDidMount(){
    setTimeout(this.mountStyle, 10) // call the into animation
  }
  
  transitionEnd(){
    if(!this.props.mounted){ // remove the node on transition end when the mounted prop is false
      this.setState({
        show: false
      })
    }
  }
  
  render() {
    return this.state.show && <h1 style={this.state.style} onTransitionEnd={this.transitionEnd}>Hello</h1> 
  }
}

class Parent extends React.Component{
  constructor(props){
    super(props)
    this.buttonClick = this.buttonClick.bind(this)
    this.state = {
      showChild: true,
    }
  }
  buttonClick(){
    this.setState({
      showChild: !this.state.showChild
    })
  }
  render(){
    return <div>
        <App onTransitionEnd={this.transitionEnd} mounted={this.state.showChild}/>
        <button onClick={this.buttonClick}>{this.state.showChild ? 'Unmount': 'Mount'}</button>
      </div>
  }
}

ReactDOM.render(<Parent />, document.getElementById('app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.2/react-with-addons.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React - 单个组件的动画安装和卸载 的相关文章

随机推荐

  • 升级到 Xcode 8.2.1 后,iOS 模拟器无法在代理后面工作?

    我正在需要身份验证的代理环境中工作 由于我已升级到 Xcode 8 2 1 模拟器停止工作 但它在 Xcode 8 1 和 7 3 上运行良好对此有任何帮助吗 这是我收到的错误 PAC 获取失败并出现错误 NSURLErrorDomain
  • 在shell脚本中打印C程序的输出

    我有一个程序 我必须使用一个 c 程序将开尔文转换为远 反之亦然 我需要输出方面的帮助 它应该从我放入 file 和用户的 choice 中的数据文件中读取 并在 c 程序文件 farh kel 中运行它 while read val do
  • 禁用某些图像的缓存

    我使用 PHP 库生成一些图像 有时浏览器不会加载新生成的文件 如何仅对我动态创建的图像禁用缓存 注意 随着时间的推移 我必须对创建的图像使用相同的名称 解决这个问题的一个常见而简单的解决方案是向每个动态图像请求添加一个随机生成的查询字符串
  • 头文件中的 const 变量和静态初始化惨败

    在阅读了很多有关静态变量初始化的问题后 我仍然不确定这如何适用于const命名空间级别的变量 我有以下代码header file config h由构建脚本生成 static const std string path1 xyz abc s
  • ExtJS:将 html 表单转换为 ExtJS

    我希望能够将 html 表单转换为 ExtJs 表单 我读到您必须使用 applyTo 做一些事情 但不太确定该怎么做 我希望有人能为我提供一些帮助 Cheers 如果你想将表单中的每个元素转换为 ExtJS 元素 有人在煎茶论坛 http
  • QMediaPlayer 未定义引用链接器错误

    我安装了 Qt5 由于 Qt5 不支持 Phonon 我被迫使用其他东西 所以我决定使用 QtMultimedia 轮廓 QT core gui CONFIG mobility MOBILITY multimedia cpp代码 inclu
  • 用于重新加载部署的 WildFly CLI 命令

    我可以重新启动运行以下 Java 代码的整个 WildFly 服务器 但我只想重新加载名为 test war 的部署 怎么可能呢 public void flushall throws IOException Runtime getRunt
  • Angular FormArray 内容顺序

    Hya 我有以下设置 App Component Ts 内容 carForm FormGroup constructor private fb FormBuilder this carForm this fb group name type
  • 未配置 SQL 方言 (Phpstorm)

    我正在研究 Google oauthorization2 并遇到问题 未配置 SQL 方言 这就是为什么我的查询没有执行并且数据将进入表的原因 我在下面列出了我遇到问题的两个查询 工具 PhpStorm 8 MySQL 本地主机 user
  • 签署 mac 安装程序 (pkgmaker)

    我的安装程序是使用 PackageMaker 创建的 之后 我使用以下命令对安装程序进行了代码签名 产品签名 签名 Blah Inc 安装 mpkg CS 安装 mpkg 这似乎工作得很好 我可以看到它是使用以下命令签名的 pkgutil
  • 在Linux中,有没有办法找出哪个PCI卡插入哪个PCI插槽?

    在Linux中 有没有办法找出哪个PCI卡插入哪个PCI插槽 sys bus pci devices 包含许多不是卡的设备 桥 CPU 通道等 我无法在设备目录中找到有关插槽卡映射的任何信息 您可以使用 dmidecode t slot 查
  • 事件处理顺序

    Javascript jQuery 事件处理 如果事件 例如 点击 为父元素绑定了一个函数 为子 DOM 元素绑定了另一个处理函数 那么会调用哪一个函数 如果全部都被调用 那么按什么顺序调用 事件在 DOM 树中 向上 冒泡 因此如果您有某
  • 如何使用 ng-repeat track by $index 创建的量角器选择元素?

    我需要选择 ng repeat 创建的文本框并使用 sendKeys 函数发送一些值 但我不确定选择文本框的方法 请建议一种方法来完成此任务 或者我应该使用 css 选择器来代替 div class qst input hld ng sco
  • 使用 fopen 时出现段错误

    我从以下代码的第二行收到段错误 FILE output NULL output fopen output2 txt w 我不认为这是某种损坏的内存错误 因为当我将 w 更改为 r 时 它运行时没有段错误 另外 它似乎是在出现段错误之前创建该
  • ng-show/ng-if 不会立即更新 dom 高度

    我有一个很长的 div 它是由 ng hide 隐藏 显示的 这是一个基于离子的示例demo http codepen io leonz full bEqbKM 单击该按钮可以显示或隐藏 longDiv 如果您尝试在隐藏或显示页面后立即滚动
  • 如何从 pandas groupby 对象创建多个数据框

    我正在尝试在多索引数据帧 df 上使用 groupby 创建新的数据帧 级别 0 是字符串标识符 级别 1 是日期时间索引 最终我想确定每个 vsl 与每个 DIV 和 DIS 关联的总时间 这是 df 的片段 DIV DIS vsl Be
  • 派生类中的 sizeof(*this) 和 decltype(*this)

    假设有类 struct A int a virtual size t GetMemoryUsage const return sizeof this struct B public A int b 而且可能还有更深层次的传承 我想要的是有一
  • 下面的 for 循环语法在 C 中意味着什么?

    我遇到了这个语法 不知道它意味着什么 for do stuff like read from a handle etc 我仍然处于 C 语言的学习曲线上 所以如果你愿意的话 如果这是一个蹩脚的问题 请投票否决 这是一个无限循环 与 一样wh
  • Jersey:禁用默认 JSON 提供程序

    我正在使用 Jersey 2 17 JSON 和自动功能发现 我有我的自定义 JSON Provider 扩展JacksonJsonProvider 它的注释是 Provider并自动注册 与附带的默认注册相同
  • React - 单个组件的动画安装和卸载

    这么简单的事情应该很容易完成 但我却对它的复杂程度感到抓狂 我想做的就是为 React 组件的安装和卸载设置动画 仅此而已 以下是我迄今为止尝试过的方法以及每个解决方案不起作用的原因 ReactCSSTransitionGroup 我根本没