React学习笔记(4)React组件进阶

组件通讯介绍

组件是封闭独立的单元,默认情况下,只能使用组件自己的数据。在组件化过程中,我们将一个完整的功能拆分成多个组件,以更好的完成整个应用的功能。在这个过程中,多个组件之间不可避免的要共享某些数据。为了实现这些功能,就需要打破组件的独立封闭性,让其与外界沟通,这个过程就是组件通讯。

组件的props

  • 组件是封闭的,接收外部数据通过props来实现
  • props的作用:接收传递给组件的数据
  • 传递数据:给组件标签添加属性
  • 接收数据:函数组件通过参数props接收数据,类组件通过this.props接收数据
    函数组件传递数据
const Context = props=>{
    console.log(props)
    return (
        <div>
            <h1>props:{props.name}</h1>
        </div>
    )
}

类组件传递数据

 class Context extends Component {
     constructor(props){
         super(props)
         console.log(this.props)
     }
    render() {
        console.log(this.props)
        return (
            <div>
                <h1>props:{this.props.age}</h1>
            </div>
        )
    }
}

props使用注意:
可以给组件传递任意类型的数据,数组,数值,字符串…
props是只读的对象,只能读取属性的值,无法修改对象
注意,使用类组件时,构造函数中应该将props传递给super(),否则构造函数中无法获取props

组件通讯三种方式

父组件数据传递给子组件
1、父组件提供要传递的state数据
2、给子组件标签添加属性,值为state中的数据
3、子组件通过props接收父组件中传递的数据

import React, { Component } from 'react'
export default class Parent extends Component {
    state = {
       lastname:"Mary",
    }
    render() {
        return (
            <div className = "parent">
                <Child1 name = {this.state.lastname} /> 
            </div>
        )
    }
}

import React, { Component } from 'react'
export default class Child1 extends Component {
    render() {
        return (
            <div className = "child">
                 <p>子组件,接收父组件的数据为:{this.props.name}</p>
            </div>
        )
    }
}

子组件传递数据到父组件

思路:利用回调函数,父组件提供一个回调函数,子组件调用回调函数,并将要传递的数据作为回调函数的参数传递给父组件
1、父组件提供一个回调函数(用于接收数据)
2、将该函数作为属性的值传递给子组件
3、子组件通过props调用回调函数
4、将子组件的数据作为参数传递给回调函数
注意回调函数中this指向问题。
回调函数

 getChildMsg = msg=>{
        console.log("接收子组件数据",msg)
        this.setState({
            parentMsg:msg
        })
    }

传递到子组件

  <Child1 name = {this.state.lastname} getMsg = {this.getChildMsg}/>

子组件调用

 state = {
        childMsg:"hahaha"
    }
    handleClick = ()=>{
        //子组件调用父组件传递的函数
        this.props.getMsg(this.state.childMsg)
    }

兄弟组件传递数据

状态提升:将共享状态提升到最近的公共父组件中,由公共父组件管理这个状态
公共父组件:1、提供共享状态2、提供操作共享状态的方法
要通讯的子组件只需要通过props接收状态或者操作状态的方法。
父组件提供状态与操作状态的方法

 state = {
       // lastname:"Mary",
        //parentMsg:'',
        count:0//父组件提供共享状态

    }
    onIncrement=()=>{
        this.setState({
            count:this.state.count+1
        })
    }

子组件获取状态与修改状态

 <Child1 count = {this.state.count}/>
 <Child2 add = {this.onIncrement}/>

子组件1展示数据

<h1>计数器:{this.props.count}</h1>

子组件2修改数据的方法

 <button onClick={()=>{this.props.add()}}>+1</button>

Context多层组件之间数据传递
组件层层嵌套,使用props一层层向下传递数据
使用Context可以跨组件传递数据
使用步骤

1、调用React.createContext()创建Provider(提供数据), Consumer(消费数据)两个组件

const { Provider, Consumer } = React.createContext();

2、使用Provider作为父节点

<Provider value = "pinkkkk!!">
    <div className="app">
        <Node />
        app
    </div>
</Provider>

3、设置value属性,表示要传递的数据

 <Provider value = "pinkkkk!!">

4、调用Consumer组件接收数据

<Consumer>{data=><p>subnode--{data}</p>}</Consumer>

props深入
1、children属性

children属性:表示组件标签的子节点。当组件有子节点时,props就会有该属性

children属性与普通的props一样,值可以是任意值(文本、React元素,组件,或是函数)

2、props校验

对于组件来说,props是外来的,无法保证组件使用者传入什么格式的数据

如果传入数据格式不对,导致组件内部报错

关键问题:组件使用者不知明确的错误原因

props校验:允许创建组件的时候,就指定props的类型、格式

作用:捕获使用组件时因为props导致的错误,给出明确的提示,增加组件的健壮性。

使用步骤:

安装包:prop-type(npm i prop-types)
导入prop-types包
使用组件名.propTypes={}给组件的props添加校验规则
具体规则由

约束规则

1、常见类型:array、bool、func、number、object、string
2、React元素类型:element
3、必填项:isRequired
4、特定结构的对象shape({ })
3、组件的默认值

给组件设置默认值,未传入props时生效

App.defaultProps = { pageSize : 10}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值