TLDR; Это не ошибка в документации.
Для дальнейшего объяснения, скажем, у нас есть два компонента Parent
и Child
.
Это было бы неправильным использованием состояния в Child
component:
class Parent extends Component {
constructor(props) {
super(props);
this.state = {
foo: 'bar'
}
}
render() {
return <Child foo={this.state.foo} />
}
}
class Child extends Component {
constructor(props) {
super(props);
this.state = {
foo: props.foo // this is unncessesary, we've just duplicated props
}
}
render() {
return <div>{this.state.foo}</div>
}
}
Исходя из представленных вопросов, нам не нужно foo
в состоянии Child
. Вместо этого мы должны ссылаться на него через props
:
render() {
return <div>{this.props.foo}</div>
}
Но это не значит, что foo
не может находиться в состоянии Parent
(до тех пор, пока он удовлетворяет вопросы в своем собственном контекст). Поскольку в настоящее время это не так, скажем, Parent
изменения foo
при нажатии кнопки:
class Parent extends Component {
constructor(props) {
super(props);
this.state = {
foo: 'bar'
}
}
render() {
return
<div>
<Child foo={this.state.foo} />
<button onClick={() => this.setState({ foo: 'You clicked me!' })}>Click Me</button>
</div>
}
}
Теперь foo
в Parent
удовлетворяет перечисленным вопросам, чтобы квалифицировать его как состояние, поскольку оно изменяется через некоторое время. Однако он не квалифицируется как состояние в контексте Child
, поскольку Child
не изменяет значение, оно просто отображает его.
Не всегда все так просто. Вот почему вопросы такие, какие они есть. Там не написано "Никогда не создавай государство на основе реквизита". Иногда это именно то, что вы хотите сделать.
Давайте рассмотрим пример: скажем, Child
имеет текстовый ввод, и мы хотим, чтобы Parent
сказал ему, каким должен быть текст по умолчанию.
class Parent extends Component {
render() {
return <Child default_text="This is what you wanted to type right?" />
}
}
class Child extends Component {
constructor(props) {
super(props);
this.state = {
text: props.default_text // Now it serves a purpose!
}
}
render() {
return (
<input
value={this.state.text}
onChange={(e) => this.setState({ text: e.target.value })}
/>
)
}
}
Теперь мы имеем переломил ситуацию. props
используется для инициализации state
в Child
, но на этот раз имеет смысл, потому что значение будет меняться со временем. Принимая во внимание, что больше не имеет смысла иметь state
в Parent
, потому что это просто значение по умолчанию и оно не изменится.
Надеюсь, это немного больше смысла.