새싹 프론트엔드

[새싹 프론트엔드] 11/29 (이벤트 핸들링)

sognociel 2022. 11. 29. 12:35

01. 리액트의 이벤트 시스템

이벤트를 사용할 때 주의 사항

  • 이벤트 이름은 카멜 표기법으로 작성
    onClick, onKeyUp 등
  • 이벤트의 값으로 함수 형태를 전달
    실제 자바스크립트 코드를 전달하지 않음
  • DOM 요소에만 이벤트를 설정할 수 있음
    div, button, input, form 등에만 이벤트 설정 가능하며 직접 만든 컴포넌트에는 이벤트 설정 불가능

 

자주 쓰이는 이벤트

onClick, onSubmit, onMouseMove, onMouseOver, onMouseOut, onKeyDown, onKeyPress

cf.) preventDefault | 어떤 태그의 기본 동작을 막음

function App() {
  function linkClick(e) {
    e.preventDefault();
    console.log(`Link is clicked`);
  }

  return (
    <div>
      <a href="https://www.naver.com" onClick={linkClick}>
        클릭하세요
      </a>
    </div>
  );
}

 

 

 

02. 이벤트에 매개변수 전달하기

기본적으로 사용하던 함수에 매개변수를 전달하는 방식으로는 오류가 난다.

<!-- 틀린 방법!!! -->
<button onClick={changeFont('10px')}>글자크기변경</button>

 

익명 함수를 통해 매개변수를 전달해야 한다.

<button onClick={function(){changeFont('100px')}}>글자크기변경</button>
<button onClick={()=>{changeFont('100px')}}>글자크기변경</button>

 

 

 

03. onChange 이벤트

해당 태그에 변화가 생기면 발생하는 이벤트

input 박스에 onChange 이벤트를 걸고, e.target.value를 받아오는 방식을 많이 사용하는 것 같다.

 

 

input 태그가 여러 개인 경우

name 속성을 통하여 각각의 input value를 다룰 수 있다. name 속성을 객체의 key로 설정하여 값을 업데이트 해주는 것

function App() {
  const [form, setForm] = useState({
    username: "",
    message: "",
  });

  // e.target.name = "username" 혹은 "message" 이기 때문에
  // 객체의 키 값으로 접근을 하려면 [e.target.name]으로 사용하여야 한다.
  function onChange(e) {
    const nextForm = { ...form, [e.target.name]: e.target.value };
    setForm(nextForm);
  }

  return (
    <div>
      <h1>사용자 이름 : {form.username}</h1>
      <h2>내용 : {form.message}</h2>
      <input
        type="text"
        name="username"
        placeholder="사용자 이름"
        onChange={onChange}
      />
      <input
        type="text"
        name="message"
        placeholder="내용을 입력하세요"
        onChange={onChange}
      />
    </div>
  );
}

 

 

form 태그를 이용하여 데이터 전송

function App() {
  const [form, setForm] = useState(``);

  function updateValue(e) {
    setForm(e.target.value);
  }

  function submitHandler(e) {
    console.log("submit으로 받은 데이터 : ", form);
    // submit을하면 페이지가 새로고침이 되기 때문에 새로고침을 막기 위해 작성
    e.preventDefault();
  }

  return (
    <div className="App">
      <form onSubmit={submitHandler}>
        <h1>이름 : {form}</h1>
        <input type="text" onChange={updateValue} />
        <input type="submit" value="전송" />
      </form>
    </div>
  );
}

만약 submitHandler에 preventDefault()가 없었다면 페이지가 새로고침 되고 input란도 비워지게 된다.

 

input이 아니라 textarea도 사용 가능하다

const [text, setText] = useState(``);

function updateValue(e) {
  setText(e.target.value);
}

<textarea value={text} onChange={updateValue} />

html에서는 textarea에 값을 넣을 때 여는 태그와 닫는 태그 사이에 해당 내용을 입력했는데, React에서는 그 값을 value에 넣는다.

 

 

 

select 태그를 이용하여 데이터 전송

option의 selected 대신 select의 value를 이용하여 선택된 option을 확인할 수 있다.

function App() {
  const [select, setSelect] = useState(``);

  function updateValue(e) {
    setSelect(e.target.value);
  }

  function submitHandler(e) {
    console.log("submit으로 받은 데이터 : ", select);
    // submit을하면 페이지가 새로고침이 되기 때문에 새로고침을 막기 위해 작성
    e.preventDefault();
  }

  return (
    <div className="App">
      <form onSubmit={submitHandler}>
        <h1>선택한 과일 : {select}</h1>
        <select value={select} onChange={updateValue}>
          <option value="apple">사과</option>
          <option value="mango">망고</option>
          <option value="banana">바나나</option>
          <option value="watermelon">수박</option>
        </select>
        <input type="submit" value="전송" />
      </form>
    </div>
  );
}

처음부터 특정 값이 선택된 채로 나오게 하기를 원한다면 select의 초깃값으로 기본으로 지정하고 싶은 option의 value를 적어놓으면 된다.

ex.) const [select, setSelect] = useState(`mango`);

 

 

 

04. 이미지 추가하기

React에서 이미지를 사용할 때 alt 속성(파일이 없을 때 나오는 메시지)을 넣지 않으면 경고가 나온다.

보통 public 폴더 안에 img, images 와 같은 폴더를 만들어서 사용한다고 한다. (하단의 public 디렉터리 내부 이미지 추가 부분 참고)

 

import 사용

 

require 사용

 

 public 디렉터리 내부 이미지 추가

<img src="/images/jjambbong.png" alt="짬뽕">

 

외부 서버의 이미지 추가

<img src="URL" alt="">

 

 

select 태그와 이미지

function App() {
  const selectList = ["apple", "mango", "banana", "watermelon"];
  const [select, setSelect] = useState("");

  function updateValue(e) {
    // 여기에서의 value는 이미지 주소가 나온다
    setSelect(e.target.value);
  }

  return (
    <div className="App">
      <h1>선택한 과일 : {select}</h1>
      <select value={select} onChange={updateValue}>
        {selectList.map((item) => (
          <option value={`/images/${item}.png`}>{item}</option>
        ))}
      </select>
      <img src={select} alt={select} />
    </div>
  );
}

 

 

checkbox

App.js

function App() {
  return (
    <>
      <CheckBox cap={10000} shose={30000} bag={80000} />
    </>
  );
}

 

CheckBox.js

const CheckBox = (props) => {
  const { cap, shose, bag } = props;
  const [total, setTotal] = useState(0);

  const checkBoxHandler = (checkboxTarget) => {
    if (checkboxTarget.checked) {
      setTotal((prevState) => prevState + parseInt(checkboxTarget.value));
    } else {
      setTotal((prevState) => prevState - parseInt(checkboxTarget.value));
    }
  };

  return (
    <div>
      <input
        type="checkbox"
        value={cap}
        onChange={(e) => checkBoxHandler(e.target)}
      />{" "}
      모자 1만원
      <br />
      <input
        type="checkbox"
        value={shose}
        onChange={(e) => checkBoxHandler(e.target)}
      />{" "}
      신발 3만원
      <br />
      <input
        type="checkbox"
        value={bag}
        onChange={(e) => checkBoxHandler(e.target)}
      />{" "}
      가방 8만원
      <br />
      <p>합계 : {total}</p>
    </div>
  );
};

prevState는 이전의 값을 가져오는 것

 

 

 

'새싹DT 기업연계형 프론트엔드 실무 프로젝트 과정 7주차 블로그 포스팅'