※ 공식문서를 읽고 정리한 글입니다.
전에 Thinking in react 게시글에서 FilterableProductTable 컴포넌트 코드를 다음과 같이 작성했었다.
function FilterableProductTable({ json }) {
const [searchData, setSearchData] = useState({
filterText: "",
inStockOnly: false,
});
const setTextFilter = (text) => {
setSearchData({ filterText: text, inStockOnly: searchData.checked });
};
const setBoxFilter = (checked) => {
setSearchData({
filterText: searchData.filterText,
inStockOnly: checked,
});
};
return (
<div>
<SearchBar
searchData={searchData}
setText={setTextFilter}
setBox={setBoxFilter}
/>
<ProductTable json={json} searchData={searchData} />
</div>
);
}
//hook 관련 import 삭제
import React from "react";
class FilterableProductTable extends React.Component {
constructor(props) {
super(props);
this.setTextFilter = this.setTextFilter.bind(this);
this.setBoxFilter = this.setBoxFilter.bind(this);
this.state = {
filterText: "",
inStockOnly: false,
};
}
setTextFilter(text) {
this.setState({
...this.state,
filterText: text,
});
}
setBoxFilter(checked) {
this.setState({
...this.state,
inStockOnly: checked,
});
}
render() {
const { json } = this.props;
const searchData = this.state;
return (
<div>
<SearchBar
searchData={searchData}
setText={this.setTextFilter}
setBox={this.setBoxFilter}
/>
<ProductTable json={json} searchData={searchData} />
</div>
);
}
}
작성한 코드를 FilterableProductTable에 복붙하고 react 컴포넌트를 import하면 그대로 애플리케이션이 동작한다. 하지만..
따라서 현재는 Hook을 사용해 state 관리를 하는 것을 권장하고 있다.
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
function FriendStatusWithCounter(props) {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]);
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
}, [props.friend.id]);
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
// ...
import React, { useState, useEffect } from 'react';
function useFriendStatus(friendID) {
const [isOnline, setIsOnline] = useState(null);
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
useEffect(() => {
ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
};
}, [friendID]);
return isOnline;
}
function FriendStatus(props) {
const isOnline = useFriendStatus(props.friend.id);
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
function FriendListItem(props) {
const isOnline = useFriendStatus(props.friend.id);
return (
<li style={{ color: isOnline ? 'green' : 'black' }}>
{props.friend.name}
</li>
);
}
출처:
https://ko.reactjs.org/docs/hooks-intro.html
https://ko.reactjs.org/docs/hooks-overview.html