9-4. Progress 컴포넌트 준비하기

WritePost 컴포넌트의 하단부에 위치하는 게이지바는 Progress 라는 컴포넌트입니다. 이 컴포넌트에 기능을 붙여주기 전에, 먼저 게이지가 0부터 100까지 차는것을 구현해보겠습니다.

구현 방식은 생각보다 간단합니다.

엘리먼트의 넓이를 기본적으로는 0% 로 설정하고, 그 다음에 setState 를 통하여 100% 으로 설정을 합니다. 이 때, transition CSS 속성을 통하여 애니메이션 시간을 설정해주면 됩니다.

setState 가 될 때 동시에, setTimeout 을 통해 1초 후 특정 함수가 실행되게 하면 됩니다.

그럼 한번 구현을 해볼까요?

src/components/WritePost/Progress.js

import React, { Component } from 'react';
import styled from 'styled-components';
import oc from 'open-color';

const Wrapper = styled.div`
    background: ${oc.cyan[4]};
    height: 4px;
    position: absolute;
    left: 0px;
    bottom: 0px;
    width: ${props => props.percentage + '%'};
    ${props => props.percentage !== 0 && `transition: all 1s ease-in-out;`}
`;

class Progress extends Component {
    state = {
        percentage: 0
    }

    componentDidMount() {
        this.setState({
            percentage: 100
        });
        setTimeout(() => {
            console.log('done');
        }, 1000);
    }

    render() {
        const { percentage } = this.state;

        return (
            <Wrapper percentage={percentage}/>
        )
    }


}
export default Progress;

styled 컴포넌트에 percentage 라는 props 를 전달하여 이 값에 따라 스타일을 설정하도록 하였습니다.

${props => props.percentage !== 0 && `transition: all 1s ease-in-out;`}

이 코드는, 애니메이션을 설정을 해 주는데, percentage 값이 0 일 때는 애니메이션 효과가 적용되지 않습니다. 따라서, 게이지바가 차오르다가, 나중에 이 값이 0으로 리셋 될때는 1초가 걸리는게 아니라, 애니메이션 효과 없이 0으로 설정됩니다.

그 다음엔 방금 만든 컴포넌트를 WritePost 에서 불러와서 StyledTextarea 하단에 렌더링하세요.

src/components/WritePost/WritePost.js

import Progress from './Progress';

(...)

const WritePost = ({onChange, value}) => (
    <Wrapper>
        <StyledTextarea
            minRows={3} 
            maxRows={10} 
            placeholder={`의식의 흐름대로 당신의 생각을 적어보세요.\n5초이상 아무것도 입력하지 않으면 자동으로 포스팅됩니다.`}
            value={value}
            onChange={onChange}
        />
        <Progress/>
    </Wrapper>
);

export default WritePost;

이렇게 코드를 작성하고 나면 게이지바가 보여질 것 입니다.

새로고침을 해보세요, 게이지가 처음부터 다시 차나요?

results matching ""

    No results matching ""