reactjs - 在 React 中对表格行的显示/隐藏进行动画处理

标签 reactjs react-transition-group

我看过ReactTransitionGroup的例子。在这些示例中,我们对待办事项列表的新表行和已删除表行进行动画处理。示例中显示的动画是淡入淡出动画。如何展开/缩小表格行而不是淡入淡出动画?

我的组件代码:

import React, { Component } from 'react';
import './App.css';
import TransitionGroup from 'react-transition-group/TransitionGroup';
import CSSTransition from 'react-transition-group/CSSTransition';

class App extends Component {
  state = { name: '', names: [] };

  handleNameChange(e) {
    this.setState({ name: e.target.value });
  }

  handleSubmit() {
    let { names } = this.state;
    names = names.slice();
    names.push(this.state.name);
    this.setState({ names });
  }

  handleDelete(index) {
    let { names } = this.state;
    names = names.slice();
    names.splice(index, 1);
    this.setState({ names });
  }

  render() {
    return (
      <div className="app">
        <input type="text" placeholder="Enter name" value={this.state.name} onChange={this.handleNameChange.bind(this)} />
        <button onClick={this.handleSubmit.bind(this)}>Submit</button>
        <table border="1" style={{ marginTop: 20 }}>
          <thead>
            <tr>
              <th width="300">Name</th>
              <th width="100">Delete</th>
            </tr>
          </thead>
          <TransitionGroup component="tbody">
            {this.state.names.map((name, index) => (
              <CSSTransition
                key={index}
                timeout={5000}
                classNames="fade"
              >
                <tr>
                  <td>{name}</td>
                  <td>
                    <button onClick={this.handleDelete.bind(this, index)}>Delete</button>
                  </td>
                </tr>
              </CSSTransition>
            ))}
          </TransitionGroup>
        </table>
      </div>
    );
  }
}

export default App;

我的CSS:

.fade-enter {
  max-height: 0;
}

.fade-enter-active {
  max-height: 40px;
  transition: all 5000ms ease-in;
}
.fade-exit {
  max-height: 40px;
}
.fade-exit-active {
  max-height: 0;
  transition: all 5000ms ease-in;
}

它不做任何高度动画!

最佳答案

我得到了 related answer 的帮助.

将每个 td 内容包裹在一个 div 中。

<TransitionGroup component="tbody">
  {this.state.names.map((name, index) => (
    <CSSTransition
      key={index}
      timeout={500}
      classNames="fade"
    >
      <tr>
        <td><div>{name}</div></td>
        <td>
          <div><button onClick={this.handleDelete.bind(this, index)}>Delete</button></div>
        </td>
      </tr>
    </CSSTransition>
  ))}
</TransitionGroup>

使用 CSS Transition 类设置 div 的样式。

.fade-enter div {
  overflow-y: hidden;
  max-height: 0;
}

.fade-enter-active div {
  max-height: 50px;
  transition: all 500ms ease-in;
}
.fade-exit div {
  max-height: 50px;
}
.fade-exit-active div {
  max-height: 0;
  overflow-y: hidden;
  transition: all 500ms ease-in;
}

关于reactjs - 在 React 中对表格行的显示/隐藏进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51011293/

相关文章:

reactjs - React 16 升级..错误: Can't resolve 'react/lib/ReactMount'

javascript - 在 React 中,根据之前和当前的 props,在哪里设置状态?

Reactjs:WAITING动画完成

javascript - 无法使用 CSSTransition Group 创建平滑滚动

javascript - 为什么我在 SVG 上无法读取 null 的属性 'tagName'?

reactjs - 如果可能,如何将 MUI 与 Qwik 框架一起使用?

css - 在两行文本后添加省略号和工具提示 - React

javascript - 输入时动画不起作用(Tailwind、TransitionGroup、Typescript)

ReactJs "Invariant violation..."经典 react 问题