본문 바로가기

React 수업 정리

React 3일차

npx create-react-app list-app 을해서 list-app 폴더를 만들고

 

User, 와 UserList 컴포넌트를 생성.

 

UserList에 유저 정보를 5명정도 만들고 User에서 props로 받아서 UserList에 가져와 나타내면서 시작.

 

array 랜더링 시  key의 존재 유무에 따라 
업데이트, 삭제, 추가 시 효율적으로 랜더링 됨.

 

key도 넣어보기.

 

UserList 

import React from 'react';
import User from './User';

const UserList = () => {

    const users = [

        {
            id: 1,
            username: 'kim',
            email : 'kim@naver.com'
        },
        {
            id: 2,
            username: 'lee',
            email : 'lee@naver.com'
        },
        {
            id: 3,
            username: 'pack',
            email : 'pack@naver.com'
        },
        {
            id: 4,
            username: 'choi',
            email : 'choi@naver.com'
        },
        {
            id: 5,
            username: 'hong',
            email : 'hong@naver.com'
        }

    ]    


    return (
        <div className='userList'>

            <h3>User List</h3>

            {
                // users.map(u => (
                //     <User user = {u} key = {u.id} />
                // ))
            }
            
            {
                users.map((u,i)=>(
                    <User user = {u} key = {i} />
                ))

            }


        </div>
    );
};

export default UserList;

 

User

import React from 'react';

const User = (props) => {

    const {username,email} =props.user; 


    return (

        <div className='user'>

        <h3> {username}({email}) </h3>

        </div>
    );
};

export default User;

 

 


 

useRef() / useState() 
- 비슷하게 어떤 값을 저장하는 저장공간의 역할
- 컴포넌트 안에서 조회 및 수정할 수 있는 변수를 관리  
- useRef()는 값이 바뀐다고 해도 컴포넌트가 재랜더링 되지 않음.
- state : 변화 => 랜더링 => 컴포넌트 내부 변수들 초기화
- ref : 변화 => 랜더링X => 내부 변수들 값 유지
- ref는 변경시 랜더링을 발생시키지 말아야 하는 값을 다룰 때 사용,
  변화는 감지해야 하지만, 그 변화가 랜더링을 발생시키지 않아야 할 때 사용

useRef() 를 통해 관리하는 값들..
- setTimeout / setInterval 을 통해서 만들어지는 id
- 조회, 수정, 삭제 시 사용되는 id
- 외부 라이브러리를 사용하여 생성된 인스턴스

 

이름과 이메일을 입력하는 input 2개를 만들고 입력한 값이 누르면 유저리스트에 들어 갈 수 있도록 만들어보기

리스트가 들어가면 보이지는 않지만 key 값인 id의 값도1씩 증가해야함.

 

일단 CreateUser 컴포넌트를 만들고

import React from 'react';

const CreateUser = ({ username , email, onChange, onCreate}) => {
    return (
        <div className='createUser'>
            <input type="text" 
            name='username' 
            placeholder='이름' 
            onChange={onChange}
            value={username}
            />
            <input type="text" 
            name='email'
             placeholder='이메일' 
             onChange={onChange}
             value={email}
             />
            <button onClick={onCreate}>Create</button>
        </div>
    );
};

export default CreateUser;

 

username, email, onChange, onCreate를  UserList에서 받아오도록만듬.

 

UserList에서 받아와야 할것들을 만들어보도록하자.

 

기존의 UserList에

 

  const nextId = useRef(6);

    const [ users, setUser] = useState([

        {
            id: 1,
            username: 'kim',
            email : 'kim@naver.com'
        },
        {
            id: 2,
            username: 'lee',
            email : 'lee@naver.com'
        },
        {
            id: 3,
            username: 'pack',
            email : 'pack@naver.com'
        },
        {
            id: 4,
            username: 'choi',
            email : 'choi@naver.com'
        },
        {
            id: 5,
            username: 'hong',
            email : 'hong@naver.com'
        }

    ]);


    const [ inputs , setInputs] = useState({
        username : '',
        email : ''
        });


    const { username, email} = inputs

    const onChange= (e) => {
        const { name, value } = e.target;    
        setInputs({
            ...inputs, // 기존 inputs 값을 복사
            [name]:value // 현재 변경된 값을 key : value 형태로 set
        })

    }

    const onCreate = () => {
        // 값이 추가되면...
        // 나중에 여기서 구현.
        // .current : 현재값
        const user = {
            id:nextId.current,
            username : username,
            email : email
        };

        // 현재 user에 user 추가 => concat 

        setUser(users.concat(user)); 

        // 기존 inputs 창 초기화

        setInputs({
            username : '',
            email : ''
        })

        nextId.current += 1;
    }

 

