React Hook组件间传值 与 React类式组件传值【兄弟组件+父子组件】

一、 React Hook

1-1 父组件传值给子组件(props)

  1. 父组件想传递任何东西,都可以通过props来传递给子组件。

    • 例如:变量,函数、jsx组件等等。
import React, { useState } from 'react';

// 父组件
const PropsCom = () => {
   const [name, setName] = useState('niutt');

   return (
       <div>
           <h2>父组件</h2>
           {/* 这里是重要代码,向子组件传递parentName这个prop,值为name变量 */}
           <ChildrenCom parentName={name} />
       </div>
   );
};

// 子组件
const ChildrenCom = (props) => (
   <div>
       <h4>子组件</h4>
       <p>获取父组件传过来的值:{props.parentName}</p>
   </div>
);

export default PropsCom;


1-2 爷爷给孙子组间传值(context)

使用context可以实现跨组件传值

  1. const value = useContext(MyContext);

    • useContext接收一个 context 对象(React.createContext 的返回值)并返回该 context 的当前值。
    • 当前的 context 值由上层组件中距离当前组件最近的 <MyContext.Provider> 的 value prop 决定。

1-2-2 举例子:

请添加图片描述

1、 首先我们新建个createContext.js文件(方便扩展和引用)

// createContext.js文件
import { createContext } from 'react';

const myContext = createContext(null);

export default myContext;


2、 在index.js文件写如下代码(我们的最顶层Test组件)

import React, { useReducer } from 'react';
import { Button } from 'antd';

import myContext from './createContext';
import BrotherTest from './BrotherTest';

const reducer = (state, action) => {
    const [type, payload] = action;
    switch (type) {
        case 'set':
            return {
                ...state,
                ...payload,
            };
        default:
            return {
                ...state,
                ...payload,
            };
    }
};

const initData = {
    count: 0,
    text: 'Text-顶层组件',
};

const Test = () => {
    const [state, dispatch] = useReducer(reducer, initData);

    return (
        <div style={{ backgroundColor: '#f2f2f2' }}>
            <h1>
                Test最顶层组件----实现跨组件间传值。
            </h1>
            <Button
                onClick={() => {
                    dispatch(['set', { count: state.count + 1 }]);
                }}
            >
                点我修改count
            </Button>
            <Button
                onClick={() => {
                    dispatch([
                        'set',
                        { text: '最顶层组件Test修改了自己的text---' },
                    ]);
                }}
            >
                点我修改text
            </Button>
            <br />
            Test组件的最顶层组件----count:{state.count}
            <br />
            Test组件的最顶层组件----text:{state.text}
            <br />
            <myContext.Provider value={{
                count: state.count,
                text: state.text,
                // 把最顶层Test组件的dispatch传递下去给后代组件,这样后代组件就都能修改最顶层组件的数据了。
                proDispatch: dispatch,
            }}
            >
                {/* 子组件 */}
                <BrotherTest />
            </myContext.Provider>
        </div>
    );
};

export default Test;


  1. 在BrotherTest.js和InTest.js文件中写入如下代码
    • 从截图中可以看到,通过context上下文这种方式,我们能实现跨组件的传值和操作,不需要再一层一层通过props来传值。
      在这里插入图片描述

1-3 子组间传值给父组件(父组件props传递回调函数)

类似于 Vue : 【Vue基础九】–父子组件传值

  1. 如果子组件想向父组件传递某些值,或者是子组件在执行某一段逻辑后想执行父组件中的某一段逻辑,此时可以在父组件中写好对应的逻辑函数,通过props传递这个函数给子组件进行调用即可。
import React, { useState } from 'react';
import { Button } from 'antd';

// 父组件
const CallbackCom = () => {
    const [count, setCount] = useState(0);

    // 获取子组件传过来的value值并设置到count,val参数就是子组件的value值
    const getChildrenValue = (val) => {
        setCount(val);
    };

    return (
        <div>
            <h2>父组件</h2>
            <p>获取子组件传过来的值:{count}</p>
            {/* 这里是重要代码,向子组件传递getValue这个prop,它的值是一个回调函数 */}
            <ChildrenCom getValue={getChildrenValue} />
        </div>
    );
};

// 子组件
const ChildrenCom = (props) => {
    const [value, setValue] = useState(0);

    const addValue = () => {
        setValue(value + 1);
        // 向父组件传递每次递增的value值
        props.getValue(value + 1);
    };

    return (
        <div>
            <h4>子组件</h4>
            <Button onClick={addValue}>点击改变子组件的value值:{value}</Button>
        </div>
    );
};

export default CallbackCom;


二、 React类式组件传值

2-1 兄弟传值

react中使用event事件总线

  • 直接贴在下面了,方便我到时候翻阅文章,哈哈

①:首先先安装events插件

  • npm install events --save

②:新建一个文件,然后引入events,相当于Vue里的Bus

请添加图片描述

③:接受参数兄弟组件

下面这样写法已经弃用了:

请添加图片描述

改为下面的写法:

