状态和道具之间的主要区别props是不可变的。这就是为什么容器组件应定义可以更新和更改的状态,而子组件应仅使用prop从状态传递数据的原因。
当我们需要在组件中使用不可变数据时,我们可以在main.js中的reactDOM.render()函数中添加道具,并在组件中使用它。
import React from 'react'; class App extends React.Component { render() { return ( <div> <h1>{this.props.headerProp}</h1> <h2>{this.props.contentProp}</h2> </div> ); } }
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;
这将产生以下结果。
您还可以直接在组件构造函数上设置默认属性值,而不是将它添加到 reactDom.render ()元素中。
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;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.jsx'; ReactDOM.render(<App/>, document.getElementById('app'));
输出与以前相同。
以下示例显示了如何state在应用中进行合并和支持。我们在父组件中设置状态,然后使用props将其传递到组件树中。在render函数内部,我们正在设置headerProp并contentProp在子组件中使用。
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;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.jsx'; ReactDOM.render(<App/>, document.getElementById('app'));
结果将再次与前两个示例相同,唯一不同的是我们的数据源,该数据源最初来自state。当我们想要更新它时,我们只需要更新状态,所有子组件都将被更新。