React 如何实现组件传值

本文详细介绍了React中组件间的数据传递,包括正向传值(props)、逆向传值(事件回调函数)以及跨组件传值(Context API)。通过实例解析,帮助开发者掌握在不同场景下如何有效地在React组件间传递数据。

正向传值–使用 props(父发送数据,子接收数据)

逆向传值—函数传值

  1. 子组件通过事件调用函数传递
  2. 在子组件中使用 this.props.调用的函数名绑定发送数据
  3. 在父组件中进行函数传递
  4. 同级传值—pubsub-js
  5. 在第一个要传值的组件中进行数据抛出 PubSub.publish(" 事件名","数据")
  6. 在第二个要接收数据的组件中接收 PubSub.subscribe("监听的事件",(事件,数 据)=>{})

跨组件传值—context

  1. src 下创建文件夹与.jsx 文件用来容纳 context 对象
  2. 创建内容并且引用 createContext 对象
  3. 在根组件 index.js 中使用
  4. 创建 Provider 生产者与 Consumer 消费者对象并且创建数据
  5. 在需要的组件中进行使用
React组件有多种方法,具体如下: ### 父组件向子组件(通过props) 基本原理是在React中,props(属性)是父组件向子组件递数据的主要方式。父组件在渲染子组件时,将数据作为属性递给子组件,子组件通过函数参数接收这些属性。组件还可通过构造器的参数 `props` 接收父组件通过属性入的数据,在模板中使用 `this` 打点调用;且 `props` 是只读的,不能修改 [^1][^3]。 示例代码如下: ```jsx // 父组件 ReactDOM.render( <div> <MyCom1 name="张三"/> <MyCom2 age="20"/> </div>, document.getElementById('example') ) // 子组件 class MyCom2 extends React.Component{ constructor(props) { super(props); console.log(props); this.state = {sex: "男"} } render() { return <div>组件2-{this.props.age}-{this.state.sex}</div> } } ``` ### 不能直接在子组件修改父组件来的数据 在 React 中,数据流是向下的,不能在组件中修改 `props` 里的属性。若要修改数组等数据,需要通过一个载体将子组件中的入到父组件,并在父组件中对数组进行修改 [^2]。 ### 插槽 文档中未详细说明插槽的具体原理和代码示例,但提到了这种方式 [^3]。 ### 跨层级组件(Context API) 爷爷组件拿到,通过 `Provider` 递,父组件和儿子组件无需处理,孙子组件通过 `Consumer` 直接获取。爷爷组件引用父组件,父组件引用儿子组件,儿子组件引用孙子组件 [^4]。 示例代码如下: ```jsx // 爷爷组件(App.js) import React from 'react'; import Middle from './Middle' export const {Provider, Consumer} = React.createContext() class App extends React.Component { constructor (props){ super(props) this.state={ money:25 } } render(){ return ( <Provider value={this.state.money}> <Middle></Middle> </Provider> ) } } export default App; // 父组件(Middle.js) import React from 'react'; import Son from './Son' class Middle extends React.Component { render() { return ( <Son /> ) } } export default Middle; // 孙子组件(Son.js) import React from 'react'; import { Consumer } from "./App"; class Son extends React.Component{ render(){ return( <Consumer> {value => <h1>我是接收祖辈的:{value}</h1>} </Consumer> ) } } export default Son ``` ### 兄弟组件(Event Bus) 通过事件总线来实现兄弟组件之间的。在一个组件中添加事件监听,在另一个组件中触发事件,从而实现数据递。例如在兄弟组件 B 中接收数据并在处理监听事件时进行打印 [^5]。 示例代码如下: ```jsx // 兄弟组件B(Footer.js) import React, { Component } from 'react' import eventBus from './event' export class Footer extends Component { componentDidMount() { eventBus.addListener('sayHello', this.sayHelloContent) } sayHelloContent(a, b) { console.log(a, b) } componentWillUnmount() { eventBus.removeListener('sayHello', this.sayHelloContent) } render() { return ( <div>Footer</div> ) } } export default Footer ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值