请添加图片描述

④:触发监听事件传递参数的兄弟组件

请添加图片描述

2-2 父子通信

和函数式组件思路一样样

2-2-1 父-----> 子

父组件向子组件传值,通过props,将父组件的state传递给了子组件。

请添加图片描述

  1. 父组件代码
constructor(props){
    super(props)
    this.state={
      message:"i am from parent"
    }
  }
  render(){
    return(
          <Child txt={this.state.message}/>
    )
  }
}

  1. 子组件代码
render(){
    return(
          <p>{this.props.txt}</p>
    )
}

  1. 完整实例
    • 创建父组件index.js
import React from 'react';
import ReactDOM from 'react-dom';
import User from './User';//引入子组件

//定义数据
const person = {
    name: 'Tom',
    age:20
}

ReactDOM.render(
    //渲染子组件,并向子组件传递name,age属性
    <User name={person.name} age={person.age}></User>
    , document.getElementById('root'));

  • 创建子组件User.js
import React from 'react';

class User extends React.Component{
    render(){
        return (
            // 使用props属性接收父组件传递过来的参数
            <div>{this.props.name}{this.props.age}</div>
        );
    }
}

export default User;

2-2-2 子 -----> 父(传递回调函数类型的props)

子组件通过调用父组件传递到子组件的方法向父组件传递消息的。

请添加图片描述

  1. 子组件Son.js
import React from 'react';

class Son extends React.Component {
    //构造方法
    constructor(){
        super();
        this.state = {
            inputValue:''
        }
    }
    //按钮点击事件
    handleClick(){
        //通过props属性获取父组件的getdata方法,并将this.state值传递过去
        this.props.getdata(this.state.inputValue);
    }
    //输入框事件,用于为this.state赋值
    handleChange(e){
        this.setState({
            inputValue: e.target.value
        });
    }

    render(){
        return (
            <React.Fragment>
                <input onChange={this.handleChange.bind(this)}></input>
                <button onClick={this.handleClick.bind(this)}>点击获取数据</button>
            </React.Fragment>
        );
    }

}

export default Son;

  1. Parent.js
import React from 'react';
import Son from './Son';

class Parent extends React.Component {
    //构造方法
    constructor(){
        super();
        this.state = {
            mess: '' //初始化mess属性
        }
    }
    //用于接收子组件的传值方法,参数为子组件传递过来的值
    getDatas(msg){
        //把子组件传递过来的值赋给this.state中的属性
        this.setState({
            mess: msg
        });
    }

    render(){
        return (
            <React.Fragment>
                {/* 渲染子组件,设置子组件访问的方法,
                getdata属性名为子组件中调用的父组件方法名 */}
                <Son getdata={this.getDatas.bind(this)}></Son>
                <div>展示数据:{this.state.mess}</div>
            </React.Fragment>
        );
    }

}

export default Parent;

  1. 入口文件index.js示例代码
import React from 'react';
import ReactDOM from 'react-dom';
import Parent from './Parent';

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

2-2-3 兄弟组间传值

子-----> 父-----> 子,有其他方法的话,可以在评论区讲噢~~~

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
React 是一种非常灵活的 JavaScript 库,提供了一种使用组件构建应用程序的方式。在 React 中,组件可以是类组件也可以是函数式组件JavaScript 中有许多传递数据的方式,可以通过 props、context 或 Redux 等方式跨组件传递数据。在 React 中,为了方便使用,通常使用 props 来传递数据,这种传递数据的方式通常被称为单向数据流,即数据流只能从父组件流向子组件。但是,在 React 中,兄弟组件传递数据是有点困难的,因为它们没有任何通信渠道,也无法实时同步。那么在 React 函数式组件如何进行兄弟组件传值呢? 一种解决方法是通过父组件来管理所有的状态,然后将状态传递给需要的兄弟组件。例如,有一个包含两个组件(ComponentA 和 ComponentB)的父组件,如果 ComponentA 的状态改变了,那么可以通过将状态作为 prop 传递给 ComponentB 来同步修改 ComponentB 的状态。这种方法是非常有效的,但是当状态和组件的依赖关系变得复杂时,就会变得很难维护。 另一种解决方法是使用 Redux。Redux 是一个 JavaScript 状态容器,用于管理应用程序中的所有状态。它使用单一存储来存储应用程序中的所有状态,因此,在 Redux 中,兄弟组件传递数据变得容易。这种方式需要学习诸如状态、Action、reducer、dispatch 等概念,所以需要投入一些学习成本。 还有一种解决方法是使用 React Context。Context 提供了一种跨多个组件传递数据的方法,而不必将数据从父组件传递到子组件。可以将Context看作是创建全局变量的方式,可以使子组件访问 Context 中的任何数据。但这也有一些注意事项和使用场景。 总之,在 React 函数式组件兄弟组件传递数据是可行的。以上列举的三种方式都是有效的解决方法。这三种方法根据应用场景和需求选择不同的方式将有助于开发人员更好地管理和维护 React 代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值