Основное различие между состоянием и реквизитом заключается в том, что реквизит является неизменным. Вот почему компонент контейнера должен определять состояние, которое может быть обновлено и изменено, в то время как дочерние компоненты должны только передавать данные из состояния с помощью реквизита.
Использование реквизита
Когда нам нужны неизменяемые данные в нашем компоненте, мы можем просто добавить реквизиты для функции responseDOM.render () в main.js и использовать их внутри нашего компонента.
App.jsx
import React from 'react'; class App extends React.Component { render() { return ( <div> <h1>{this.props.headerProp}</h1> <h2>{this.props.contentProp}</h2> </div> ); } } export default App;
main.js
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.jsx'; ReactDOM.render(<App headerProp = "Header from props..." contentProp = "Content from props..."/>, document.getElementById('app')); export default App;
Это даст следующий результат.
Реквизит по умолчанию
Вы также можете установить значения свойств по умолчанию непосредственно в конструкторе компонента, вместо того, чтобы добавлять его в элементactDom.render () .
App.jsx
import React from 'react'; class App extends React.Component { render() { return ( <div> <h1>{this.props.headerProp}</h1> <h2>{this.props.contentProp}</h2> </div> ); } } App.defaultProps = { headerProp: "Header from props...", contentProp:"Content from props..." } export default App;
main.js
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.jsx'; ReactDOM.render(<App/>, document.getElementById('app'));
Выход такой же, как и раньше.
Состояние и реквизит
В следующем примере показано, как объединить состояние и реквизиты в вашем приложении. Мы устанавливаем состояние в нашем родительском компоненте и передаем его по дереву компонентов с помощью реквизита . Внутри функции рендеринга мы устанавливаем headerProp и contentProp, используемые в дочерних компонентах.
App.jsx
import React from 'react'; class App extends React.Component { constructor(props) { super(props); this.state = { header: "Header from props...", content: "Content from props..." } } render() { return ( <div> <Header headerProp = {this.state.header}/> <Content contentProp = {this.state.content}/> </div> ); } } class Header extends React.Component { render() { return ( <div> <h1>{this.props.headerProp}</h1> </div> ); } } class Content extends React.Component { render() { return ( <div> <h2>{this.props.contentProp}</h2> </div> ); } } export default App;
main.js
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.jsx'; ReactDOM.render(<App/>, document.getElementById('app'));
Результат снова будет таким же, как и в предыдущих двух примерах, единственное, что отличается, это источник наших данных, который теперь изначально исходит от государства . Когда мы хотим обновить его, нам просто нужно обновить состояние, и все дочерние компоненты будут обновлены. Подробнее об этом в главе «События».