react中通过props实现父子组件间通信

一、父组件向子组件传值

在React中,无论是函数式组件还是类组件,都可以通过props实现父组件向子组件传值。以下是具体的示例说明:

1. 函数式组件通过props传值:

js 复制代码
// 父组件
function ParentComponent() {
  const message = "Hello, World!";

  return (
    <div>
      <ChildComponent message={message} />
    </div>
  );
}

// 子组件
function ChildComponent(props) {
  return <div>{props.message}</div>;
}

上述示例中,父组件通过将message作为props传递给子组件ChildComponent,子组件通过props.message获取父组件传递的值,并进行渲染。

2. 类组件通过props传值:

js 复制代码
// 父组件
class ParentComponent extends React.Component {
  render() {
    const message = "Hello, World!";

    return (
      <div>
        <ChildComponent message={message} />
      </div>
    );
  }
}

// 子组件
class ChildComponent extends React.Component {
  render() {
    return <div>{this.props.message}</div>;
  }
}

在类组件中,父组件通过<ChildComponent message={message} />的形式将值传递给子组件。子组件通过this.props.message获取父组件传递的值。

无论是函数式组件还是类组件,在使用props时,有以下几点需要注意:

  • props是只读的:在子组件中,无法直接修改父组件传递的props值,它们被认为是不可变的。
  • 在函数式组件中,props参数为函数的第一个参数,在类组件中,props通过this.props访问。

3. 一次性传递多个值的优雅传递方式

要一次性传递多个值,可以将所有值作为一个对象传递,并在子组件中使用解构赋值的方式一次性接收所有的props。

例如,假设有一个父组件Parent和一个子组件Child,现在需要从Parent向Child传递多个值:

js 复制代码
// Parent组件
import React from 'react';
import Child from './Child';

const Parent = () => {
  const propsData = {
    name: 'John',
    age: 25,
    gender: 'male',
    // 更多的props...
  };

  return <Child {...propsData} />;
}

export default Parent;


// Child组件
import React from 'react';

const Child = ({ name, age, gender }) => {
  // 在子组件中直接使用解构赋值方式接收所有的props
  return (
    <div>
      <p>Name: {name}</p>
      <p>Age: {age}</p>
      <p>Gender: {gender}</p>
      {/* 更多的渲染内容... */}
    </div>
  );
}

export default Child;

在父组件Parent中,将所有要传递的值以对象propsData的形式定义,并使用扩展运算符{...propsData}将所有属性扩展到Child组件的props中。

在子组件Child中,使用解构赋值方式一次性接收所有传递过来的props,然后可以按需使用这些props值。

这样做可以实现一次性传递多个值,并且在子组件中以优雅的方式一次性接受所有props。

二、子组件向父组件传值

在React中,无论是函数式组件还是类组件,都可以通过props来实现子组件向父组件传值。

1. 函数组件中

在函数式组件中,可以通过在子组件中定义一个事件处理函数,并将该事件处理函数作为prop传递给父组件。然后在子组件中可以调用该事件处理函数并传递需要传递的值,从而实现子组件向父组件传值。以下是一个示例:

父组件:

js 复制代码
import React, { useState } from 'react';
import ChildComponent from './ChildComponent';

function ParentComponent() {
  const [value, setValue] = useState('');

  const handleChildValue = (childValue) => {
    setValue(childValue);
  }

  return (
    <div>
      <ChildComponent onChildValue={handleChildValue} />
      <p>Value from child component: {value}</p>
    </div>
  );
}

export default ParentComponent;

子组件:

js 复制代码
import React from 'react';

function ChildComponent(props) {
  const handleClick = () => {
    props.onChildValue('Hello from child');
  }

  return (
    <button onClick={handleClick}>Click Me</button>
  );
}

export default ChildComponent;

在上述示例中,ParentComponent通过将handleChildValue函数传递给ChildComponent组件的onChildValue prop,实现了子组件向父组件传值。当子组件中的按钮被点击时,会调用handleClick函数并调用props.onChildValue将数据传递给父组件。

