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
728x90
반응형

1년동안 JQuery를 써 본 결과, JQuery는 정말 Object와 Ajax가 다 먹여살린다고 느꼈다.

페이지 내부에서 필요한 객체를 만들고, 객체에 변경사항이 적용되야 할 일이 생길 때마다 Ajax로 원하는 부분만 새로고침 시켜주면 왠만한 기능은 모두 구현할 수 있었다.

 

블로그의 Node.js - JQuery 글만 봐도 페이지네이션을 하거나 쇼핑몰을 만들거나 할 때 결국은 페이지 내부에서

 Object를 만들고, 필요할 때마다 Ajax로 백엔드와 통신하도록 설계하였다.

 

Object를 선언하는 방법은 굉장히 쉽다.

HTML 파일 내부 script쪽에 선언을 해주면 된다.

 

<script>
var newObject = new Object({name : "Teepo" ,age : 28}}
</script>

 

이런식으로 원하는 Object의 이름을 선언하고( newObject ), 객체 안에 필요한 속성들을 같이 생성자로 선언해주면 된다. 객체의 변화가 필요할 경우에 함수를 만들어주는데, 보통 get, set 함수가 자주 쓰이니 중요한 두 개를 설명하겠다.

 

<script>
function getObject(newObject) {
	console.log(newObject.name);
	console.log(newObject.age);
}
</script>

 

<script>
function setObject(name, age) {
	newObject.name = name;
	newObject.age = age;
}
</script>

 

이런식으로 input태그 onClick옵션에 함수를 넣어 객체를 원하는대로 조정할 수 있다.

728x90
반응형

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

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

리액트에서는 컴포넌트를 선언할 때, 속성을 전달할 수 있다.

JQuery에서는 페이지 내에서 객체를 선언하고, 다른 페이지로 그 객체를 전달하려면 백엔드를 거쳐야 했지만, 

리액트같은 경우에 보다 편리한 방법으로 객체를 전달할 수 있다.

 

App.js

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

function App() {
  return (
    <Hello name="react" />
  );
}

export default App;

 

Hello 파일의 컴포넌트를 가져와서 선언하고, return될 때 사용되게끔 했다. 또한 name = "react" 라는 값을 보내주었다.

 

Hello.js

import React from 'react';

function Hello(props) {
  return <div>안녕하세요 {props.name}</div>
}

export default Hello;

 

그럼 이처럼 함수의 인자값으로 props 안에 name이 들어가게되고, 아까 보내주었던 name을 컴포넌트에서

사용할 수 있다.

 

만약 컴포넌트에 props를 지정하지 않았을 경우에 default 값도 설정해줄 수 있는데,

 

import React from 'react';

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

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

export default Hello;

이런식으로 사용이 가능하다.

 

컴포넌트끼리 원하는 객체나 변수를 주고 받는 기능은 매우 유용하다고 느꼈다.

 

-참조

https://react.vlpt.us/basic/05-props.html

728x90
반응형

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

React.js | 입문 | useState  (0) 2021.09.16
React.js | 입문 | 조건부 렌더링  (0) 2021.09.16
React.js | 입문 | JSX  (0) 2021.09.16
React.js | 입문 | 컴포넌트 만들기  (0) 2021.09.16
React.js | 입문 | React hook  (0) 2021.09.15

+ Recent posts