React-进阶

 目录

一、组件通讯

(一)父传子

(二)子传父

(三)兄弟组件间通讯

(四)跨组件传递数据(Context)

二、深入了解props

(一)children属性

(二)props校验

(三)props校验-约束规则

(四)props的默认值

三、组件的生命周期

(一)创建时(挂载阶段)

(二)更新时(更新阶段)

(三)卸载时(卸载阶段)

四、React组件复用

(一)概述

(二)render props模式

1、使用步骤(以复用获取鼠标位置为例)

2、使用children代替render属性(推荐)

3、代码优化

(三)高阶组件

1、使用步骤

2、设置displayName


一、组件通讯

(一)父传子

通过props传递

class Parent extends React.Component {
  state = {
    number: '123456'
  }
  render() {
    return (
        <div>
          <Child number = {this.state.number}/>
        </div>
    )
  }
}

function Child(props) {
  return <div>接收number:{props.number}</div>
}

ReactDOM.render(<Parent/>, document.getElementById('root'))

(二)子传父

利用回调函数,父组件提供回调,子组件调用,将要传递的数据作为回调函数的参数

class Parent extends React.Component {
  getChildMsg = msg => {
    console.log(msg)
  }
  render() {
    return (
        <div>
          <Child getMsg = {this.getChildMsg}/>
        </div>
    )
  }
}

class Child extends React.Component {
  state = {
    childMsg: 'Hello React'
  }
  handleClick = () => {
    this.props.getMsg(this.state.childMsg)
  }
  render() {
    return (
        <button onClick={this.handleClick}>点击后父组件打印子组件传递数据</button>
    )
  }
}

ReactDOM.render(<Parent/>, document.getElementById('root'))

(三)兄弟组件间通讯

  • 将共享状态提升到最近的公共父组件中,由公共父组件管理这个状态
  • 公共父组件职责:1、提供共享状态         2、提供操作共享状态的方法
  • 要通讯的子组件只需要通过props接收状态或操作状态的方法
class Parent extends React.Component {
  state = {
    number: 0
  }
  addClick = () => {
    this.setState({
      number: this.state.number+1
    })
  }
  render() {
    return (
        <div>
          <Child1 number={this.state.number}/>
          <Child2 addClick={this.addClick}/>
        </div>
    )
  }
}

const Child1 = props => {
  return (
      <div>
        number:{props.number}
      </div>
  )
}
const Child2 = props => {
  return (
      <button onClick={() => props.addClick()}>+1</button>
  )
}
ReactDOM.render(<Parent/>, document.getElementById('root'))

(四)跨组件传递数据(Context)

作用:跨组件传递数据,比如主题、语言等;如果两个组件是远方亲戚(比如嵌套多层),则可以使用Context实现组件通讯

步骤:

  1. 调用React.createContext()创建Provider(提供数据)和Consumer(消费数据)两个组件
  2. 使用Provider组件作为父节点
  3. 设置value属性,表示要传递的数据
  4. 使用Consumer组件接收数据

例子:当APP是Child的父组件的父组件的父组件时,用props传值太过麻烦,因此用Context代替

// 1、创建context得到两个组件
const { Provider, Consumer} = React.createContext()

class App extends React.Component {
  render() {
    return (
        // 2、使用Provider组件作为父节点+3、设置value属性,表示要传递的数据
        <Provider value="pink">
          <div>
            <Node/>
          </div>
        </Provider>
    )
  }
}

const Node = props => {
  return (
      <div>
        <SubNode/>
      </div>
  )
}
const SubNode= props => {
  return (
      <div>
        <Child/>
      </div>
  )
}

const Child = props => {
  return(
      // 4、使用Consumer组件接收数据
      <div>
        <Consumer>
          {
            data => <span>我是子节点: {data}</span>
          }
        </Consumer>
      </div>
  )
}
ReactDOM.render(<App/>, document.getElementById('root'))

二、深入了解props

(一)children属性

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

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

const APP &#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值