Ich entwickle eine neue App mit der neuen React Context-API anstelle von Redux. Bevor Redux
ich beispielsweise eine Benutzerliste abrufen musste, rufe ich einfach componentDidMount
meine Aktion auf, aber jetzt mit React Context leben meine Aktionen im Inneren Mein Consumer befindet sich in meiner Renderfunktion. Dies bedeutet, dass jedes Mal, wenn meine Renderfunktion aufgerufen wird, meine Aktion aufgerufen wird, um meine Benutzerliste abzurufen. Dies ist nicht gut, da ich viele unnötige Anforderungen ausführen werde.
Also, wie kann ich meine Aktion nur einmal componentDidMount
aufrufen , wie in anstatt Render aufzurufen?
Schauen Sie sich zur Veranschaulichung diesen Code an:
Nehmen wir an, ich verpacke alle meine Providers
Komponenten wie folgt in eine Komponente:
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>
)
}
}
Dann habe ich diese Provider-Komponente so eingefügt, dass sie meine gesamte App umschließt:
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>
)
}
}
In der Ansicht meiner Benutzer sieht es beispielsweise so aus:
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>
)
}
}
Was ich will ist folgendes:
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>
)
}
}
Aber natürlich funktioniert das obige Beispiel nicht, da die getUsers
Requisiten nicht in der Ansicht meiner Benutzer angezeigt werden. Was ist der richtige Weg, wenn dies überhaupt möglich ist?