React-父组件访问子组件内部

父子组件通信

典型数据流:父组件向后代组件传递props,当props更新则接收对应值的后代组件触发重新渲染;
如果希望父组件能够访问子组件内部的信息则需要典型数据流之外的其他方法。

ref

React的ref表示对组件实例的引用
普通组件:
详情链接
详情链接

React的忠告

》》》
不要过度使用 Refs
你可能首先会想到在你的应用程序中使用 refs 来更新组件。如果是这种情况,请花一点时间,重新思考一下 state 属性在组件层中位置。通常你会想明白,提升 state 所在的组件层级会是更合适的做法。有关示例,请参考状态提升.
《《《

不能用高阶组件传递refs引用,如果向一个由高阶组件创建的组件的元素添加ref应用,那么ref指向的是最外层容器组件实例而非包裹组件。
最好不用ref,使用状态提升传递props是更好的选择;确实需要时可以考虑React.forwardRef;

React.forwardRef

高阶组件中,通过组件向一个后代组件传递ref,从而能够访问到该子组件(与标准数据流相反);

 使用rc-form增强的Form组件

解决方案:rc-form
详情链接

Note: use wrappedComponentRef instead of withRef after rc-form@1.4.0

class Form extends React.Component { ... }

// deprecated
    const EnhancedForm = createForm({ withRef: true })(Form);
    <EnhancedForm ref="form" />
    this.refs.form.refs.wrappedComponent // => The instance of Form

// Recommended
    const EnhancedForm = createForm()(Form);
    <EnhancedForm wrappedComponentRef={(inst) => this.formRef = inst} />
    this.formRef // => The instance of Form

需要引入'rc-form'模块中的createForm方法;

antd中经过Form.create()增强的Form组件

类似rc-form,同样使用wrappedComponentRef

经过 Form.create 之后如果要拿到 ref,可以使用 rc-form 提供的 wrappedComponentRef

class CustomizedForm extends React.Component { ... }

    // use wrappedComponentRef
    const EnhancedForm =  Form.create()(CustomizedForm);
    <EnhancedForm wrappedComponentRef={(form) => this.form = form} />
    this.form // => The instance of CustomizedForm
    const EnhancedForm = Form.create()(MyForm);
    const Parent extends Component {
    //父组件中引入EnhancedForm后,通过this.form可以访问EnhancedForm子组件

    handleSubmit = () => {
         //handleOk是子组件的内部方法,可能包含验证和提交处理数据等功能;
        this.form.handleOk();
    }
    render() {
        return (
            <EnhancedForm wrappedComponentRef = {(form) => this.form = form} />
            <Button onClick={ this.handleSubmit}/>
        )
    }

}

转载于:https://www.cnblogs.com/muTing/p/9503063.html

React中,函数式组件(Functional Components)并不直接支持像类组件那样的实例方法调用。函数式组件没有自己的状态和生命周期方法,它们通常使用props来传递数据和行为。如果你想要在组件中调用组件的方法,你可以通过以下几种方式: 1. **Props传值**:将方法作为props传递给组件,然后在组件内部执行。例如: ```jsx function ParentComponent() { const handleClick = () => { // 这里执行的动作 }; return <ChildComponent onClick={handleClick} />; } function ChildComponent({ onClick }) { // 组件内部可以访问onClick方法 return <button onClick={onClick}>点击我</button>; } ``` 2. **使用回调函数或事件处理程序**:对于事件,组件可以提供一个函数,组件在其生命周期内触发这个函数。例如: ```jsx function ParentComponent() { const handleClickInChild = (data) => { // 处理组件传递的数据 }; return ( <ChildComponent onAction={(data) => handleClickInChild(data)} /> ); } function ChildComponent({ onAction }) { function handleClick() { onAction(someData); } // 在组件内部触发事件 return <button onClick={handleClick}>点击我</button>; } ``` 3. **高阶组件(HOC)**:如果需要频繁地共享行为,可以考虑使用高阶组件(HOC),但这不是React函数式组件的标准用法。 这些方法都是在React的无状态函数(stateless)和不可变数据原则下实现的,确保了组件的可预测行为和组件间的松耦合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值