React

[REACT] React - map()복습, JS문법 concat/slice/pop/전개연산/비구조화 할당 사용

Hwan'ss 2019. 8. 8. 13:43

2019.08.08(목)

React - map()복습, concat/slice  활용

 

Ex01

- Java Script의 concat(), slice(), pop() 문법 알고가기

// 문법

let arr = [10, 20, 30, 40, 50]
console.log('arr 출력 : ', arr);
console.log('------------------------------------------------------');

// 추가, 연결을 위한 함수
arr.concat(60);
// 그러나 출력 결과에는 추가가 되지 않음
console.log('arr.concat 출력 : ', arr);
console.log('------------------------------------------------------');

// concat은 자체적으로 붙인것 처럼 보이지만 복사본이다.
// arr = arr.concat(60); 이렇게 받아 주어야 한다.
// 원본 살리고 싶을 때 이용 하면 된다. 
arr = arr.concat(60);
console.log('arr=arr.concat(60) 출력 : ', arr);
console.log('------------------------------------------------------');

// slice 잘라내는 것
// 인덱스 2~3까지 잘려 온다.
let brr = arr.slice(2, 4)   // 끝번호 -1까지 가져온다.
console.log('arr.slice(2, 4) 출력 : ', brr);
console.log('------------------------------------------------------');

// 마지막 요소 삭제, 배열 자체를 갱신하고 그 값을 반환한다.
console.log('arr.pop() retrun 값 출력 : ', arr.pop());
console.log('pop()후의 arr 출력', arr);

Ex01 실행결과

Ex02

- 버튼 btn1은 리스트를 추가 하고 btn2는 리스트를 지우려고 한다.

- btn1에서 리스트를 추가 하는 건 가능하지만 어떻게 리렌더링을 할 것인가? setState 이용

- btn2에서 리스트를 삭제 하고자 한다. pop()를 사용하면 error가 발생한다. pop() 대신해서 slice()를 통해 배열 length에서 -1 한 값을 가져오면 마지막 리스트를 삭제해서 출력 할 수 있다.

- pop은 직접적으로 갱신을 하는데 React에서는 직접적인 갱신을 할 수가 없다. 그렇기 때문에 직접 갱신을 하지 않고 원하는 부분을 복사해서 가지고 있는 slice를 이용한다.

import React, { Component } from 'react';

class App extends Component {
  state = {
    arr: ["호랑이", "코끼리", "독수리"]
  }
  render() {
    let brr = this.state.arr.map((v, k) => <li key={k}>{v}</li>)
    return (
      <div>
        {/* map() 이용하여 리스트 출력 */}
        <ul>{brr}</ul>

        {/* 마지막에 데이터 추가하기 */}
        <button onClick={() => {
          console.log('ddd');
          this.setState((
            { arr: this.state.arr.concat("낭낭이") }
          ))

        }}>btn1</button>

        {/* 마지막 데이터 삭제 하기 */}
        <button onClick={() => {
          this.setState((
            { arr: this.state.arr.slice(0, this.state.arr.length - 1) }
          ))
        }}>btn2</button>
      </div>
    );
  }
}

export default App;

Ex02 실행결과

Ex03

- Ex02에 추가하여 <li> 태그에 onClick을 사용하여 리스트를 클릭하면 삭제 되도록 한다.

- 모든 태그에는 onClick과 같은 Event를 사용 할 수 있다.

import React, { Component } from 'react';

class App extends Component {
  state = {
    arr: ["호랑이", "코끼리", "독수리"]
  }
  render() {
    let brr = this.state.arr.map((v, k) =>
    // list 더블클릭시 그 list 삭제되도록 설정
      <li onDoubleClick={ () => {
        console.log(k);
        
        // 강사님 방법
        // let s = this.state.arr.slice(0, k)
        // let e = this.state.arr.slice(k+1, this.state.arr.length)
        // let r = s.concat(e);
        // this.setState(
        //   {arr:this.state.arr.concat(r)}
        // )

        // 내 방법
        this.setState(
        {
            arr: this.state.arr.slice(0,k)
              .concat(this.state.arr.slice(k+1, this.state.arr.length))
        }
        )

      }}
      key={k}>{v}</li>
    )
    return (
      <div>
        {/* map() 이용하여 리스트 출력 */}
        <ul>{brr}</ul>

        {/* 마지막에 데이터 추가하기 */}
        <button onClick={() => {
          console.log('ddd');
          this.setState((
            { arr: this.state.arr.concat("낭낭이") }
          ))

        }}>btn1</button>

        {/* 마지막 데이터 삭제 하기 */}
        <button onClick={() => {
          this.setState(
            { arr: this.state.arr.slice(0, this.state.arr.length - 1) }
          )
        }}>btn2</button>
      </div>
    );
  }
}

