props에 접근하려면 Component를 extends한 class에서 this를 통하면 된다.
props -> this.props
this.setState(curState => {
return { showUsers: !curState.showUsers };
});
useEffect(() => {
setFilteredUsers(DUMMY_USERS.filter(user => user.name.includes(searchTerm)));
}, [searchTerm]);
위와 같은 useEffect 훅을 클래스형 컴포넌트에서는 아래와 같이 componentDidUpdate를 사용하여 동일한 효과를 낼 수 있다.
// 컴포넌트가 재평가될 때마다 이 메서드는 실행된다.
componentDidUpdate(prevProps, prevState) {
// 무한루프에 빠지지 않도록 state 조건을 단다.(훅에서 의존성배열 효과)
if (this.state.searchTerm !== prevState.searchTerm) {
this.setState({
filteredUsers: DUMMY_USERS.filter(user =>
user.name.includes(this.state.searchTerm)
),
});
}
}
이 메서드는 DOM에서 컴포넌트가 제거되기 직전에 호출된다.
useEffect(() => {return () => {...}}, [])
state가 모든 컴포넌트 인스턴스에 대해 독립적으로 작동하는 것처럼, 이 메서드는 모든 컴포넌트 인스턴스에 대해 실행된다.
import React from "react";
const UsersContext = React.createContext({
users: [],
});
export default UsersContext;
import UserFinder from "./components/UserFinder";
import UsersContext from "./store/users-context";
const DUMMY_USERS = [
{ id: "u1", name: "Max" },
{ id: "u2", name: "Manuel" },
{ id: "u3", name: "Julie" },
];
function App() {
const usersContext = {
users: DUMMY_USERS,
};
return (
<UsersContext.Provider value={usersContext}>
<UserFinder />
</UsersContext.Provider>
);
}
export default App;
static contextType = UsersContext;
this.context.users
import UsersContext from "../store/users-context";
class UserFinder extends Component {
// 리액트에게 이 컴포넌트가 UsersContext라는 context에 접근(this.context)할 수 있다고 알려준다.
// static contextType 방법은 한 컴포넌트에서 하나의 context에만 연결할 수 있다.
static contextType = UsersContext;
constructor() {
super();
this.state = {
filteredUsers: [],
searchTerm: "",
};
}
// 컴포넌트가 마운트될 때 로딩된다.
componentDidMount() {
// ex) Send http request...
this.setState({ filteredUsers: this.context.users });
}