Ich begann vor kurzem mit react-Redux, um meine Front-End-App zu bauen, aber während ich Komponenten schrieb, fühlte ich mich verwirrt auf Requisiten und Staaten.ReactJS: Best Practice von Requisiten und Zustand
Zum Beispiel:
- heißt es:
content
,type
- Funktionen:
changeContent
,changeType
,fetchResult
. - Requisiten:
fetched_result
.
Die Struktur der Komponente:
<Layout>
<Header/>
<SearchContent />
<SearchType />
<SearchButton /> -> call axios to get result
<View />
<Chart />
Current Layout.js definiert alle Funktionen.
changeContent(e) {
this.setState({"content": e.target.value,});
}
changeType(e) {
this.setState({"type": e.target.value,});
}
fetchResult() {
this.props.dispatch(fetchResultAction(this.state.content, this.state.type)).then(()=>{...});
}
Und ich habe alle state
und props
in jeder Komponente.
<Header
changeType={this.changeType.bind(this)}
changeContent={this.changeContent.bind(this)}
fetchResult={this.fetchResult.bind(this)}
/>
<SearchContent
changeContent={this.props.changeContent}
/>
<SearchType
changeType={this.props.changeType}
/>
<SearchButton
fetchResult={this.props.fetchResult}
/>
<View
type={this.state.type}
result={this.props.fetched_result}
/>
Sicher funktioniert jede Komponente gut. Alle mit dem Code verbundenen Status werden jedoch in Layout geschrieben.
In diesem einfachen Fall ist es gut, wenn ich fetchResult mit Argumenten definieren:
//this can be defined in any component
fetchResult(content, type) {
this.props.dispatch(fetchResultAction(content, type).then(()=>{...});
const { fetched_result } = this.props;
//I need to define a new "changeResult" function and "result" state in Layout
this.changeResult(fetched_result); //pass result back to layout state
}
Dann kann ich diese Funktion in jeder Komponente verwenden, um mit Zustand übergeben.
Allerdings haben die echte App viele Komponenten mit komplexen Beziehungen. Ich konfrontiert viele Kupplungsprobleme, während ich Layout-Funktion in unter Komponenten aufgeteilt.
Zum Beispiel verwendet fetchResult
den Status searched
.
//this is defined in Layout
fetchResult() {
this.props.dispatch(fetchResultAction(this.state.content, this.state.type).then(()=>{
if(this.state.searched==false){
this.setState({"searched": true});
}
});
}
Wenn ich noch die zweite Art und Weise zu tun, kann ich brauche mehr Staaten zu definieren und passieren und changeXXX Funktionen in Komponenten.
Ich hoffe, jemand kann mir einige Best Practices von Requisiten geben.
- definieren
state
changeState
und in den äußersten Komponenten und definiert damit verbundene Funktion in jeder inneren Komponente. - Definieren
all state related function
in den äußersten Komponenten und Weitergabe an innere Komponenten als Requisiten.
Wenn Sie redux verwenden, möchten Sie den einen zentralen Speicher und dann die Aktionen ausführen, da Änderungen an diesem globalen Speicher/Zustand vorgenommen werden müssen. – cssko
@cssko Ich verwende 'connect', um den Status der Dispatch-Aktion im Layout zu erhalten. In meinem Beispiel ist 'geholt_result' der zurückgegebene Zustand. –