Saya mengembangkan aplikasi baru menggunakan React Context API yang baru, bukan Redux, dan sebelumnya, dengan Redux
, ketika saya perlu mendapatkan daftar pengguna misalnya, saya cukup memanggil componentDidMount
tindakan saya, tetapi sekarang dengan React Context, tindakan saya langsung di dalam Konsumen saya yang ada di dalam fungsi render saya, yang berarti bahwa setiap kali fungsi render saya dipanggil, tindakan saya akan dipanggil untuk mendapatkan daftar pengguna saya dan itu tidak baik karena saya akan melakukan banyak permintaan yang tidak perlu.
Jadi, bagaimana saya dapat memanggil hanya satu kali tindakan saya, seperti masuk componentDidMount
alih-alih memanggil dalam render?
Sebagai contoh, lihat kode ini:
Misalkan saya membungkus semua saya Providers
dalam satu komponen, seperti ini:
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>
)
}
}
Lalu saya meletakkan komponen Penyedia ini yang membungkus semua aplikasi saya, seperti ini:
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>
)
}
}
Sekarang, pada tampilan pengguna saya misalnya, akan menjadi seperti ini:
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>
)
}
}
Yang saya inginkan adalah ini:
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>
)
}
}
Tapi tentu saja contoh di atas tidak berfungsi karena getUsers
tidak ada di properti tampilan Pengguna saya. Apa cara yang benar untuk melakukannya jika ini memungkinkan?