React---组件实例三大核心属性,二props
一、理解
- 每个组件对象都会有props(properties的简写)属性
- 组件标签的所有属性都保存在props中
- 通过标签属性从组件外向组件内传递变化的数据
二、作用
- 注意: 组件内部不要修改props数据
- 内部读取某个属性值
三、编码操作
- 内部读取某个属性值
this.props.name
2. 对props中的属性值进行类型限制和必要性限制
第一种方式(React v15.5 开始已弃用):
Person.propTypes = { name: React.PropTypes.string.isRequired, age: React.PropTypes.number }
第二种方式(新):使用prop-types库进限制(需要引入prop-types库)
Person.propTypes = { name: PropTypes.string.isRequired, age: PropTypes.number }
3. 扩展属性: 将对象的所有属性通过props传递
<Person {...person}/>
4. 默认属性值
Person.defaultProps = { age: 18, sex:'男' }
5. 组件类的构造函数
constructor(props){ super(props) console.log(props)//打印所有属性 }
三、案例
1. 类式组件使用props
<script type="text/babel"> //创建组件 class Person extends React.Component{ constructor(props){ //构造器是否接收props,是否传递给super,取决于:是否希望在构造器中通过this访问props // console.log(props); super(props) console.log('constructor',this.props); } //对标签属性进行类型、必要性的限制 static propTypes = { name:PropTypes.string.isRequired, //限制name必传,且为字符串 sex:PropTypes.string,//限制sex为字符串 age:PropTypes.number,//限制age为数值 } //指定默认标签属性值 static defaultProps = { sex:'男',//sex默认值为男 age:18 //age默认值为18 } render(){ // console.log(this); const {name,age,sex} = this.props //props是只读的 //this.props.name = 'jack' //此行代码会报错,因为props是只读的 return ( <ul> <li>姓名:{name}</li> <li>性别:{sex}</li> <li>年龄:{age+1}</li> </ul> ) } } //渲染组件到页面 ReactDOM.render(<Person name="jerry"/>,document.getElementById('test1')) </script>
2. 函数组件使用props
<script type="text/babel"> //创建组件 function Person (props){ const {name,age,sex} = props return ( <ul> <li>姓名:{name}</li> <li>性别:{sex}</li> <li>年龄:{age}</li> </ul> ) } Person.propTypes = { name:PropTypes.string.isRequired, //限制name必传,且为字符串 sex:PropTypes.string,//限制sex为字符串 age:PropTypes.number,//限制age为数值 } //指定默认标签属性值 Person.defaultProps = { sex:'男',//sex默认值为男 age:18 //age默认值为18 } //渲染组件到页面 ReactDOM.render(<Person name="jerry"/>,document.getElementById('test1')) </script>
四、展开运算符
1 <script type="text/javascript" > 2 let arr1 = [1,3,5,7,9] 3 let arr2 = [2,4,6,8,10] 4 console.log(...arr1); //展开一个数组 5 let arr3 = [...arr1,...arr2]//连接数组 6 7 //在函数中使用,参数个数不确定 8 function sum(...numbers){ 9 return numbers.reduce((preValue,currentValue)=>{ 10 return preValue + currentValue 11 }) 12 } 13 console.log(sum(1,2,3,4)); 14 15 //构造字面量对象时使用展开语法 16 let person = {name:'tom',age:18} 17 let person2 = {...person} 18 //console.log(...person); //报错,展开运算符不能展开对象 19 person.name = 'jerry' 20 console.log(person2); 21 console.log(person); 22 23 //合并 24 let person3 = {...person,name:'jack',address:"地球"} 25 console.log(person3); 26 27 </script>
五、组件通信总结
1.方式:
props:
(1).children props
(2).render props
消息订阅-发布:
pubs-sub、event等等
集中式管理:
redux、dva等等
context:
生产者-消费者模式
2.组件间的关系
父子组件:props
兄弟组件(非嵌套组件):消息订阅-发布、集中式管理
祖孙组件(跨级组件):消息订阅-发布、集中式管理、conText(用的少)