javascript - 如何使用 `ReactCSSTransitionGroup` 创建折叠/扩展列表

标签 javascript html css reactjs

我正在使用 ReactJS 创建带有动画的折叠/扩展列表。您可以从 https://codepen.io/zhaoyi0113/pen/qjRKXE 查看代码.当用户单击顶部的 Extend 按钮时,列表应在 1 秒内显示,同时 footer 应移至底部。我当前的代码不能很好地工作。首先,列表项没有以正确的动画样式显示。似乎所有元素都是同时渲染的。其次,单击 extend 按钮后,页脚组件立即移动到底部。如何使用 reactjs 动画正确实现列表?

看笔React Animation Demo通过乔伊(@zhaoyi0113)在CodePen .

下面是我使用的 reactjs 代码:

const ReactCSSTransitionGroup = React.addons.CSSTransitionGroup;


const Container = React.createClass({

    getInitialState() {
        return {
            items:  ['Click', 'To', 'Remove', 'An', 'Item'],
            extend: false
        };
    },

    render() {

        return (
            <div className="container">
                <div className="animation-container">
                <div onClick={() => this.expendItems()} className="item">
                    {this.state.extend?'Collapse':'Extend'}
                </div>
                    <ReactCSSTransitionGroup transitionName="example">
                        {this.renderItems()}
                    </ReactCSSTransitionGroup>

                    <div>Footer</div>
                </div>
            </div>
        );
    },

    renderItems() {
        const items = this.state.extend? this.state.items: [];

        console.log('render items ', items);
        return items.map((item, i) => {
            return (
                <div key={item} className="item">
                    {item}
                </div>
            );  
        }); 
    },

    expendItems() {
        this.setState({extend: !this.state.extend});
    }

});

ReactDOM.render(<Container/>, document.body);

最佳答案

通过 ReactCSSTransitionGroup 的方式,所有组件同时呈现。

此外,您的初始翻译值错误,您希望从负值过渡到 0,这样按钮看起来就像是从展开按钮下方滑落

body {
    font-family: 'Open Sans', sans-sarif;
    padding: 25px;
    background-color: $color6;
    text-align: center;
}
.container {
    text-align: center;
    vertical-align: middle;
    overflow: hidden;
}
.animation-container {
    display: inline-block;
}
.item {
    background-color: $color3;
    width: 400px;
    text-align: center;
    padding: 10px 5px;
    margin-top: 10px;
    border-radius: 8px;
    font-weight: 600;
    color: mix(black, $color3, 60%);
    position: relative;

    &:hover {
        cursor: pointer;
    }
}
div > .item {
    margin-top: 0px;
}
.example-enter {
    top: -240px;
}
.example-enter.example-enter-active {
    top: 0px;
    transition: top 1s ease;
}
.example-leave {
    top: 0px;
    transition: top 1s ease;
}
.example-leave.example-leave-active {
    top: -240px;
}

https://codepen.io/anon/pen/Gvrgqm

关于javascript - 如何使用 `ReactCSSTransitionGroup` 创建折叠/扩展列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44610999/

相关文章:

html - 如何在 CSS 和 HTML 中添加颜色过渡,就像在 Instagram 应用程序的登录区域中那样?

javascript - 是否可以在 js &lt;script&gt; 请求上设置自定义 header ?

JavaScript 未触发 Controller 中的方法

html - 可滚动表格,使用 CSS、Joomla 锁定第一列

html - 为什么两个边框框 50% 的 div 不是并排的?

css - 反转图像颜色和背景颜色

html - CSS 2.1 兼容的 HTML 到 Microsoft Word 的转换?

javascript - function foo({ defaultValue = {} } = {}) 中的语法是什么意思?

javascript - 为什么我的 JSON 文件包含 [object Object]?

javascript - SimpleLightBox 不会运行