将内联样式更改为样式组件

时间:2019-08-21 11:51:39

标签: javascript reactjs styled-components

我有此代码:

import React, {useState} from 'react';
import PropTypes from 'prop-types';
import styled from "styled-components";
import ArrowTemplate from "./ArrowTemplate";

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 AccordionTitle = styled.p`
    font-family: "Open Sans", sans-serif;
    font-weight: 600;
    font-size: 14px;
`;

const AccordionContent = styled.div`
    background-color: red;
    overflow: hidden;
    transition: 0.6s;
`;

const AccordionText = styled.div`
    font-family: "Open Sans", sans-serif;
    font-weight: 400;
    font-size: 14px;
    padding: 18px;
`;

const AccordionSection = styled.div`
    display: flex;
    flex-direction: column;
`;

Accordion.propTypes = {
    title: PropTypes.string.isRequired,
    content: PropTypes.node.isRequired,
    id: PropTypes.string.isRequired,
};

function Accordion(props) {
    const [isAccordionExpanded, setIsAccordionExpanded] = useState(false);
    const toggleAccordion = () => {
        setIsAccordionExpanded(!isAccordionExpanded);
    };
    return (
        <AccordionSection>
            <AccordionBtn onClick={toggleAccordion}>
                <AccordionTitle>
                    {props.title}
                </AccordionTitle>
                <ArrowTemplate
                    color={'black'}
                    direction={isAccordionExpanded === true ? 'up' : 'down'}
                    onClick={toggleAccordion}
                />
            </AccordionBtn>
            <AccordionContent
                style={{height: isAccordionExpanded === true ? "100px" : "0"}}
                >
                <AccordionText>
                    {props.content}
                </AccordionText>
            </AccordionContent>
        </AccordionSection>
    );
}

export default Accordion;

此代码的作用是扩展单击时的手风琴。简单可爱。但是现在,我想移动这个高度:

<AccordionContent
    style={{height: isAccordionExpanded === true ? "100px" : "0"}}
>

此处:

const AccordionContent = styled.div`
        background-color: red;
        overflow: hidden;
        transition: 0.6s;
    `;

问题是我需要使用状态,如果我在函数中声明了状态,它将被重新渲染,并且不运行动画。如何将状态传递给样式化组件?

1 个答案:

答案 0 :(得分:1)

您可以直接将isAccordionExpanded传递给样式化的组件。从此更改样式:

const AccordionContent = styled.div`
    background-color: red;
    overflow: hidden;
    transition: 0.6s;
`;

包括此

height: ${({ isAccordionExpanded }) => (isAccordionExpanded ? "100px" : "0"};

在React中制作动画的另一种方法是使用React Transition Group,非常好