Я новичок в React.js Library, и я перебирал некоторые уроки, и я наткнулся на:
this.setState
this.replaceState
Указанное описание не очень ясное (IMO).
setState is done to 'set' the state of a value, even if its already set
in the 'getInitialState' function.
Аналогично,
The replaceState() method is for when you want to clear out the values
already in state, and add new ones.
Я попробовал this.setState({data: someArray});
, а затем this.replaceState({test: someArray});
, а затем console.logged, и я обнаружил, что state
теперь имеет как data
, так и test
.
Затем я попробовал this.setState({data: someArray});
, а затем this.setState({test: someArray});
, а затем console.logged, и я обнаружил, что state
снова имел как data
, так и test
.
Итак, в чем же разница между двумя?
С setState
текущее и предыдущее состояния объединяются. С replaceState
он выдает текущее состояние и заменяет его только тем, что вы предоставляете. Обычно setState
используется, если вам действительно не нужно удалять ключи по какой-либо причине; но установка их в false/null обычно является более явной тактикой.
Пока это возможно, это может измениться; replaceState в настоящее время использует объект, прошедший как состояние, т.е. replaceState(x)
, и после установки this.state === x
. Это немного легче, чем setState
, поэтому его можно использовать в качестве оптимизации, если тысячи компонентов часто устанавливают свои состояния.
Я подтвердил это с помощью этого тестового примера.
Если ваше текущее состояние {a: 1}
, и вы вызываете this.setState({b: 2})
; когда приложение будет применено, оно будет {a: 1, b: 2}
. Если вы вызвали this.replaceState({b: 2})
, ваше состояние было бы {b: 2}
.
Боковое примечание: состояние не устанавливается мгновенно, поэтому при тестировании не выполняйте this.setState({b: 1}); console.log(this.state)
.
Определение по примеру:
// let say that this.state is {foo: 42}
this.setState({bar: 117})
// this.state is now {foo: 42, bar: 117}
this.setState({foo: 43})
// this.state is now {foo: 43, bar: 117}
this.replaceState({baz: "hello"})
// this.state. is now {baz: "hello"}
Обратите внимание на это из docs:
setState() не сразу мутирует this.state, но создает ожидающий переход состояния. Доступ к this.state после вызова этого метод может потенциально вернуть существующее значение.
То же самое относится к replaceState()
В соответствии с docs, replaceState
может устареть:
Этот метод недоступен для компонентов класса ES6, которые расширяют React.Component. Он может быть полностью удален в будущей версии React.