카테고리 없음

[react] 배열에 항목 수정하기

문앵 2022. 1. 26. 18:26

https://react.vlpt.us/basic/15-array-modify.html

 

15. 배열에 항목 수정하기 · GitBook

배열 항목 수정하기 이번에는, 배열 항목을 수정하는 방법을 알아보겠습니다. User 컴포넌트에 계정명을 클릭했을때 색상이 초록새으로 바뀌고, 다시 누르면 검정색으로 바뀌도록 구현을 해봅시

react.vlpt.us

 

https://muna76.tistory.com/203

 

[react] 배열에 항목 추가 / 배열에 항목 제거

https://react.vlpt.us/basic/13-array-insert.html 13. 배열에 항목 추가하기 · GitBook 13. 배열에 항목 추가하기 이 섹션에서 사용된 코드는 다음 페이지에서 확인 할 수 있습니다. 이번에는 배열에 새로운..

muna76.tistory.com

 

 

 

배열에 항목 수정하기

 

명부에 적혀있는 이름을 누르면 색이 초록색으로 변하고 한번 더 누르면 검은색으로 변하게

 

프로세스

 

1. app 컴포넌트에 users 안의 객체 속성에 active 라는 값을 추가한다. 이 데이터값은 boolean

2. UserList 의 User 컴포넌트에 렌더링 되는 부분에 style 속성을 추가한다.( 삼항연산자 이용, cursor pointer값도 준다. )

 

 

App.js

function App (){
	...
    
	const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com',
      active: true
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com',
      active: false
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com',
      active: false
    }
  ]);
	...
}

(요런 식으로 쭉쭉 추가해준다.)

 

 

 

 

UserList.js 

function User({ user , onRemove }){
    return (
        <div>
            <b 
                style={{
                    cursor:'pointer',
                    color: user.active ? 'green' : 'black'
                }}
            >{user.username}</b> <span>({user.email})</span>
            <button onClick={()=> onRemove(user.id)}>삭제</button>
        </div>
    );
}

 

 

 

 

App.js 의 App 컴포넌트에 onToggle 함수 추가 

const onToggle = id =>{
    setUsers(
      users.map(user=>
        user.id === id ? {...user , active : !user.active} : user  
      )
    )
  }

 

=>

이 함수의 의미는 무엇인가?

 

id를 파라미터로 받아왔다. 이것은 내가 클릭한 번째의 user 의 id 와 비교하기 위해서 받아온것. 

해당 배열에 map을 돌려서 순서대로 해당 id (내가 누른 객체의 id값) 와 비교하는 것임.

 

이후 ,

그 id 값과 같은 id를 가진 객체의 active값을 -> 현재 active값의 반대로 (즉 현대 true면 false로 , 현재 false면 true로)

다른 속상값들은 ...user로 spread 연산자를 이용해 그대로 복사해왔다. active속성값을 객체의 맨 마지막에 넣음으로써 

rest를 사용할 수 있게 했다.

다른 id값을 가진 객체들은 그냥 변화주지 않고 그대로 뒀다.

 

이후는 onRemove를 만든것과 마찬가지로 

App -> UserList -> User 컴포넌트로 onToggle 함수를 넘겨줬고, 이 함수가 onClick 발생 했을때

user의 id를 인자값르로 넣어줘서 해당 함수가 실행될 때 파라미터로 받을 수 있도록 하였다.

 

 

 

 


 

useEffect를 사용하여 마운트/언마운트/업데이트시 할 작업 설정하기

 

마운트 : 처음 화면에 나타남

언마운트 : 화면에서 사라짐

업데이트 : 특정 props가 바뀌는 것을 의미

 

useEffect 를 사용 할 때에는 첫번째 파라미터에는 함수, 두번째 파라미터에는 의존값이 들어있는 배열 (deps)을 넣는다.

만약에 deps 배열을 비우면, 컴포넌트가 처음 나타날때에만 useEffect 에 등록한 함수가 호출된다.

그리고 useEffect 에서는 함수를 반환 할 수 있는데 이것을 cleanup 함수라고 부른다. 

cleanup 함수는 useEffect 에 대한 뒷정리를 해준다고 이해하면 편하다.

deps 가 비어있는 경우에는 컴포넌트가 사라질 때 cleanup 함수가 호출된다.

 

 

UserList의 User 컴포넌트 안에

useEffect를 넣어보자

unction User({ user , onRemove , onToggle }){
    useEffect(()=>{
        console.log('컴포넌트가 화면에 나타남');
        return ()=>{
            console.log('컴포넌트가 화면에 사라짐');
        };
    },[]);

 

 

이후 항목을 추가하고 항목을 삭제할때마다

해당하는 콘솔이 찍히는것을 확인할 수 있었다.

-> 항목을 추가하면 화면에 새로 나타나도 (이게 마운트)

항목을 삭제하면 화면에서 사라지므로 (언마운트)

 

다음과 같은 console이 찍히는 것이다.

 

 

 

 

 

* 마운트시에 수행되는 작업들

  • props 로 받은 값을 컴포넌트의 로컬 상태로 설정
  • 외부 API 요청 (REST API 등)
  • 라이브러리 사용 (D3, Video.js 등...)
  • setInterval 을 통한 반복작업 혹은 setTimeout 을 통한 작업 예약

 

 

* 언마운트시 하는 작업들

  • setInterval, setTimeout 을 사용하여 등록한 작업들 clear 하기 (clearInterval, clearTimeout)
  • 라이브러리 인스턴스 제거

 

 

 

deps 에 특정 값 넣기

처음에 한 것은 deps가 비어있는 상태였다.

이번에는 deps를 넣고 useEffect를 사용해본다.

deps를 넣게 되면 

1. 컴포넌트가 처음 마운트 될 때 

2. 지정한 겂아 바뀔 때 

3. 언마운트 될 때

4. 값이 바뀌기 직전

위와 같은 다양한 상황에서 함수가 호출된다.

 

 

User 컴포넌트에 있는 useEffect를 수정해준다.

  useEffect(() => {
    console.log('user 값이 설정됨');
    console.log(user);
    return () => {
      console.log('user 가 바뀌기 전..');
      console.log(user);
    };
  }, [user]); // -> 여기 deps값을 넣어줬음

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형