Gibt es in React echte Unterschiede zwischen diesen beiden Implementierungen? Einige Freunde sagen mir, dass die FirstComponent das Muster ist, aber ich verstehe nicht warum. Die SecondComponent scheint einfacher zu sein, da das Rendern nur einmal aufgerufen wird.
Zuerst:
import React, { PropTypes } from 'react'
class FirstComponent extends React.Component {
state = {
description: ''
}
componentDidMount() {
const { description} = this.props;
this.setState({ description });
}
render () {
const {state: { description }} = this;
return (
<input type="text" value={description} />
);
}
}
export default FirstComponent;
Zweite:
import React, { PropTypes } from 'react'
class SecondComponent extends React.Component {
state = {
description: ''
}
constructor (props) => {
const { description } = props;
this.state = {description};
}
render () {
const {state: { description }} = this;
return (
<input type="text" value={description} />
);
}
}
export default SecondComponent;
Update: Ich habe setState () in this.state = {} geändert (danke joews). Ich sehe jedoch immer noch keinen Unterschied. Ist einer besser als der andere?
javascript
reactjs
components
Levy Moreira
quelle
quelle
this.state = { isVisible: props.isVisible }
sinnvoll. Hängt davon ab, wie die App den UI-Status verteilt.Antworten:
Es sollte beachtet werden, dass es ein Anti-Pattern ist, Eigenschaften zu kopieren, die sich nie in den Status ändern (in diesem Fall einfach direkt auf .props zugreifen). Wenn Sie eine Statusvariable haben, die sich irgendwann ändert, aber mit einem Wert von .props beginnt, benötigen Sie nicht einmal einen Konstruktoraufruf. Diese lokalen Variablen werden nach einem Aufruf des Konstruktors des übergeordneten Elements initialisiert:
Dies ist eine Kurzform, die der Antwort von @joews unten entspricht. Es scheint nur auf neueren Versionen von es6-Transpilern zu funktionieren. Ich hatte Probleme damit bei einigen Webpack-Setups. Wenn dies bei Ihnen nicht funktioniert, können Sie versuchen, das Babel-Plugin hinzuzufügen
babel-plugin-transform-class-properties
, oder Sie können die Nicht-Kurzschrift-Version von @joews unten verwenden.quelle
Sie müssen keine
setState
Komponenten aufrufenconstructor
- es ist idiomatisch,this.state
direkt festzulegen :Siehe React docs - Hinzufügen eines lokalen Status zu einer Klasse .
Die erste Methode, die Sie beschreiben, hat keinen Vorteil. Unmittelbar vor dem ersten Mounten der Komponente wird ein zweites Update durchgeführt.
quelle
setState
wenn Sie es an einem anderen Punkt mutieren, da die Änderungen sonst möglicherweise nicht gerendert werden.super(props)
im Konstruktor. Diskussion über SOUpdate für React 16.3 Alpha eingeführt
static getDerivedStateFromProps(nextProps, prevState)
( docs ) als Ersatz fürcomponentWillReceiveProps
.https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops
Es ist statisch, daher ist es nicht direkten Zugriff hat
this
(allerdings hat es Zugang zu habenprevState
, die Dinge normalerweise angebracht speichern könntethis
zBrefs
)bearbeitet, um die Korrektur von @ nerfologist in den Kommentaren wiederzugeben
quelle
getDerivedStateFromProps
(die Großbuchstaben in Props markiert) und die params sindnextProps
,prevState
(nichtnextState
): reactjs.org/docs/...getDerivedStateFromProps
immer vor dem anfänglichen Rendern aufgerufen wird?Sie können die folgende Kurzform verwenden, wenn Sie alle Requisiten hinzufügen möchten, um dieselben Namen anzugeben und beizubehalten.
quelle
Stellen Sie die Statusdaten im Konstruktor wie folgt ein
Es wird nicht funktionieren, wenn Sie die Methode side componentDidMount () über Requisiten festlegen.
quelle
quelle
state = props
. Weitere Infos hier: github.com/facebook/react/pull/11658#issuecomment-419677176Sie können den
key
Wert verwenden, um den Status bei Bedarf zurückzusetzen, und Requisiten übergeben, um zu bestätigen, dass dies keine gute Vorgehensweise ist, da Sie eine unkontrollierte und kontrollierte Komponente an einem Ort haben. Daten sollten an einem Ort verarbeitet werden. Lesen Sie diese https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a -Schlüsselquelle
Sie können componentWillReceiveProps verwenden.
quelle
Du musst vorsichtig sein , wenn Sie initialisieren
state
vonprops
im Konstruktor. Selbst wennprops
der Status auf einen neuen geändert würde, würde er nicht geändert, da das Mount nie wieder vorkommt. AlsogetDerivedStateFromProps
existiert dafür.quelle