В React, есть ли реальные различия между этими двумя реализациями? Некоторые друзья говорят мне, что FirstComponent - это шаблон, но я не понимаю, почему. SecondComponent кажется проще, потому что рендеринг вызывается только один раз.
Первый:
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;
Во-вторых:
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;
Обновление: я изменил setState () на this.state = {} (спасибо joews), однако я до сих пор не вижу разницы. Один лучше других?
javascript
reactjs
components
Леви Морейра
источник
источник
this.state = { isVisible: props.isVisible }
имеет смысл. Зависит от того, как приложение распространяет состояние пользовательского интерфейса.Ответы:
Следует отметить, что копирование свойств, которые никогда не изменяются в состояние, является антипаттерном (в этом случае просто обращайтесь к .props напрямую). Если у вас есть переменная состояния, которая со временем изменится, но будет начинаться со значения из .props, вам даже не нужен вызов конструктора - эти локальные переменные инициализируются после вызова конструктора родителя:
Это стенографический эквивалент ответа из @joews ниже. Кажется, он работает только на более поздних версиях транспортеров es6, у меня были проблемы с ним при некоторых настройках веб-пакетов. Если это не работает для вас, вы можете попробовать добавить плагин babel
babel-plugin-transform-class-properties
, или вы можете использовать не сокращенную версию, используя @joews ниже.источник
Вам не нужно вызывать
setState
компонентыconstructor
- это идиоматично дляthis.state
прямой установки :См. React docs - Добавление локального состояния в класс .
Нет преимущества для первого метода, который вы описываете. Это приведет ко второму обновлению непосредственно перед монтированием компонента в первый раз.
источник
setState
если вы изменяете его в любой другой точке, иначе изменения могут не отображаться.super(props)
в конструкторе. Обсуждение SOВведено обновление для React 16.3 alpha
static getDerivedStateFromProps(nextProps, prevState)
( документы ) в качестве заменыcomponentWillReceiveProps
.https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops
Он статичен, поэтому не имеет прямого доступа к нему
this
(однако у него есть доступprevState
, который может хранить вещи, к которым обычно прикреплены,this
напримерrefs
)отредактировано, чтобы отразить исправление @ nerfologist в комментариях
источник
getDerivedStateFromProps
(отметьте заглавную букву в реквизите) и PARAMS являетсяnextProps
,prevState
(неnextState
): reactjs.org/docs/...getDerivedStateFromProps
он всегда вызывается перед начальным рендерингом?Вы можете использовать краткую форму, как показано ниже, если вы хотите добавить все реквизиты в состояние и сохранить те же имена.
источник
установить данные о состоянии внутри конструктора, как это
это не сработает, если вы установите в методе componentDidMount () стороны через props.
источник
источник
state = props
. Более подробная информация здесь: github.com/facebook/react/pull/11658#issuecomment-419677176Вы можете использовать
key
значение для сброса состояния, когда это необходимо, передать реквизиты, чтобы указать, что это не очень хорошая практика, потому что у вас есть неконтролируемый и контролируемый компонент в одном месте. Данные должны обрабатываться в одном месте, прочитайте это https://reactjs.org/blog/2018/06/07/you-probbly-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a -keyисточник
Вы можете использовать componentWillReceiveProps.
источник
ВЫ должны быть осторожны, когда вы инициализируете
state
изprops
конструктора. Даже если оно будетprops
изменено на новое, состояние не изменится, потому что mount никогда не повторится. ТакgetDerivedStateFromProps
существует для этого.источник