728x90
반응형

1. 컴포넌트가 리렌더링 될 때마다를 기록하고 싶을 때가 있을 수 있다.

 

App.js

import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function countActiveUsers(users) {
  console.log('활성 사용자 수를 세는중...');
  return users.filter(user => user.active).length;
}

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  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
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers(users.concat(user));

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };

  const onRemove = id => {
    // user.id 가 파라미터로 일치하지 않는 원소만 추출해서 새로운 배열을 만듬
    // = user.id 가 id 인 것을 제거함
    setUsers(users.filter(user => user.id !== id));
  };
  const onToggle = id => {
    setUsers(
      users.map(user =>
        user.id === id ? { ...user, active: !user.active } : user
      )
    );
  };
  const count = countActiveUsers(users);
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onRemove={onRemove} onToggle={onToggle} />
      <div>활성사용자 수 : {count}</div>
    </>
  );
}

export default App;

 

위 컴포넌트를 보면

 

const count = countActiveUsers(users);

위 부분은 함수 리렌더링이 있을 때마다 count값을 바꿔서 나타내어지게끔 변수를 선언한 부분이며 

 

function countActiveUsers(users) {
  console.log('활성 사용자 수를 세는중...');
  return users.filter(user => user.active).length;
}

위 부분은 함수가 호출되었을 때 로그가 찍히도록 하고, user.active의 개수를 return해준다.

 

이렇게 코드를 구성하게 되면 버튼을 클릭할 때는 한 번 클릭할 때마다 제대로 로그가 찍히지만

input의 값이 바뀔 때마다 리렌더링이 되기 때문에 text 등을 입력할 때 상당히 비효율적이다.

 

이러한 상황에서 쓰이는 Hook 함수가 useMemo이다.

 

 

const count = useMemo(() => countActiveUsers(users), [users]);

이런식으로 첫번째 파라미터에는 어떻게 연산할지 함수를 정의하고, 두번째 파라미터는 바뀌는 내용을 정의한다.

이렇게 하면 users의 내용이 바뀌기 전까진 함수가 실행되지 않고, 바뀌면 그 때 실행이 된다.

 

 

 

참조

https://react.vlpt.us/basic/17-useMemo.html

728x90
반응형
728x90
반응형

useEffect는 useState로 선언한 상태를 관리하기에 정말 좋은 Hook이다.

컴포넌트가 마운트 됐을 때(처음 나타났을 때,), 언마운트 됐을 때(사라질 때), 업데이트 될 때(특정 props가 바뀔 때)

특정 작업을 처리할 수 있게 해준다.

 

1. 마운트 됐을 때 처리

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

이런식을 두번째 파라미터에 빈 배열( deps )을 넣어주면 처음 나타났을 때 특정 작업을 처리할 수 있게 해준다.

 

 

2. deps에 특정 값 추가( 업데이트 될 때 )

useEffect(() => {
    console.log('user 값이 설정됨');
    console.log(user);
    return () => {
      console.log('user 가 바뀌기 전..');
      console.log(user);
    };
  }, [user]);

두번째 파라미터 배열 안에 원하는 상태 변수를 넣어 해당 변수에 변경 사항이 있을 경우 특정 작업을 처리할 수 있게끔

해준다.

 

 

3. deps 파라미터 생략

useEffect(() => {
    console.log(user);
  });

deps 파라미터를 생략하면 컴포넌트가 리렌더링 될 때마다 특정 작업을 실행할 수 있게 해준다.

 

 

 

 

 

- 참조 

https://react.vlpt.us/basic/16-useEffect.html

728x90
반응형
728x90
반응형

전체 코드

 

App.js

import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  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
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers(users.concat(user));

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };

  const onRemove = id => {
    // user.id 가 파라미터로 일치하지 않는 원소만 추출해서 새로운 배열을 만듬
    // = user.id 가 id 인 것을 제거함
    setUsers(users.filter(user => user.id !== id));
  };
  const onToggle = id => {
    setUsers(
      users.map(user =>
        user.id === id ? { ...user, active: !user.active } : user
      )
    );
  };
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onRemove={onRemove} onToggle={onToggle} />
    </>
  );
}

export default App;

 

UserList.js

import React from 'react';

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

function UserList({ users, onRemove, onToggle }) {
  return (
    <div>
      {users.map(user => (
        <User
          user={user}
          key={user.id}
          onRemove={onRemove}
          onToggle={onToggle}
        />
      ))}
    </div>
  );
}

export default UserList;

 

 

1. 수정 - UserList에서 onToggle 함수를 User 컴포넌트에 props로 전달하고, 인자로 users.id를 담아 실행해주도록  한다.

   users 배열이 반복문으로 각기 다른 id를 onToggle함수에 보내줄 것이고, 인자로 전해준 id가 원래있던 user와 같을 

   경우에 조건문을 처리해준다. 다를 경우에는 원래 그 상태를 유지한다.

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

 

 

2. 삭제 

  const onRemove = id => {
    // user.id 가 파라미터로 일치하지 않는 원소만 추출해서 새로운 배열을 만듬
    // = user.id 가 id 인 것을 제거함
    setUsers(users.filter(user => user.id !== id));
  };

 

 

