Props 是一个从外部传入组件的参数,主要用于从父组件向子组件传递数据。它具有只读性和不可变属性,组件内部无法控制也无法修改。除非外部组件主动传入新的 Props 来重新,否则组件的 Props 永远保持不变。
属性说明:
ref
、key
和 children
为保留属性,具有特殊用途,前两者并不会传给子组件true
import React, { Component, createRef } from 'react';import Child from './Child';class App extends Component {isPopular = false;refNode = createRef();render() {return [// 特殊属性 key 和 ref 为保留属性// 如果只给属性不给值,React 会默认解析成布尔值 `true`<Child key="react" ref={this.refNode} isPopular />,// 除了字符串,其他值都要用花括号包裹<Child key="vue" url="https://github.com/vuejs/vue" star={96500} />,<Child key="angular" owner="google" isPopular={this.isPopular} />,// 属性名驼峰写法<input type="text" tabIndex={-1} />,];}}export default App;
无论是使用函数或事类来声明一个组件,它都不能修改它自己的 Props。
function sum(a, b) {return a + b;}
类似上面的这种函数称为 纯函数。
纯函数具有几个特点:
React 是非常灵活的,但它也有一个严格的规则:所有的 React 组件必须像纯函数那样使用它们的 props。
如果 Props 渲染过程中可以被修改,那么就会导致这个组件显示形态和行为变得不可预测,这样会可能会给组件使用者带来困惑。
但这并不意味着 Props 决定的显示形态不能被修改。组件的使用者可以主动地通过重新渲染的方式把新的 Props 传入组件当中名,这样这个组件中由 Props 决定的显示形态也会得到相应的改变。
Props 的默认值 defaultProps
定义在类上。
目前 React 推崇使用 ES6 Class 语法创建组件,因此其内部只允许定义方法,而不能定义属性,Class 的属性只能定义在 Class 之外。
class Foo extends React.Component {render() {return <div>{this.props.bar}</div>;}}Foo.defaultProps = {bar: 'Hello world!',};
参考资料: