Opracowuję nową aplikację, używając nowego interfejsu API React Context zamiast Redux, a wcześniej, Redux
gdy potrzebowałem na przykład listy użytkowników, po prostu wzywam componentDidMount
swoją akcję, ale teraz, dzięki React Context, moje działania są wewnątrz mój Konsument, który znajduje się wewnątrz mojej funkcji renderującej, co oznacza, że za każdym razem, gdy moja funkcja renderująca jest wywoływana, wywoła moją akcję, aby uzyskać listę moich użytkowników, a to nie jest dobre, ponieważ będę wykonywać wiele niepotrzebnych żądań.
Jak więc mogę wywołać moją akcję tylko raz, na przykład in componentDidMount
zamiast wywoływania renderowania?
Aby to zilustrować, spójrz na ten kod:
Załóżmy, że zawijam wszystko Providers
w jeden komponent, w ten sposób:
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>
)
}
}
Następnie umieszczam ten komponent dostawcy opakowujący całą moją aplikację, w ten sposób:
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>
)
}
}
Teraz, na przykład, dla moich użytkowników, będzie to mniej więcej tak:
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>
)
}
}
Chcę tego:
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>
)
}
}
Ale oczywiście powyższy przykład nie działa, ponieważ getUsers
rekwizyty nie znajdują się w widoku moich użytkowników. Jaki jest właściwy sposób, aby to zrobić, jeśli jest to w ogóle możliwe?