참조

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

 

 

 

728x90
반응형

'Front-End > React.js' 카테고리의 다른 글

React.js | 입문 | useMemo  (0) 2021.09.17
React.js | 입문 | useEffect  (0) 2021.09.17
React.js | 입문 | 배열에 항목 추가  (0) 2021.09.17
React.js | 입문 | 배열 렌더링  (0) 2021.09.17
React.js | 입문 | useRef  (0) 2021.09.16
728x90
반응형

 전체 코드

 

App.js

import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com'
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com'
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com'
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers([...users, user]);

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} />
    </>
  );
}

export default App;

 

첫번째 방법으로는 Spread 연산자를 사용해서 

 

setUsers([...users, user]);

이런식으로 추가를 해주는 방법이 있고, 

 

두번째 방법으로는

 

setUsers(users.concat(user));

이런식으로 concat 함수를 사용하는 방법이 있다.

 

 

참조

https://react.vlpt.us/basic/13-array-insert.html

728x90
반응형
728x90
반응형

전체 코드 

import React from 'react';

function User({ user }) {
  return (
    <div>
      <b>{user.username}</b> <span>({user.email})</span>
    </div>
  );
}

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

  return (
    <div>
      {users.map(user => (
        <User user={user} />
      ))}
    </div>
  );
}

export default UserList;

 

배열 에 담긴 변수들을 컴포넌트에 props로 넣어주려 할 때 map함수를 쓰면 깔끔하게 여러개의 컴포넌트에 각기 다른 props를 넣어주고 선언할 수 있다.

728x90
반응형
728x90
반응형

컴포넌트에서 특정 DOM을 선택하거나 포커싱을 주어야 할 때 ref를 사용한다.

먼저 포커싱을 주는 예제를 살펴보면,

 

전체 코드

import React, { useState, useRef } from 'react';

function InputSample() {
  const [inputs, setInputs] = useState({
    name: '',
    nickname: ''
  });
  const nameInput = useRef();

  const { name, nickname } = inputs; // 비구조화 할당을 통해 값 추출

  const onChange = e => {
    const { value, name } = e.target; // 우선 e.target 에서 name 과 value 를 추출
    setInputs({
      ...inputs, // 기존의 input 객체를 복사한 뒤
      [name]: value // name 키를 가진 값을 value 로 설정
    });
  };

  const onReset = () => {
    setInputs({
      name: '',
      nickname: ''
    });
    nameInput.current.focus();
  };

  return (
    <div>
      <input
        name="name"
        placeholder="이름"
        onChange={onChange}
        value={name}
        ref={nameInput}
      />
      <input
        name="nickname"
        placeholder="닉네임"
        onChange={onChange}
        value={nickname}
      />
      <button onClick={onReset}>초기화</button>
      <div>
        <b>값: </b>
        {name} ({nickname})
      </div>
    </div>
  );
}

export default InputSample;

 

먼저 useRef를 react에서 가져오고,

import React, { useState, useRef } from 'react';

 

특정 변수를 useRef()로 선언한다.

const nameInput = useRef();

 

그 다음 input 인자에 ref를 변수명으로 넣어주고,

<input
  name="name"
  placeholder="이름"
  onChange={onChange}
  value={name}
  ref={nameInput}
/>

 

원하는 위치에 current.focus() 를 실행해준다.

const onReset = () => {
    setInputs({
      name: '',
      nickname: ''
    });
    nameInput.current.focus();
  };

 

이러면 onReset 함수가 실행되면 포커싱이 nameInput을 ref속성으로 가진 곳에 포커싱이 된다.

 

useRef로 선언된 변수에 변경사항이 생길 경우에 useState와는 달리 리렌더링이 발생하지 않는다.

하지만 useRef로 선언된 변수는 같은 메모리 주소를 가지기 때문에 === 연산이 항상 true값을 반환하게 된다.

 

 

참조

https://ko.reactjs.org/docs/hooks-reference.html#useref

728x90
반응형
728x90
반응형

전체 코드

import React, { useState } from 'react';

function InputSample() {
  const [text, setText] = useState('');

  const onChange = (e) => {
    setText(e.target.value);
  };

  const onReset = () => {
    setText('');
  };

  return (
    <div>
      <input onChange={onChange} value={text}  />
      <button onClick={onReset}>초기화</button>
      <div>
        <b>값: {text}</b>
      </div>
    </div>
  );
}

export default InputSample;

 

먼저 useState로 상태 객체를 만들고, input onChange부분에 미리 선언한 함수를 넣어서 

값이 입력될 때마다 State가 바뀌도록 한다.

 

set을 사용할 때 여러가지의 변수가 바뀌어야 할 경우에는

setInputs({
      ...inputs, // 기존의 input 객체를 복사한 뒤
      [name]: value // name 키를 가진 값을 value 로 설정
    });

이런 식으로 기존 객체를 복사하고, key값에 따라 value값이 바뀌도록 한다.

 

참조

https://react.vlpt.us/basic/08-manage-input.html

728x90
반응형

'Front-End > React.js' 카테고리의 다른 글

