В чем точная разница между props и state? Довольно легко понять, как они работают, особенно если рассматривать их в контексте, но также немного сложнее понять их концептуально. Сначала это сбивает с толку, потому что они оба имеют абстрактные термины и их значения выглядят одинаково, но они также служат разным целям. Эта статья одновременно публикуется в моем блоге: 👉xueshiming.cn
Что на самом деле делает setState?
setState()Планирует обновление объекта состояния компонента. когдаstateВ случае изменения компонент будет повторно визуализирован.
В чем разница между состоянием и реквизитом?
props(“properties” 的缩写)а такжеstateобычныеJavaScriptобъект. Оба они используются для сохранения информации, которая может управлять выводом рендеринга компонента, и между ними есть несколько важных различий:
-
propsпередается компоненту (аналогично параметрам функции), аstateуправляется самим компонентом внутри компонента (аналогично переменным, объявленным внутри функции). -
propsнеизменно, всеReactКомпоненты должны защищать своиpropsне изменился. из-заpropsпередаются, и их нельзя изменить, поэтому мы можем использовать любыеpropsизReactкомпоненты рассматриваются какpureComponent, то есть при одном и том же вводе он всегда будет отображать один и тот же вывод. -
stateсоздается в компоненте, обычно вconstructorинициализирован вstate -
stateизменчива и модифицируема каждый разsetStateобновляются асинхронно.
Почему setState дает мне неправильное значение?
существуетReactсередина,this.propsа такжеthis.stateОба представляют значение, которое было визуализировано, то есть значение, отображаемое в данный момент на экране.
передачаsetStateна самом деле асинхронный - не рассчитывайте на вызовsetStateПозже,this.stateнемедленно сопоставляется с новым значением. Если вам нужно обосновать текущийstateчтобы вычислить новое значение, вы должны передать функцию, а не объект (подробности см. ниже).
Пример, когда код ведет себя не так, как ожидалось:
incrementCount() {
// 注意:这样 *不会* 像预期的那样工作。
this.setState({count: this.state.count + 1});
}
handleSomething() {
// 假设 `this.state.count` 从 0 开始。
this.incrementCount();
this.incrementCount();
this.incrementCount();
// 当 React 重新渲染该组件时,`this.state.count` 会变为 1,而不是你期望的 3。
// 这是因为上面的 `incrementCount()` 函数是从 `this.state.count` 中读取数据的,
// 但是 React 不会更新 `this.state.count`,直到该组件被重新渲染。
// 所以最终 `incrementCount()` 每次读取 `this.state.count` 的值都是 0,并将它设为 1。
// 问题的修复参见下面的说明。
}
Итак, как мне обновить те, которые зависят от текущего
stateизstateШерстяная ткань?
ДатьsetStateПередача функции вместо объекта гарантирует, что при каждом вызове будет использоваться последняя версияstate.
В чем разница между передачей объекта в setState и передачей функции?
Передача функции дает вам доступ к текущемуstateценность . потому чтоsetStateВызовы группируются, поэтому вы можете связать обновления и убедиться, что они построены один поверх другого, чтобы они не конфликтовали:
incrementCount() {
this.setState((state) => {
// 重要:在更新的时候读取 `state`,而不是 `this.state`。
return {count: state.count + 1}
});
}
handleSomething() {
// 假设 `this.state.count` 从 0 开始。
this.incrementCount();
this.incrementCount();
this.incrementCount();
// 如果你现在在这里读取 `this.state.count`,它还是会为 0。
// 但是,当 React 重新渲染该组件时,它会变为 3。
}
Когда setState асинхронный?
В настоящее время внутри обработчика событийsetStateявляется асинхронным. (В16.10)
Например, еслиParentа такжеChildВ то же самоеclickсобытие называетсяsetState, что гарантирует, чтоChildОн не будет перерисовываться дважды. заменяется,ReactГотовыstateДождитесь завершения события браузера, а затем равномерно обновите его. Этот механизм может дать хороший прирост производительности в больших приложениях.