export default App;

- 왼쪽 초기 상태에서 독수리를 클릭하면 오른쪽과 같이 독수리가 삭제된다.

Ex03 실행결과

Ex04

- Ex03 예제를 좀 더 간단하게 표현하기 위해 전개연산자와 비구조화 문법을 사용한 예제

import React, { Component } from 'react';

class App extends Component {
  state = {
    arr: ["호랑이", "코끼리", "독수리"]
  }
  render() {

    // ar이 this.state.arr을 참조 하기 때문에 this.state.arr을 ar로 사용 가능
    // 이것을 잘 안쓴다. 이것보다 융통성 있는 문법이 있다.(비구조화 방법 사용)
    // const ar = this.state.arr

    // 비구조화 방법
    // arr이 this.state를 가져온다.
    // 즉, 비조화 방법은 this.state에서 원하는 것만 가져와서 사용 할 수 있도록 하는 방법이다.
    // 다시 말해, this.state에서 arr만 가져와서 사용하겠다는 의미이다.
    const {arr} = this.state

    let brr = arr.map((v, k) =>
      // list 클릭시 그 list 삭제되도록 설정
      <li onDoubleClick={() => {
        console.log(k);

        // 강사님 방법1
        // let s = ar.slice(0, k)
        // let e = ar.slice(k+1, ar.length)
        // let r = s.concat(e);
        // this.setState(
        //   {arr:ar.concat(r)}
        // )

        // 내 방법2
        // this.setState(
        // {
        //     arr: ar.slice(0,k)
        //       .concat(ar.slice(k+1, ar.length))
        // }
        //)

        // 또다른 방법3
        this.setState(
          {
            // concat를 사용하지 않고 전개연산자를 사용
            // 전개연산자는 concat의 개념이라고 생각하면 된다.
            arr: [
              ...arr.slice(0, k),
              ...arr.slice(k + 1, arr.length),
            ]
          }
        )
      }}
        key={k}>{v}</li>
    )
    return (
      <div>
        {/* map() 이용하여 리스트 출력 */}
        <ul>{brr}</ul>

        {/* 마지막에 데이터 추가하기 */}
        <button onClick={() => {
          console.log('ddd');
          this.setState((
            { arr:arr.concat("낭낭이") }
          ))
          
        }}>btn1</button>

        {/* 마지막 데이터 삭제 하기 */}
        <button onClick={() => {
          this.setState(
            { arr: arr.slice(0, arr.length - 1) }
          )
        }}>btn2</button>
      </div>
    );
  }
}

export default App;

- 실행결과는 Ex03과 동일하다.

Ex04 실행결과

Ex05

- 전개 연산

// 문법 2
// 전개 연산자
// ES6 에서 새로 생긴 문법이다.

//배열 전개연산
let arr = [10, 20, 30]
// 배열 요소 안에 배열이 들어간 것이다. length로 보면 3이다.
// 키워넣은게 아니라 배열을 넣은 것이다.
let brr = [50, arr, 60] 
// 이게 전개 연산자이다. 이러면 arr의 배열 요소들이 crr으로 들어간다.
// lenght는 5가 된다.
let crr = [50, ...arr, 60] 

console.log(brr);
console.log(brr.length);
console.log(crr);
console.log(crr.length);
console.log('-------------------');

// 객체 전개 연산
const obj1 = {
    a:10,
    b:20,
    c:30,
}
console.log(obj1);

const obj2 = {
    d:40,   // d와 e사이에 obj1을 넣을려 한다
    ...obj1,
    e:50,
}
console.log(obj2);
console.log('-------------------');

// 함수
function f1() {
    return {
        a:10,
        b:20,
    }
}
console.log(f1())

// 함수 return 값 전개 연산
const obj3 = {
    c : 30,
    d : 40,
    ...f1(),    // f1()에서 객체가 return되는데 반환되는 객체를 전개한다.
}
console.log(obj3);
console.log('-------------------');

Ex05 실행결과

Ex06

- 비구조화 할당

// 문법3

// 비 구조화 할당
const cr = [10, 20, 30]
const [x, y, z] = cr

console.log(x, y, z);

const obj4 = {
    a:10,
    b:20,
    c:30,
}
// 객체의 원하는 요소의 값만 받아서 사용 할 수 있다.(비구조화 할당)
const { a,c } = obj4
console.log(a, c);

Ex06 실행결과