본문 바로가기

Education

[개발스터디] week4: React Quiz

반응형

2021-07-06 Week 4

 스터디 내용

  • React Quiz 1
  • React Quiz 2

 

1. React Quiz

1.1 Quiz 1

Q. plus, minus button

다음 기본 코드로 해당 사이트처럼 만들기

  • ❗ 조건
    • 작성된 기본 코드를 삭제하지 않고 오로지 코드를 추가하여 완성해야 한다.
/* eslint-disable react/prefer-stateless-function */
/* eslint-disable object-curly-newline */
/* eslint-disable arrow-body-style */
import React from 'react';

const buttonStyle = {
  fontSize: '40px',
  width: '60px',
  height: '60px',
  backgroundColor: 'black',
  color: 'white',
  borderRadius: '12px',
};

const resultStyle = {
  fontSize: '20px',
  margin: '0px 32px',
};

const pageStyle = {
  width: '100vw',
  height: '100vh',
  display: 'flex',
  justifyContent: 'center',
  alignItems: 'center',
};

const PlusButton = () => {
  return <button type="button" style={buttonStyle}>+</button>;
};

const MinusButton = () => {
  return <button type="button" style={buttonStyle}>-</button>;
};

const Result = () => {
  return (
    <div style={resultStyle}>0</div>
  );
};

class Page extends React.Component {
  render() {
    return (
      <div style={pageStyle}>
        <MinusButton />
        <Result />
        <PlusButton />
      </div>
    );
  }
}

export default Page;

 

Sol

/* eslint-disable react/prefer-stateless-function */
/* eslint-disable object-curly-newline */
/* eslint-disable arrow-body-style */
import React from 'react';

const buttonStyle = {
  fontSize: '40px',
  width: '60px',
  height: '60px',
  backgroundColor: 'black',
  color: 'white',
  borderRadius: '12px',
};

const resultStyle = {
  fontSize: '20px',
  margin: '0px 32px',
};

const pageStyle = {
  width: '100vw',
  height: '100vh',
  display: 'flex',
  justifyContent: 'center',
  alignItems: 'center',
};

const PlusButton = (props) => {
  return <button type="button" style={buttonStyle} onClick={() => props.onClick(1)}>+</button>;
};

const MinusButton = (props) => {
  return <button type="button" style={buttonStyle} onClick={() => props.onClick(-1)}>-</button>;
};

const Result = (props) => {
  return (
    <div style={resultStyle}>{props.number}</div>
  );
};

class Page extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            number: 0
        };
    }

    handleClick = (i) => {
        this.setState({
            number: this.state.number + i
        });
    }

    render() {
        return (
        <div style={pageStyle}>
            <MinusButton onClick={this.handleClick}/>
            <Result number={this.state.number}/>
            <PlusButton onClick={this.handleClick} />
        </div>
        );
    }
}

export default Page;

 

result

clicked plus button
clicked minus button

 

1.2 Quiz 2

Q. 가위 바위 보

다음 코드로 가위 바위 보 게임 웹 만들기

  • ❗ 조건
    • 작성된 기본 코드를 삭제하지 않고 오로지 코드를 추가하여 완성해야 한다.
    • 컴퓨터가 내는 값은 랜덤이다.
    • 사용자가 '가위','바위','보' 중 하나를 누르자마자 컴퓨터가 내는 값이 결정되고, 승리여부가 결정된다.
import React from 'react';

const pageStyle = {
  width: '100vw',
  height: '100vh',
  display: 'flex',
  flexDirection: 'column',
  alignItems: 'center',
  justifyContent: 'space-between',
};

const selectorWrapperStyle = {
  display: 'flex',
  flexDirection: 'row',
  alignItems: 'center',
  justifyContent: 'space-around',
}

const selectorStyle = {
  width: '128px',
  height: '128px',
  borderRadius: '64px',
  display: 'flex',
  alignItems: 'center',
  justifyContent: 'center',
  border: '1px solid #000',
}

const row = {
  display: 'flex',
  flexDirection: 'row',
  alignItems: 'center',
}

const column = {
  display: 'flex',
  flexDirection: 'column',
  alignItems: 'center',
}

const labelStyle = {
  fontSize: '24px',
  fontWeight: 'bold',
  marginBottom: '16px',
}

const print = () => {
  const output = Math.round((Math.random() * 10) + 1) % 3;
  if (output === 0) return '가위';
  else if (output === 1) return '바위';
  else return '보';
}

const ComputerSection = () => {
  return (
    <div style={row}>
      <div style={selectorStyle}>가위</div>
    </div>
  )
}

const ResultSection = () => {
  return (
    <div>
      컴퓨터 승
    </div>
  )
}

const UserSection = () => {
  return (
    <div>
      <Selector />
    </div>
  )
}

const Selector = () => {
  return (
    <div style={column}>
      <div style={labelStyle}>선택하세요</div>
      <div style={selectorWrapperStyle}>
        <div style={selectorStyle}>가위</div>
        <div style={selectorStyle}>바위</div>
        <div style={selectorStyle}>보</div>
      </div>
    </div>

  )
}

