IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> React学习笔记(4)React组件进阶 -> 正文阅读

[JavaScript知识库]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}

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:18:45  更:2021-08-17 15:20:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 16:51:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计