React에 대한 기본적인 내용은 Velopert님의 리액트를 다루는 기술 책을 토대로 공부하였습니다.
Function App(){
Return (
<div>
Hello <b>React</b>
</div>
);
}
Function App() {
Return React.createElement(“div”, null, “Hello”, React.createElement(“b”, null, “react”));
}
위의 두 코드의 결과는 같다.
JSX는 우리가 알고 있는 div와 span과 같은 HTML태그 뿐 아니라 컴포넌트 또한
HTML태그 쓰듯이 작성을 한다.
Ex) ReactDOM.render(, document.getElementByld(‘root’));
EX)
return (
<h1>리액트 안녕</h1>
<h2>잘 작동하나?</h2>
)
위의 코드는 요소 여러 개가 부모 요소 하나에 의하여 감싸져 있지 않기 때문에 오류가 난다.
이를 해결하려면 아래의 코드와 같이 작성하여 해결할 수 있다.
Return (
<div>
<h1>리액트 안녕</h1>
<h2>잘 작동하니?</h2>
</div>
)
Function App() {
Const name = ‘리액트’;
Return (
<h1>{name} 안녕!</h1>
);
}
Return (
<div>
{name === ‘리액트’ ? (
<h1>리액트입니다.</h1>
) : (
<h2>리액트가 아닙니다.</h2>
)}
</div>
);
Function App() {
Const name = ‘리액트’;
Return <div>{name === ‘리액트’ && <h1> 리액트입니다.</h1>}<.div>;
}
위와 같이 코드를 작성하면 name이 ‘리액트’일 떄는 '리액트입니다'가 렌더링되고 아닐 경우 아무것도 나타나지 않음.
render() {
const tempStyle={
display:"inline-block",
width:"100px",
height:"100px",
boder:"1px solid black",
background:"orange",
}
return (
<Fragment>
<div style={tempStyle}></div>
</Fragment>
);
}
}
<div className = “react” >{name} </div>
Function App() {
Const name = ‘리액트’
Return <div className = “react’>{name}</div>;
}
----- 기본 함수표기법 ( ↑ )과 Arrow 함수 표기법( ↓ ) ----------
const App = () => {
const name = ‘리액트’
return <div className = “react”>{name}</div>;
}
Class App extends Component {
Render() {
Const name = ‘리액트’;
Return <div className = “react”>[name}</div>;
}
}
클래스형 컴포넌트와 함수형 컴포넌트의 차이
Export default MyComponent; <- MyComponent라는 컴포넌트를 모듈로 내보내는 역할
Import MyComponent from ‘./MyComponent’; <- MyComponent라는 컴포넌트를 불러오는 역할
Const MyComponent = props => {
Return <div>안녕하세요, 제 이름은 {props.name}입니다.</div>;
};
Const App = () => {
Return <MyComponent name=“React” />;
};
Const MyComponent = props => {
Return <div>안녕하세요, 제 이름은 {props.name}입니다.</div>;
};
MyComponent.defaultProps = {
Name : ‘기본 이름’
};
(1) 함수형 컴포넌트
Const Parent = props => {
Const { name, children } = props;
Return (
<div>
안녕하세요, 제 이름은 {name} 입니다. <br />
Children 값은 {children}입니다.
</div>
)
};
Const Child = ({ name, children }) => {
Return (
<div>
안녕하세요, 제 이름은 {name} 입니다. <br />
Children 값은 {children}입니다.
</div>
)
};
(2) 클래스형 컴포넌트
Class MyComponent extends Component {
Render() {
Const { name, children } = this.props; // 비구조화 할당
Return (
<div>
안녕하세요, 제 이름은 {name} 입니다. <br />
Children 값은 {children}입니다.
</div>
);
}
}
useState 함수로 배열을 반환하며, 첫 번째 원소는 현재, 두 번째 원소는 상태를 바꾸어 준다.
function App() {
const [count, setCount] = useState( 0 ); // useState(0)은 초기값을 0으로 설정한다.
return(
<div>
<p>현재 클릭된 횟수는 {count}입니다.</p>
<button onClick={() => setCount( count + 1)}>Click Count +1</button>
</div>
}
// state로 설정되어 있는 count를 onClick을 통해 button클릭시 count가 1씩 증가하도록 해줌.
state의 형식은 객체이며, this.setState 함수로 state값을 변경할 수 있다.
class App extends Component {
state = {
count : 50
};
countPlus = () => {
this.setState({
count : this.state.count + 1
});
};
render() {
return (
<div>
<p>현재 클릭된 횟수는 {this.state.count} 입니다.</p>
<button onClick={this.countPlus}>Click Count +1</button>
)
}
const ClickClick = ()=> {
alert(message)
setMassage(‘’);
}
<button onClick={ClickClick}>이벤트핸들링</button>
ClickClick = () => {
alert(this.state.message)
this.setState({
message : ‘ ’
});
}
<button onClick={this.ClickClick}>이벤트핸들링</button>
리액트는 번들러를 활용합니다. 특히 리액트 프로젝트에서는 webpack을 주로 사용하는데,
node_modules에 가 보면 webpack이 알아서 설치되어 있음을 확인하실 수 있습니다.
webpack은 가장 처음으로 읽어들이는 entry point부터 시작하여 필요한 모든 모듈을 다 불러온 뒤 번들링하여 한 파일로 합쳐서 bundle.js 에 저장하는 역할을 합니다.
이 때 webpack 설정파일에 가 보면 entry point가 index.js로 정의되어 있을 것입니다.
그러면 index.js 에 가 보겠습니다.
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
이처럼 webpack의 entry point였던 index.js에, App.js의 요소를 그리도록 작성되어 있기 때문에, 첫 화면에 App.js의 것들이 보여지게 되었던 것입니다.
const url = 'http://localhost/test.htm';
const options = {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json;charset=UTF-8'
},
body: JSON.stringify({
a: 10,
b: 20
})
};
fetch(url, options)
.then(response => {
console.log(response.status);
});
const options = {
url: 'http://localhost/test.htm',
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json;charset=UTF-8'
},
data: {
a: 10,
b: 20
}
};
axios(options)
.then(response => {
console.log(response.status);
});
위의 fetch와 axios코드 둘다 같은 기능을 수행하는 코드이다.
코드에서의 차이점을 보면
결론
Axios는 대부분 HTTP 통신의 요구사항을 컴팩트한 패키지로써 사용하기 쉽게 설계되었다.
브라우저에서 제공하는 fetch()메서드를 이용해서 axios를 완벽히 재현할 수 있지만, 편하게 axios를 사용하자.
axios의 장점
// axios를 사용하지 않을 경우 ( GET )
let xhr = new XMLHttpRequest();
xhr.open('GET', 'url', true);
xhr.setRequestHeader('Content-type', 'application/json');
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && xhr.status === 200) {
(perform some code);
} else {
(handle error)
}
};
xhr.send();
axios를 사용하지 않는다고 가정하면 우리는 XMLHttpRequest()를 사용해서 open과 onreadystatechange등을 사용해서 복잡한 작업들을 해줘야 한다. onreadystatechange는 무엇이고, asyncronose하게 작업을 할 때는 또 다른 고민들을 해야한다.
// axios를 사용할 경우 ( GET )
axios.get('url')
.then((response) => {
console.log(response);
})
.catch((response) => {
console.log(error);
});
마법처럼 아주 간단히 사용할 수 있다.
// axios를 사용하지 않을 경우 ( POST )
let xhr = new XMLHttpRequest();
xhr.open('POST', 'url', true);
xhr.setRequestHeader('Content-type', 'application/json');
xhr.setRequestHeader('Accept', 'application/json');
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.response);
} else {
(handle error)
}
};
xhr.send();
// axios를 사용할 경우 ( POST )
axios.post( 'url',
{
contact: 'James',
email: 'james.h@gmail.com'
},
{
headers:{
'Content-type': 'application/json',
'Accept': 'application/json'
}
}
)
.then((response) => {
console.log(response.data);
})
.catch((response) => {
console.log('Error!)
});
POST의 경우 GET보다는 코드가 길어졌지만, axios를 사용하지 않은 코드와 비교하면 훨씬 간단하다.
axios 사용법
- npm install axios
- yarn add axios
axios 사용하기
axios에서 Request Method를 사용하기 위해서는 axios에 .을 붙히며 소문자로 Req Method를 넣어주면 된다.
그리고 해당 메서드의 파라미터에는 API의 주소를 넣는다.
일반적으로 우리는 axios의 4가지 기본 메서드를 사용하기 위해 지정해야할 것들이 있다.
기본적으로 4가지 Params를 axios에 알려줘야 한다.
1. Method
2. Url
3. Data (optional)
4. Params (optional)
axios({
method: "get",
url: "url",
responseType: "type"
}).then(function (response) {
// response Action
});
위와 같이 사용하는 것이 가장 기본적인 axios에 대한 사용법이다.
만약 POST 메서드에서 data를 전송하기 위해서는 url 밑에 data Object를 추가하면 된다.
단축된 axios 메서드
// 단순 데이터를 요청할 경우
axios.get("url")
.then(function (response) {
// response
}).catch(function (error) {
// 오류발생시 실행
}).then(function() {
// 항상 실행
});
// 파라미터 데이터를 포함시키는 경우
axios.get("url", {
params: {
id: 123
}
})
.then(function (response) {
// response
}).catch(function (error) {
// 오류발생시 실행
}).then(function() {
// 항상 실행
});
axios.post("url", {
username: "",
password: ""
})
.then(function (response) {
// response
}).catch(function (error) {
// 오류발생시 실행
}).then(function() {
// 항상 실행
});
axios.put("url", {
username: "",
password: ""
})
.then(function (response) {
// response
}).catch(function (error) {
// 오류발생시 실행
}).then(function() {
// 항상 실행
});
// 일반적인 delete
axios.delete('/user?ID=12345')
.then(function (response) {
// handle success
console.log(response);
})
.catch(function (error) {
// handle error
console.log(error);
})
.then(function () {
// always executed
});
/*
많은 데이터를 요청할 경우 query나 params가 많아져서 헤더에 많은 정보를 담을 수 없을 때는 두 번째 인자에 data를 추가해줄 수 있다.
*/
axios.delete('/user?ID=12345',{
data: {
post_id: 1,
comment_id: 13,
username: "foo"
}
})
.then(function (response) {
// handle success
console.log(response);
})
.catch(function (error) {
// handle error
console.log(error);
})
.then(function () {
// always executed
});