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?
quelle
this.context
in jeder der Lebenszyklusmethoden auf [ ] verweisen ] ( reactjs.org/docs/context.html#classcontexttype )“, aber Sie implizieren, dass dies nicht der Fall ist? Ihr Code scheint einige Anstrengungen zu unternehmen, um den Kontext erneut in Requisiten einzufügen, anstatt dort, wo die API dies vorschreibt.Ok, ich habe einen Weg gefunden, dies mit einer Einschränkung zu tun. Mit dem
with-context
Bibliothek konnte ich alle meine Verbraucherdaten in meine Komponenten-Requisiten einfügen.Das Einfügen von mehr als einem Consumer in dieselbe Komponente ist jedoch kompliziert. Sie müssen mit dieser Bibliothek gemischte Consumer erstellen, wodurch der Code nicht elegant und nicht produktiv wird.
Der Link zu dieser Bibliothek: https://github.com/SunHuawei/with-context
BEARBEITEN: Eigentlich müssen Sie nicht die Multi-Kontext-API verwenden,
with-context
die tatsächlich die einfache API verwendet und einen Dekorator für jeden Ihrer Kontexte erstellt. Wenn Sie mehr als einen Consumer in Ihrer Komponente verwenden möchten, müssen Sie nur erkläre über deiner Klasse so viele Dekorateure, wie du willst!quelle
Für meinen Teil war es genug, um
.bind(this)
die Veranstaltung zu ergänzen . So sieht meine Komponente aus.quelle
Sie müssen den Kontext in der übergeordneten Komponente übergeben, um als Requisiten im untergeordneten Element Zugriff zu erhalten.
quelle