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

标签 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;

此代码的作用是在单击时扩展 Accordion 。很简单。但是现在,我想移动这个高度:

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

这里:

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

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

最佳答案

您可以直接将 isAccordionExpanded 传递给样式组件。改变你的风格:

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

包括这个

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

在 React 中制作动画的另一种方法是使用 React Transition Group , 不错

关于javascript - 将内联样式更改为样式组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57591008/

相关文章:

javascript - 如何使用变量设置样式化 div 的背景颜色?

javascript - Angular UI 路由器 - 具有命名模板最佳实践的抽象状态

javascript - 将元素属性 props 的大对象传递给组件

javascript - 在预渲染的 Preact CLI 构建中包含样式

javascript - react / typescript : How to get json file data

reactjs - 使用 react-moment 转换日期

reactjs - 如何从React Typescript的整个项目中删除未使用的导入/声明?

javascript - 在条件内调用 JQuery 函数

javascript - 为什么 Meteorjs 上引导面板的位置是随机的?

javascript - 从 JSON 数据替换 HTML 标签中的商品价格