Tôi đang phát triển một ứng dụng mới bằng API ngữ cảnh React mới thay vì Redux và trước đây Redux
, khi tôi cần lấy danh sách người dùng, chẳng hạn, tôi chỉ cần gọi vàocomponentDidMount
hành động của mình, nhưng bây giờ với React Context, các hành động của tôi hoạt động bên trong Người tiêu dùng của tôi bên trong hàm kết xuất của tôi, có nghĩa là mỗi khi hàm kết xuất của tôi được gọi, nó sẽ gọi hành động của tôi để lấy danh sách người dùng của tôi và điều đó không tốt vì tôi sẽ thực hiện rất nhiều yêu cầu không cần thiết.
Vì vậy, làm cách nào để tôi có thể gọi chỉ một lần hành động của mình, như trong componentDidMount
thay vì gọi trong hiển thị?
Để làm ví dụ, hãy xem mã này:
Giả sử rằng tôi đang gói tất cả Providers
trong một thành phần, như thế này:
import React from 'react';
import UserProvider from './UserProvider';
import PostProvider from './PostProvider';
export default class Provider extends React.Component {
render(){
return(
<UserProvider>
<PostProvider>
{this.props.children}
</PostProvider>
</UserProvider>
)
}
}
Sau đó, tôi đặt thành phần Nhà cung cấp này gói tất cả ứng dụng của tôi, như thế này:
import React from 'react';
import Provider from './providers/Provider';
import { Router } from './Router';
export default class App extends React.Component {
render() {
const Component = Router();
return(
<Provider>
<Component />
</Provider>
)
}
}
Bây giờ, ở chế độ xem người dùng của tôi chẳng hạn, nó sẽ giống như thế này:
import React from 'react';
import UserContext from '../contexts/UserContext';
export default class Users extends React.Component {
render(){
return(
<UserContext.Consumer>
{({getUsers, users}) => {
getUsers();
return(
<h1>Users</h1>
<ul>
{users.map(user) => (
<li>{user.name}</li>
)}
</ul>
)
}}
</UserContext.Consumer>
)
}
}
Điều tôi muốn là:
import React from 'react';
import UserContext from '../contexts/UserContext';
export default class Users extends React.Component {
componentDidMount(){
this.props.getUsers();
}
render(){
return(
<UserContext.Consumer>
{({users}) => {
getUsers();
return(
<h1>Users</h1>
<ul>
{users.map(user) => (
<li>{user.name}</li>
)}
</ul>
)
}}
</UserContext.Consumer>
)
}
}
Nhưng tất nhiên, ví dụ trên không hoạt động bởi vì các getUsers
đạo cụ không xuất hiện trong chế độ xem Người dùng của tôi. Cách đúng để làm điều đó là gì nếu điều này hoàn toàn có thể?