class Home extends React.Component {
  render() {
    return (
      <div style={pageStyle}>
        <ComputerSection />
        <ResultSection />
        <UserSection />
      </div>
    )
  }
}

export default Home;

 

Sol

import React from 'react';

const pageStyle = {
  width: '100vw',
  height: '100vh',
  display: 'flex',
  flexDirection: 'column',
  alignItems: 'center',
  justifyContent: 'space-between',
};

const selectorWrapperStyle = {
  display: 'flex',
  flexDirection: 'row',
  alignItems: 'center',
  justifyContent: 'space-around',
}

const selectorStyle = {
  width: '128px',
  height: '128px',
  borderRadius: '64px',
  display: 'flex',
  alignItems: 'center',
  justifyContent: 'center',
  border: '1px solid #000',
}

const row = {
  display: 'flex',
  flexDirection: 'row',
  alignItems: 'center',
}

const column = {
  display: 'flex',
  flexDirection: 'column',
  alignItems: 'center',
}

const labelStyle = {
  fontSize: '24px',
  fontWeight: 'bold',
  marginBottom: '16px',
}

const print = () => {
  const output = Math.round((Math.random() * 10) + 1) % 3;
  if (output === 0) return '가위';
  else if (output === 1) return '바위';
  else return '보';
}

const ComputerSection = (props) => {
  return (
    <div style={row}>
      <div style={selectorStyle}>{props.computer}</div>
    </div>
  )
}

const ResultSection = (props) => {
  return (
    <div>
      {props.result}
    </div>
  )
}

const UserSection = (props) => {
  return (
    <div>
      <Selector onClick={props.onClick}/>
    </div>
  )
}

const Selector = (props) => {
  return (
    <div style={column}>
      <div style={labelStyle}>선택하세요</div>
      <div style={selectorWrapperStyle}>
        <div style={selectorStyle} onClick={() => props.onClick('가위')}>가위</div>
        <div style={selectorStyle} onClick={() => props.onClick('바위')}>바위</div>
        <div style={selectorStyle} onClick={() => props.onClick('보')}>보</div>
      </div>
    </div>
  )
}

class Home extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            result: null,
            computer: null
        }
    }

    handleClick = (i) => {
        const comp = print();

        let result;
        const win = '컴퓨터 패';
        const lose = '컴퓨터 승';
        const draw = '비김';

        console.log('comp: ', comp, ', user: ', i);
        if (i === '가위') {
            if (comp === '가위') {
                result = draw;
            } else if (comp === '바위') {
                result = lose;
            } else {
                result = win;
            }
        } else if (i === '바위') {
            if (comp === '가위') {
                result = win;
            } else if(comp === '바위') {
                result = draw;
            } else {
                result = lose;
            }
        } else { //보
            if(comp === '가위'){
                result = lose;
            } else if(comp === '바위') {
                result = win;
            } else {
                result = draw;
            }
        }
        this.setState({
            result: result,
            computer: comp
        })
    } 

    render() {
        return (
        <div style={pageStyle}>
            <ComputerSection computer={this.state.computer}/>
            <ResultSection result={this.state.result}/>
            <UserSection user={this.state.user} onClick={this.handleClick}/>
        </div>
        )
    }
}

export default Home;

 

result

(컴퓨터)보 / (사용자)보 => (결과)비김

 

(컴퓨터)바위 / (사용자)보 => (결과)컴퓨터 패

 

(컴퓨터)가위 / (사용자)보 => (결과)컴퓨터 승

 

 

2. HomeWork

2.1 immutable

 

 

 

2.2 My Posts 웹 만들기

problem.1
메모를 삭제하면 아래에 놓인 메모에 closePost 효과가 적용된다. 그래서 둘 다 사라지는 것처럼 보인다.

 

 

 

(+) 배열, 객체 데이터 유실 방지 [...data] {...data}

const base = {
   a: 1,
   b:3,
};
// cas 1
const prev = {
   a: 1,
   b:3,
   c: 2,
};
// cas 2
const prev = {
   ...base,
   c: 2,
}

목적은 base에 담긴 데이터를 prev에 복사하는 것이다.

case1처럼 변수에 값을 그냥 넣어서 지정하는 경우에는 데이터가 유실될 수도 있다. 왜냐하면 값을 복사하여 'base' 에 넣는 것이 아니라, 메모리의 주소값을 가져오는 것이기 때문이다.

따라서 case2처럼 . . . 을 사용하여 작성해야 한다. 이렇게 작성하면 base에 담긴 데이터가 복사되어 prev에 따로 저장된다. 

이러한 방식은 배열과 객체에 사용될 수 있고, case2처럼 값을 덧붙일 수도 있다. 아예 똑같은 데이터로 복사하고 싶다면 다음과 같이 작성한다.

const prev = [...base] // base가 배열인 경우
const prev = {...base} // base가 객체인 경우

 

 

반응형