javascript - 在带有渲染的组件上使用动画

标签 javascript reactjs scope styled-components

我想使用过渡来运行动画。问题是我正在使用状态来控制它。现在,组件是在 render 方法中创建的。但每次状态改变时,组件都会重新渲染。那么我如何创建较小的组件,使它们在范围内,并且我可以使用状态来为它们设置动画?

import React, {Component, Fragment} from 'react';
import ArrowTemplate from "./ArrowTemplate";
import styled from 'styled-components';

class Accordion extends Component {
    constructor(props) {
        super(props);
        this.state = {isAccordionExpanded: false};
        this.toggleAccordion = this.toggleAccordion.bind(this);
    }

    toggleAccordion() {
        this.setState({isAccordionExpanded: !this.state.isAccordionExpanded})
    }

    render() {
        const {isAccordionExpanded} = this.state;
        const AccordionSection = styled.div`
            display: flex;
            flex-direction: column;
`;
        const AccordionBtn = styled.button`
            background-color: #eee;
            color: #444;
            cursor: pointer;
            padding: 18px;
            display: flex;
            align-items: center;
            border: none;
            outline: none;
            transition: background-color 0.6s ease;
            :hover,
            :focus,
            :active {
              background-color: #ccc;
            }
`;
        const P = styled.p`
            font-family: "Open Sans", sans-serif;
            font-weight: 600;
            font-size: 14px;
`;
        const AccordionContent = styled.div`
            background-color: white;
            ${isAccordionExpanded === true ? `height: 100px` : `height: 0`};
            overflow: hidden;
            transition: max-height 0.6s ease;
`;
        const AccordionText = styled.div`
            font-family: "Open Sans", sans-serif;
            font-weight: 400;
            font-size: 14px;
            padding: 18px;
`;
        return (
            <AccordionSection>
                <AccordionBtn
                    onClick={this.toggleAccordion}
                >
                    <P>
                        <ArrowTemplate
                            color={"black"}
                            direction={"down"}
                            aria={"aria-roles: 'button'"}
                            onClick={this.toggleAccordion}
                        />
                    </P>
                </AccordionBtn>
                <AccordionContent>
                    <AccordionText>
                        test
                    </AccordionText>
                </AccordionContent>
            </AccordionSection>
        )
    }
}

export default Accordion;

箭头模板

import React from "react";
import BlackDownArrowSVG from './svgs/black-down-arrow.svg';
import WhiteDownArrowSVG from './svgs/white-down-arrow.svg';
import styled from 'styled-components';
import PropTypes from 'prop-types';

ArrowTemplate.propTypes = {
    color: PropTypes.string.isRequired,
    direction: PropTypes.string.isRequired,
    styles: PropTypes.string,
    aria: PropTypes.string.isRequired,
    onClick: PropTypes.func.isRequired,
};

function ArrowTemplate(props) {
    const {color, direction, styles, aria, onClick} = props;
    const StyledArrowTemplate = styled.img.attrs({
        src: color.toLowerCase() === "black" ? BlackDownArrowSVG : WhiteDownArrowSVG,
        aria,
    })`
            ${direction.toLowerCase() === "up" ? "transform: rotate(180deg);" : ""}
            ${styles}
    `;
    return <StyledArrowTemplate onClick={onClick}/>;
}

export default ArrowTemplate;

最佳答案

尝试使用

direction={this.state.isAccordionExpanded ? 'up' : 'down'}

对于<ArrowTemplate />

关于javascript - 在带有渲染的组件上使用动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57588816/

相关文章:

javascript - 检查数组 "includes"是否是 Javascript 中的项目

javascript - Reactjs - onClick 在第一次点击后工作

javascript - React 导入中的点表示法

c - 在 C 的当前范围内不能访问的变量

C++ 为什么我无法使用在声明它的类之外全局声明的枚举?

密码程序 — 错误 : unused variable

javascript - 使用 JQuery 为 HTML 表格单元格分配值

javascript - 极坐标图、Highcharts 中的类别名称和图表未对齐

javascript - Ember Controller : computed property not recalculating off injected property

reactjs - 为什么 ComponentDidMount 中的异步工作会导致导航时出现视觉滞后,除非等待简单的超时?