react组件通讯props

82 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一 组件通讯介绍

  • 组件是独立且封闭的单元,默认情况下,只能使用组件自己的数据.

  • 为了实现多个组件之间共享数据,就需要打破组件的独立封闭性,让组件与外界沟通,这个过程就是组件通讯.

  • 组件是封闭的,要接收外部数据通过props来实现.

二 组件通讯使用

1 函数组件通讯

使用步骤

1 定义一个模板:组件里由props对象的属性值占位

2 给模板设置具体的值:给组件标签添加属性

代码

import React from "react";
import ReactDOM from "react-dom";
 
//1 定义一个模板:组件里由props对象的属性值占位
//props是一个对象
const Hello = props => {
    console.log(props)
    return (
        <div>
            <h1>name:{props.name}</h1>
            <h1>age:{props.age}</h1>
        </div>
    )
}
 
//2 给模板设置具体的值:给组件标签添加属性
ReactDOM.render(<Hello name='妹妹' age='3'/>, document.getElementById("root"));

说明

  • Hello组件的两个h1标签的内容就相当于一个模板,内容使用了props.name和props.age的占位

  • Hello组件有2个属性 name和age ,这两个属性会组成一个对象props来进行数据传递,最终数据会展示在模板里

效果

控制台

2 类组件通讯

import React from "react";
import ReactDOM from "react-dom";
 
class Hello extends React.Component{
    render(){
        return (
            <div>
                <h1>name:{this.props.name}</h1>
                <h1>age:{this.props.age}</h1>
            </div>
        )
    }
}
 
 
ReactDOM.render(<Hello name='妹妹' age='3'/>, document.getElementById("root"));

备注: this.props不能改变名字

效果

三 props的特点

1 传递数据时,可以传递任意类型的数据

比如传递字符串、数字、数组、函数、JSL表达式

字符串: 属性加引号表示传递的是字符串类型
数字: {数字}表示传递的是数字类型
数组: {[]}可以传递数组
函数: {()=>{}}
JSL表达式: {<p>这是jsl表达式</p>}

代码

import React from "react";
import ReactDOM from "react-dom";
 
class Hello extends React.Component {
   
    render() {
        console.log(this.props)
        //调用函数
        this.props.fn();
        //解构数组:其他名字
        const [name1,name2,name3]=this.props.nameOther
        return (
            <div>
                <h1>name:{this.props.name}</h1>
                <h1>age:{this.props.age}</h1>
                <h1>其他名字:{name1},{name2},{name3}</h1>
                {this.props.tag}
            </div>
        )
    }
}
 
 
ReactDOM.render(<Hello
    name='妹妹'
    age={3}
    nameOther={["小糯米", "小狗狗", "婵妹妹"]}
    fn={()=> console.log("这是一个函数")}
    tag={<p>这是jsl表达式</p>}
/>, document.getElementById("root"));

效果

 控制台

2 props是只读的对象,不能修改传过来对象的属性值

尝试修改props的name属性的值

控制台报错如下

3 使用类组件时,如果写了构造函数,应该将props传递给super()

否则无法在构造函数中获取到props

将props传递给构造函数的super()