금융프로젝트

[react][strokeDasharray][strokeDashoffset]도넛차트

h-yujin 2022. 11. 7. 16:10

strokeDasharray

<circle
              cx="110"
              cy="110"
              r="90"
              fill="none"
              stroke="yellow"
              strokeWidth="40"
              strokeDasharray={[30,5]}
            />

setDasharray에는 배열이 들어간다.

첫번째 요소에는 원의 길이,

두번째 요소에는 비어있는 길이이다.

strokeDashoffset

setDashoffset에는 원이 시작되는 위치를 지정한다.

연두색이 시작되는 부분은 전체길이-빨간길이이다.

도넛차트

  • 데이터 불러오기
const [inout,setInout] = useState(0.25);
const [deposit,setDeposit] = useState(0.25);
const [saving,setSaving] = useState(0.25);
const [ensurance,setEnsurance] = useState(0.25);
useEffect(()=>{
    fetch("<http://localhost:9090/bank/myGoods>").then(res=>res.json()).then(
        res=>{
                let length = res.length;
                let inoutLength = 0;
                let deLength = 0;
                let saLength = 0;
                let enLength = 0;
                res.forEach(r=>{
                  if(r.typeId==110){
                    inoutLength++;
                  }else if(r.typeId==220){
                    deLength++;
                  }else if(r.typeId==330){
                    saLength++;
                  }else{
                    enLength++;
                  }
                });
                setTimeout(() => {
                  setInout(inoutLength/length);
                setDeposit(deLength/length);
                setSaving(saLength/length);
                setEnsurance(enLength/length);
                }, 1000);
                
                
            }
        );
    })

상태변수의 초기값은 0.25이다.

setTimeout을 이용해 1초 뒤에 상태변수를 변경해준다.

const Circle = ()=>{
        return<div>
        <div style={{ width: '10vw', height: '10vw' }}>
          <svg viewBox="0 0 250 250">
            <circle 
                cx="110"
                cy="110" 
                r="90" 
                fill="none" 
                stroke="beige" 
                strokeWidth="40" 
                strokeDasharray={[2*Math.PI*90*inout,2*Math.PI*90*(1-inout)]}
                strokeDashoffset={2*Math.PI*90*0}
                />
            <circle
              cx="110"
              cy="110"
              r="90"
              fill="none"
              stroke="green"
              strokeWidth="40"
              strokeDasharray={[2*Math.PI*90*deposit,2*Math.PI*90*(1-deposit)]}
                strokeDashoffset={2*Math.PI*90*(1-inout)}
            />
             <circle
              cx="110"
              cy="110"
              r="90"
              fill="none"
              stroke="yellow"
              strokeWidth="40"
              strokeDasharray={[2*Math.PI*90*saving,2*Math.PI*90*(1-saving)]}
                strokeDashoffset={2*Math.PI*90*(1-inout-deposit)}
            /> <circle
            cx="110"
            cy="110"
            r="90"
            fill="none"
            stroke="red"
            strokeWidth="40"
            strokeDasharray={[2*Math.PI*90*ensurance,2*Math.PI*90*(1-ensurance)]}
            strokeDashoffset={2*Math.PI*90*(1-inout-deposit-saving)}
          />
          </svg>
        </div>
      </div>;
    }
    return(
        <Box><Circle></Circle>
        
        </Box>
    );

완성