React.js | 입문 | 배열 렌더링  (0) 2021.09.17
React.js | 입문 | useRef  (0) 2021.09.16
React.js | 입문 | useState  (0) 2021.09.16
React.js | 입문 | 조건부 렌더링  (0) 2021.09.16
React.js | 입문 | props  (0) 2021.09.16
728x90
반응형

전체코드

import React, { useState } from 'react';

function Counter() {
  const [number, setNumber] = useState(0);

  const onIncrease = () => {
    setNumber(number + 1);
  }

  const onDecrease = () => {
    setNumber(number - 1);
  }

  return (
    <div>
      <h1>{number}</h1>
      <button onClick={onIncrease}>+1</button>
      <button onClick={onDecrease}>-1</button>
    </div>
  );
}

export default Counter;

 

 

1. 먼저 react 패키지에서 useState를 불러온다.

 

import React, { useState } from 'react';

 

 

2. 그 다음 변수 이름과 set함수 이름을 선언하고, useState()의 인자값으로 변수의 초기값을 설정한다.

 

const [number, setNumber] = useState(0);

 

 

 

3. onClick함수로 실행될 함수들을 선언한다.

 

  const onIncrease = () => {
    setNumber(number + 1);
  }

  const onDecrease = () => {
    setNumber(number - 1);
  }

 

 

4. return 안 버튼에 onClick쪽에 위에 선언한 함수를 넣어준다.

 

return (
    <div>
      <h1>{number}</h1>
      <button onClick={onIncrease}>+1</button>
      <button onClick={onDecrease}>-1</button>
    </div>
  );

 

 

참조

https://react.vlpt.us/basic/07-useState.html

728x90
반응형

'Front-End > React.js' 카테고리의 다른 글

React.js | 입문 | useRef  (0) 2021.09.16
React.js | 입문 | input 상태 관리  (0) 2021.09.16
React.js | 입문 | 조건부 렌더링  (0) 2021.09.16
React.js | 입문 | props  (0) 2021.09.16
React.js | 입문 | JSX  (0) 2021.09.16
728x90
반응형

전 글에서 말했다시피 JQuery에서는 Object와 Ajax가 핵심이라고 했다.

이번에는 Ajax에 관하여 알아보자.

 

먼저 script에 jquery를 추가해야한다.

<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js" ></script>

 

그 다음 사용하고자 하는 부분에 ajax를 사용한다.

 

$.ajax({
	type: 'POST',
	url: '/shop/test',
	data: DATA,
})

 

기본적인 형식은 이렇게 되어있다.

type은 값을 보내는 메소드의 종류 (ex GET, POST )

url은 보내고자하는 url주소

data는 보내고자하는 데이터이다.

 

백엔드에 이러한 데이터를 보내고 난 후 원하는 값을 받고자 할 때는 뒤에 .done함수를 실행한다.

( 보통 res.send나 res.json으로 받을 경우 )

 

$.ajax({
	type: 'POST',
	url: '/shop/test',
	data: DATA,
}).done(function(data) {
	console.log(data)
	if(data.result == "success") {
		alert('upload');
	}
	else {
		alert('fail');
	}
});

 

데이터의 값에 따라 프론트쪽에서 어떤 행위를 할 것인지 정해놓으면 끝이다.

728x90
반응형

'Front-End > JQuery' 카테고리의 다른 글

JQuery | Object  (0) 2021.09.16
728x90
반응형

개발을 하다보면 조건에 따라서 컴포넌트가 어떤것이 보여질지 정해야 하는 순간이 있는데,

이럴 땐 보통 조건부 렌더링을 쓴다.

 

보통은 전 글에서와 같이  <Hello />  이런식으로 렌더링 하지만, 조건부렌더링을 쓸 때는

 

import React from 'react';

function Hello({ color, name, isSpecial }) {
  return (
    <div style={{ color }}>
      { isSpecial ? <b>*</b> : null }
      안녕하세요 {name}
    </div>
  );
}

Hello.defaultProps = {
  name: '이름없음'
}

export default Hello;

 

이런 식으로 삼항 연산자를 쓴다.

 isSpecial의 값이 true일 경우에 <b>*</b>를, false일 경우엔 null을 반환한다는 뜻이다. 

 

또 다른 방법으로는

 

import React from 'react';

function Hello({ color, name, isSpecial }) {
  return (
    <div style={{ color }}>
      {isSpecial && <b>*</b>}
      안녕하세요 {name}
    </div>
  );
}

Hello.defaultProps = {
  name: '이름없음'
}

export default Hello;

 

이런식으로 isSpecial이 false일 땐 false, true일 땐 <b>*</b> 값을 나타내게 된다.

 

참조 

https://react.vlpt.us/basic/06-conditional-rendering.html

728x90
반응형

'Front-End > React.js' 카테고리의 다른 글

React.js | 입문 | input 상태 관리  (0) 2021.09.16
React.js | 입문 | useState  (0) 2021.09.16
React.js | 입문 | props  (0) 2021.09.16
React.js | 입문 | JSX  (0) 2021.09.16
React.js | 입문 | 컴포넌트 만들기  (0) 2021.09.16

+ Recent posts