유저의 정보를 담고있는 users의 배열을 유저를 추가할 때 변화하면서 추가할 수 있도록 useState() 안에 넣어준다.

그리고 name,email을 inputs에 담고, onChage에서 e.target을  name, value로 구조 분할해준다.

이후 구조 분할한 name, value값을 setInputs에서  [name] : value 로 name 키값에 value를 넣어줄 수 있도록한다.

이 때, 변경대상이 아닌 값이 공백처리되니 ...inputs를 통해 기존값을 복사해줘야함.

 

그리고 onCreate()에 버튼을 누르면 추가할 수 있게  추가될 유저 객체를 만들어주고 concat을 통해 users뒤에 붙혀준 후, id값을 1증가시키는 구조이다.

 

이제 UserList return 안에 CreateUser를 가져와주면

 

    return (
        <div className='userList'>

            <CreateUser username = {username} email = {email} onChange={onChange} onCreate={onCreate}/>

            {
                users.map(u => (
                    <User user = {u} key = {u.id} />
                ))
            }
            
        </div>
    );

 

결과

 


이렇게 입력하고 버튼을 누르면 추가되는 것을 볼 수 있음.

 


 

UserList 각 유저항목에 X버튼을 만들어서 누르면 지워지도록 해보기

 

filter : 배열의 항목을 제거하기 위해서 사용
filter는 조건에 맞는 값만 배열로 리턴

 

import React from 'react';

const User = ( {user, onRemove } ) => {

    return (

        <div className='user'>

        <h3> 
            {user.username}({user.email}) 
            <button onClick={() => onRemove(user.id)}>X</button>
        </h3>

        </div>
    );
};

export default User;

 

이런 식으로 h3태그안에  버튼을 넣고 클릭했을때 기능을하는 onRemove를 만듬

onRemove () 안에 id값을 그냥 넣을 수 없으니 () => 로 값을 넣을 수 있도록해줌.

 

    const onRemove = (id) => {
        setUsers(users.filter(user => user.id !== id))
    
   	}
    
     return (
        <div className='userList'>

            <CreateUser username = {username} email = {email} onChange={onChange} onCreate={onCreate}/>

            {
                users.map(u => (
                    <User user = {u} key = {u.id} onRemove={onRemove}/>
                ))
            }
            
       
        </div>
    );

 

onRemove를 만들어서 내가 누른 항목에 id를 전달받아 

user.id가 일치하지 않는 원소만 추출하여 새로운 배열로 리턴하게 만듬.

 

UserList  map 안에 onRemove를 User에 전달할 수 있도록 해줌.

 

결과

 

x버튼을 눌렀을때 없어지는 것을 확인 할 수 있음.

 


 

UserList 의 유저정보에다가 active : true / false 를 입력하고,

클릭할 때 마다 active를 반전시켜 색이 바뀌고, 돌아오도록 해보기

 

User 컴포넌트에  유저이름에다가 active가 ture일때 색이 올 수 있도록 스타일을 넣어두고,

클릭했을때 유저정보에서 id를 받아서 작동 할 수 있는 onToggle을 넣어둠.

    <span style={{
            color: user.active ? "green" : "black",
            cursor:"pointer"
            }} 
            onClick={() => onToggle(user.id)}>
                {user.username} </span> 
           <span>({user.email})</span>

 

    const onToggle = (id) => {
        // user.id 가 파라미터 id와 일치하면 active의 상태를 반전시켜 줌.
        setUsers(users.map(user =>  user.id === id ? { ...user, active : !user.active }  : user ))
    }

 

{
 users.map(u => (
     <User user = {u} key = {u.id} onRemove={onRemove} onToggle={onToggle}/>
      ))
}

 

onToggle  스프레드 연산자로 그대로 user정보를 가져오고,  active값에 !active로  active값만 반전시켜 만들어줌

삼항연산자를 이용해서  user.id 와 파라미터id 가 일치하지않으면 그대로 user반환.

 

결과

 

 

누르면 초록색으로 변화, 다시누르면 검정색으로 돌아오는 것을 볼 수 있음.

'React 수업 정리' 카테고리의 다른 글

Board 만들어보기  (0) 2024.09.19
React 5일차  (0) 2024.09.10
React 4일차.  (3) 2024.09.09
React 2일차  (1) 2024.09.05
React 1일차  (2) 2024.09.04