1. JSX
1) 태그에 style과 CSS class를 설정하는 방법
① css 파일을 만들지 않는 경우 : background-color → backgroundColor
② css 파일을 별도로 만드는 경우 : import 후 className 속성으로 등록
2) 주석을 작성하는 방법
: { /* */ }
3) props
** props를 통해 컴포넌트에게 값 전달하는 방법
① <컴포넌트명 속성명1=값1 속성명2=값2/>
function 컴포넌트명(props) {
"props.속성명" 으로 사용
}
② <컴포넌트명 속성명1=값1 속성명2=값2/>
function 컴포넌트명({속성명1, 속성명2}) {
"속성명1" 으로 사용
}
** 기본값을 설정하는 방법
컴포넌트명.defaultProps = {
설정할 내용
}
[예] 기본값을 설정하지 않는다면
[예] 기본값 설정 후
** 컴포넌트 태그 사이에 넣은 값을 조회하는 방법
function 컴포넌트명( { children } ) {
return (
<div>
{ children }
</div>
)
}
[예] 컴포넌트 태그 사이에 넣은 값을 조회하는 방법을 사용하지 않을 경우
[예] 컴포넌트 태그 사이에 넣은 값을 조회하는 방법을 사용한 경우
** 조건부 렌더링
: 특정 조건에 따라 다른 결과물을 렌더링하는 것을 의미
** src/app.jsx
import React from 'react';
import Hello from './component/hello';
import Wrapper from './component/wrapper';
import './app.css';
function App() {
const name = 'apple';
const style = {
backgroundColor: 'deepskyblue',
color: 'white',
fontSize: 40,
padding: '1rem'
}
return (
<>
{ /* CSS를 적용하는 방법 : className 속성에 적용 */ }
<Wrapper>
<div style={style}>Hello!</div>
<div className="deeppink-box">{name}</div>
<Hello name="apple" color="gold" isSpecial={true}/>
<Hello name="banana" color="yellowgreen"/>
<Hello/>
</Wrapper>
</>
);
}
export default App;
** /src/component/hello.jsx
import React from 'react';
// function Hello(props) {
// { /* props : props.color, props.name => props = {color:'gold', name='김사과'} */ }
// return <div style={{color: props.color}}>안녕하세요 {props.name}</div>
// }
function Hello({color, name, isSpecial}) {
return (
<div style={{ color }}>
{/* { isSpecial ? <b>★</b> : null } 안녕하세요 { name } */}
{ isSpecial && <b>★</b> } 안녕하세요 { name }
</div>
)
}
Hello.defaultProps = {
color: 'pink',
name: '무명'
}
export default Hello;
** /src/component/wapper.jsx
import React from 'react';
function Wrapper( {children} ) {
const style = {
border:'3px solid red',
padding: '10px'
};
return (
<div style={style}>
{ children }
</div>
)
}
export default Wrapper;
2. useState
: 리액트에서 값의 상태를 관리하는 Hooks이다.
리액트 16.8버전부터 Hooks라는 기능이 도입되면서 함수 컴포넌트에서도 상태를 관리할 수 있게 되었다.
** 컴포넌트를 만드는 방법
class | function |
상태 관리(O) | 상태 관리 (X) → 리액트 16.8버전부터 가능하게 됨 |
1) Hooks 사용 예시
** app.jsx
import React from 'react';
import Counter from './component/counter';
function App() {
return (
<div>
<Counter/>
</div>
);
}
export default App;
** /component/counter.jsx
import React, { useState } from 'react'; // 리액트 패키지에서 useState라는 hooks를 불러옴
function Counter() {
const [number, setNumber] = useState(0);
const plus = () => {
setNumber(number + 1);
console.log('1 더해졌어요');
}
const minus = () => {
setNumber(number - 1);
console.log('1 뺐어요');
}
return (
<div>
<h2>{number}</h2>
<button onClick={plus}>더하기</button>
<button onClick={minus}>빼기</button>
</div>
)
}
export default Counter;
2) Input을 추가한 Hooks 사용 예시
** app.jsx
import React from 'react';
// import Counter from './component/counter';
import Input from './component/input';
function App() {
return (
<div>
{/* <Counter/> */}
<Input/>
</div>
);
}
export default App;
** /component/input.jsx
import React, { useState } from 'react';
function Input() {
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 Input;
3) 멀티 input
** app.jsx
import React from 'react';
// import Counter from './component/counter';
// import Input from './component/input';
import MultiInput from './component/multiinput';
function App() {
return (
<div>
{/* <Counter/> */}
{/* <Input/> */}
<MultiInput/>
</div>
);
}
export default App;
** /component/multiinput.jsx
import React, {useState} from 'react';
function MultiInput() {
const [inputs, setInputs] = useState({
userid: '',
name: ''
});
const {userid, name} = inputs; // 비구조화 할당을 통해 값을 전달
const onChange = (e) => {
const {value, name} = e.target; // e.target에서 name과 value 가져옴
setInputs({
...inputs, // ... spread 문법 : 객체를 복사
[name]: value // name 키를 가진 값을 value로 설정
});
};
const onReset = () => {
setInputs({
userid: '',
name: ''
})
};
return (
<div>
<input name="userid" onChange={onChange} placeholder="아이디" value={userid}/>
<input name="name" onChange={onChange} placeholder="이름" value={name}/>
<button onClick={onReset}>지우기</button>
<div>
<b>아이디 : {userid}</b>, <b>이름 : {name}</b>
</div>
</div>
)
}
export default MultiInput;
3. spread.js
const dog = {
name: '루시'
};
// const cuteDog = {
// name: '루시',
// attribute: 'cute'
// };
// const whiteCuteDog = {
// name: '루시',
// attribute: 'cute',
// color: 'white'
// }
// console.log(dog);
// console.log(cuteDog);
// console.log(whiteCuteDog);
// 기존 객체를 사용하면서 수정하지 않은 상태로 새로운 객체를 만들어내는 방법
const cuteDog = {
...dog,
attribute: 'cute'
};
const whiteCuteDog = {
...cuteDog,
color:'white'
};
console.log(dog);
console.log(cuteDog);
console.log(whiteCuteDog);
4. 불변성을 지켜주어야만 리액트 컴포넌트에서 상태가 업데이트가 됬음을 감지할 수 있고
이에 따라 필요한 리렌더링이 진행된다.
inputs[name] = value 이런식으로 기존 상태를 직접 수정하게 되면,
값이 바뀌어도 리랜더링이 일어나지 않는다.
5. useRef로 특정 DOM 선택하기
: 리액트에서 DOM에 직접 접근하는 방법을 사용하기 위해 useRef라는 Hooks를 사용한다.
** /component/multiinput.jsx
import React, {useState, useRef} from 'react';
function MultiInput() {
const [inputs, setInputs] = useState({
userid: '',
name: ''
});
const useridInput = useRef();
const {userid, name} = inputs; // 비구조화 할당을 통해 값을 전달
const onChange = (e) => {
const {value, name} = e.target; // e.target에서 name과 value 가져옴
setInputs({
...inputs, // ... spread 문법 : 객체를 복사
[name]: value // name 키를 가진 값을 value로 설정
});
};
const onReset = () => {
setInputs({
userid: '',
name: ''
});
useridInput.current.focus();
};
return (
<div>
<input name="userid" onChange={onChange} placeholder="아이디" value={userid} ref={useridInput}/>
<input name="name" onChange={onChange} placeholder="이름" value={name}/>
<button onClick={onReset}>지우기</button>
<div>
<b>아이디 : {userid}</b>, <b>이름 : {name}</b>
</div>
</div>
)
}
export default MultiInput;
6. 배열
** /component/userlist.jsx
import React from 'react';
function UserList() {
const users = [
{
id: 1,
username: '김사과',
email: 'apple@apple.com'
},
{
id: 2,
username: '오랜지',
email: 'orange@orange.com'
},
{
id: 3,
username: '반하나',
email: 'banana@banana.com'
},
{
id: 4,
username: '이메론',
email: 'melon@melon.com'
},
{
id: 5,
username: '배애리',
email: 'berry@berry.com'
}
];
return (
<div>
<div>
<b>{users[0].username}</b> <span>({users[0].email})</span>
</div>
<div>
<b>{users[1].username}</b> <span>({users[1].email})</span>
</div>
<div>
<b>{users[2].username}</b> <span>({users[2].email})</span>
</div>
<div>
<b>{users[3].username}</b> <span>({users[3].email})</span>
</div>
<div>
<b>{users[4].username}</b> <span>({users[4].email})</span>
</div>
</div>
)
}
export default UserList;
** 위의 /component/userlist.jsx 코드 간략화
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: '김사과',
email: 'apple@apple.com'
},
{
id: 2,
username: '오랜지',
email: 'orange@orange.com'
},
{
id: 3,
username: '반하나',
email: 'banana@banana.com'
},
{
id: 4,
username: '이메론',
email: 'melon@melon.com'
},
{
id: 5,
username: '배애리',
email: 'berry@berry.com'
}
];
return (
<div>
{/* <div>
<User user={users[0]}/>
</div>
<div>
<User user={users[1]}/>
</div>
<div>
<User user={users[2]}/>
</div>
<div>
<User user={users[3]}/>
</div>
<div>
<User user={users[4]}/>
</div> */}
{users.map((user, index) => (
<User user={user} key={index}/>
))}
</div>
)
}
export default UserList;
** app.jsx
import React from 'react';
// import Counter from './component/counter';
// import Input from './component/input';
// import MultiInput from './component/multiinput';
import UserList from './component/userlist'
function App() {
return (
<div>
{/* <Counter/> */}
{/* <Input/> */}
{/* <MultiInput/> */}
<UserList/>
</div>
);
}
export default App;
'웹_프론트_백엔드 > 프론트엔드' 카테고리의 다른 글
2021.03.28 (0) | 2021.05.16 |
---|---|
2021.03.27 (0) | 2021.05.14 |
2021.03.20 (0) | 2021.05.11 |
2021.03.20 (0) | 2021.04.20 |
2021.03.14 (0) | 2021.04.18 |