2. 类组件中

在类组件中也可以通过类似的方式实现子组件向父组件传值。下面是一个示例:

父组件:

js 复制代码
import React, { Component } from 'react';
import ChildComponent from './ChildComponent';

class ParentComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      value: ''
    };
  }

  handleChildValue = (childValue) => {
    this.setState({ value: childValue });
  }

  render() {
    return (
      <div>
        <ChildComponent onChildValue={this.handleChildValue} />
        <p>Value from child component: {this.state.value}</p>
      </div>
    );
  }
}

export default ParentComponent;

子组件:

js 复制代码
import React from 'react';

class ChildComponent extends React.Component {
  handleClick = () => {
    this.props.onChildValue('Hello from child');
  }

  render() {
    return (
      <button onClick={this.handleClick}>Click Me</button>
    );
  }
}

export default ChildComponent;

在上述示例中,父组件通过将handleChildValue函数传递给ChildComponent组件的onChildValue prop,实现了子组件向父组件传值。当子组件中的按钮被点击时,会调用handleClick函数并调用props.onChildValue将数据传递给父组件。

三、propTypes限制props

自React v15.5开始,PropTypes被独立出来作为独立的包。在该版本之前,PropTypes是作为React的一部分直接包含在react库中的。

在子组件中可以使用propTypes来限制父组件传递给子组件的props的数据类型,并可以设置默认值。使用propTypes需要先引入prop-types库。

下面是一个示例:

js 复制代码
import React from 'react';
import PropTypes from 'prop-types';

class ChildComponent extends React.Component {
  render() {
    return (
      <div>
        <h2>{this.props.title}</h2>
        <p>{this.props.description}</p>
      </div>
    );
  }
}

ChildComponent.propTypes = {
  title: PropTypes.string.isRequired, // 限制title必须为字符串类型且必传
  description: PropTypes.string // 限制description为字符串类型,非必传
}

ChildComponent.defaultProps = {
  description: "No description" // 设置description的默认值为"No description"
}

export default ChildComponent;

在上面的示例中,ChildComponent组件使用propTypes来限制title必须为字符串类型且必传,description为字符串类型,但非必传。如果父组件没有传递title,或传递的类型不是字符串,将会在控制台收到相应的警告。

另外,ChildComponent还使用defaultProps设置了description的默认值为"No description"。当父组件没有传递description时,将使用该默认值。

父组件使用ChildComponent时的使用示例:

js 复制代码
import React from 'react';
import ChildComponent from './ChildComponent';

class ParentComponent extends React.Component {
  render() {
    return (
      <div>
        <ChildComponent title="Hello" description="This is a child component" />
      </div>
    );
  }
}

export default ParentComponent;

在上面的示例中,ParentComponent传递了title和description给ChildComponent。title满足了限制的类型和必传的要求,而description也满足了限制的类型。

以下是常见的数据类型和PropTypes可以检测的类型:

数据类型 PropTypes检测的类型
数字 PropTypes.number
字符串 PropTypes.string
布尔 PropTypes.bool
数组 PropTypes.array
对象 PropTypes.object
函数 PropTypes.func
符号 PropTypes.symbol
元素类型 PropTypes.element
任何类型 PropTypes.any
自定义类型 PropTypes.instanceOf(MyClass)
一组类型 PropTypes.oneOfType([PropTypes.number, PropTypes.string])
限制可选值 PropTypes.oneOf(['red', 'blue'])
限制特定类型的数组 PropTypes.arrayOf(PropTypes.number)
限制特定类型的对象 PropTypes.objectOf(PropTypes.number)
限制对象具有特定属性 PropTypes.shape({ name: PropTypes.string, age: PropTypes.number })
相关推荐
崔庆才丨静觅12 分钟前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60611 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了1 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅1 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅2 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅2 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment2 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅2 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊2 小时前
jwt介绍
前端
爱敲代码的小鱼2 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax