세모이
개발 계발
세모이
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • 알고리즘 (1)
    • 자바스크립트 (29)
    • 리액트 (10)
    • HTML&CSS (2)
    • TIL (26)
    • 파이썬 (8)
    • Dev (1)
    • 데일리 (3)
      • 2023 (3)
    • 에러일기 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 리액트 key
  • const let 키워드와 블록레벨 스코프
  • 옵셔널 체이닝
  • 자바스크립트 생성자 함수에 의한 객체 생성
  • 모던 자바스크립트 deep dive
  • 자바스크립트 전역 변수의 문제점
  • html 신기한 태그
  • 함수
  • 개발자 도구 Network
  • 모던 자바스크립트
  • 자바스크립트 프로퍼티 어트리뷰트
  • 자바스크립트
  • 시멘틱 태그
  • 자바스크립트 함수와 일급 객체
  • &&연산자
  • 자바스크립트 프로토타입
  • 자바스크립트 빌트인 객체
  • 모던 자바스크립트 deep deive
  • 자바스크립트 strict mode
  • 자바스크립트 깊은 복사 얕은 복사

최근 댓글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
세모이

개발 계발

(리액트를 다루는 기술) 6장 컴포넌트 반복
리액트

(리액트를 다루는 기술) 6장 컴포넌트 반복

2021. 4. 1. 18:00
반응형

컴포넌트 반복

  1. 자바스크립트 배열의 map()함수
    1. 문법
    • array.map(callback, [thisArg])
      • callback : 새로운 배열의 요소를 생성하는 함수로 파라미터는 3가지
        • currentValue : 현재 처리하고 있는 요소
        • index : 현재 요소의 index 값
        • array : 현재 처리하고 있는 원본 배열
      var numbers=[1,2,3,4,5];
      
      number.map(function(c,i,a){
                  console.log(c,i,a)})
      
      1 0 [1, 2, 3, 4, 5]
      2 1 [1, 2, 3, 4, 5]
      3 2 [1, 2, 3, 4, 5]
      4 3 [1, 2, 3, 4, 5]
      5 4 [1, 2, 3, 4, 5]
      
      
  1. 데이터 배열을 컴포넌트 배열로 변환
import React from "react";

const IterationSample = () => {
  return (
    <div>
      <ul>
        <li>눈사람</li>
        <li>얼음</li>
        <li>눈</li>
        <li>바람</li>
      </ul>
    </div>
  );
};
export default IterationSample;

-> 반복되는 태그를 mpa()이용해서 간단하게 바꿀 수 있다

import React from "react";

const IterationSample = () => {
  const names = ["눈사람", "얼음", "눈", "바람"];
  const nameList = names.map((v) => <li>{v}</li>);
  return (
    <div>
      <ul>{nameList}</ul>
    </div>
  );
};
export default IterationSample;
  1. key
  • 리액트에서 key는 컴포넌트 배열을 렌더링 했을 때 어떤 원소에 변동이 있는지 알아내려고 사용
    1. key 설정
      • key 값을 설정 할 때는 map 함수의 인자로 전달되는 함수 내부에서 props를 설정하듯이 설정(key값은 유일하게)
    import React from "react";
    
    const IterationSample = () => {
      const names = ["눈사람", "얼음", "눈", "바람"];
      const nameList = names.map((v, i) => <li key={i}>{v}</li>);
      return (
        <div>
          <ul>{nameList}</ul>
        </div>
      );
    };
    export default IterationSample;
  1. 응용
    1. 데이터 추가
    import React, { useState } from "react";
    
    const IterationSample = () => {
      const [names, setNames] = useState([
        { id: 1, text: "눈사람" },
        { id: 2, text: "얼음" },
        { id: 3, text: "눈" },
        { id: 4, text: "바람" },
      ]);
      const [inputText, setInputText] = useState("");
      const [nextId, setNextId] = useState(5);
    
      const onChange = (e) => setInputText(e.target.value);
    
      const onClick = () => {
        const nextNames = names.concat({
          id: nextId,
          text: inputText,
        });
        setNextId(nextId + 1);
        setNames(nextNames);
        setInputText("");
      };
    
      const namesList = names.map((name) => <li key={name.id}>{name.text}</li>);
      return (
        <div>
          <input value={inputText} onChange={onChange} />
          <button onClick={onClick}>추가</button>
          <ul>{namesList} </ul>
        </div>
      );
    };
    export default IterationSample;
    - 배열에 항목 추가할 때 push 안쓰고 concat를 쓴 것은 push 함수는 기존 배열 자체를 변경하고, concat는 새로운 배열을 만들어 준다는 차이
    -> 리액트에서는 상태를 업데이트 할 때는 기존 상태를 그대로 두면서 새로운 값을 상태로 설정해야 하기 때문에
    1. 데이터 제거
      • filter 함수를 사용하면 배열에서 특정 조건을 만족하는 원소들만 분류 가능
      const numbers = [1, 2, 3, 4, 5];
      numbers.filter((e) => e > 3)[(4, 5)];
    import React, { useState } from "react";
    
    const IterationSample = () => {
      const [names, setNames] = useState([
        { id: 1, text: "눈사람" },
        { id: 2, text: "얼음" },
        { id: 3, text: "눈" },
        { id: 4, text: "바람" },
      ]);
      const [inputText, setInputText] = useState("");
      const [nextId, setNextId] = useState(5);
    
      const onChange = (e) => setInputText(e.target.value);
    
      const onClick = () => {
        const nextNames = names.concat({
          id: nextId,
          text: inputText,
        });
        setNextId(nextId + 1);
        setNames(nextNames);
        setInputText("");
      };
    
      const onRemove = (id) => {
        const nextNames = names.filter((name) => name.id !== id);
        setNames(nextNames);
      };
    
      const namesList = names.map((name) => (
        <li key={name.id} onDoubleClick={() => onRemove(name.id)}>
          {name.text}
        </li>
      ));
      return (
        <div>
          <input value={inputText} onChange={onChange} />
          <button onClick={onClick}>추가</button>
          <ul>{namesList} </ul>
        </div>
      );
    };
    export default IterationSample;
반응형

'리액트' 카테고리의 다른 글

리액트 리코일  (0) 2022.01.23
(리액트를 다루는 기술) 8장 Hooks  (0) 2021.04.08
(리액트를 다루는 기술) 5장 ref-dom에 이름 달기  (0) 2021.03.29
(리액트를 다루는 기술) 4장 이벤트 핸들링  (0) 2021.03.29
(리액트를 다루는 기술) 3장 Component  (0) 2021.03.19
    '리액트' 카테고리의 다른 글
    • 리액트 리코일
    • (리액트를 다루는 기술) 8장 Hooks
    • (리액트를 다루는 기술) 5장 ref-dom에 이름 달기
    • (리액트를 다루는 기술) 4장 이벤트 핸들링
    세모이
    세모이
    개발 공부!

    티스토리툴바