当前位置: 首页 > 面试题库 >

从父级调用子级方法

左丘凡
2023-03-14
问题内容

我有两个组成部分。

  1. 父组件
  2. 子组件

我试图从父级调用孩子的方法,我尝试过这种方法,但没有得到结果

class Parent extends Component {
  render() {
    return (
      <Child>
        <button onClick={Child.getAlert()}>Click</button>
      </Child>
      );
    }
  }

class Child extends Component {
  getAlert() {
    alert('clicked');
  }

  render() {
    return (
      <h1 ref="hello">Hello</h1>
    );
  }
}

有没有一种方法可以从父级调用子级的方法?

注意:子组件和父组件位于两个不同的文件中


问题答案:

首先,让我表示,这通常 不是
在React领域中解决问题的方法。通常,您要做的是将功能传递给道具中的子代,并传递事件中的子代的通知(或者更好的是:)dispatch

但是,如果 必须 在子组件上公开命令式方法,则可以使用refs。请记住,这是一个逃生舱口,通常表示可以使用更好的设计。

以前,仅基于类的组件才支持引用。随着React Hooks的出现,情况不再如此

使用挂钩和功能组件(>= react@16.8

const { forwardRef, useRef, useImperativeHandle } = React;



// We need to wrap component in `forwardRef` in order to gain

// access to the ref object that is assigned using the `ref` prop.

// This ref is passed as the second parameter to the function component.

const Child = forwardRef((props, ref) => {



  // The component instance will be extended

  // with whatever you return from the callback passed

  // as the second argument

  useImperativeHandle(ref, () => ({



    getAlert() {

      alert("getAlert from Child");

    }



  }));



  return <h1>Hi</h1>;

});



const Parent = () => {

  // In order to gain access to the child component instance,

  // you need to assign it to a `ref`, so we call `useRef()` to get one

  const childRef = useRef();



  return (

    <div>

      <Child ref={childRef} />

      <button onClick={() => childRef.current.getAlert()}>Click</button>

    </div>

  );

};



ReactDOM.render(

  <Parent />,

  document.getElementById('root')

);


<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>

<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>



<div id="root"></div>

对于文档useImperativeHandle()是在这里:

useImperativeHandle自定义使用时暴露给父组件的实例值ref

使用类组件(>= react@16.4

const { Component } = React;



class Parent extends Component {

  constructor(props) {

    super(props);

    this.child = React.createRef();

  }



  onClick = () => {

    this.child.current.getAlert();

  };



  render() {

    return (

      <div>

        <Child ref={this.child} />

        <button onClick={this.onClick}>Click</button>

      </div>

    );

  }

}



class Child extends Component {

  getAlert() {

    alert('getAlert from Child');

  }



  render() {

    return <h1>Hello</h1>;

  }

}



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


<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>

<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>

<div id="root"></div>

旧版API(<= react@16.3

出于历史目的,这是您在16.3之前的React版本中使用的基于回调的样式:

const { Component } = React;

const { render } = ReactDOM;



class Parent extends Component {

  render() {

    return (

      <div>

        <Child ref={instance => { this.child = instance; }} />

        <button onClick={() => { this.child.getAlert(); }}>Click</button>

      </div>

    );

  }

}



class Child extends Component {

  getAlert() {

    alert('clicked');

  }



  render() {

    return (

      <h1>Hello</h1>

    );

  }

}





render(

  <Parent />,

  document.getElementById('app')

);


<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>



<div id="app"></div>


 类似资料:
  • 我有两个组成部分: 父组件 子组件 我试图从Parent调用child的方法,我尝试了这种方法,但无法得到结果: 有没有办法从父级调用子级的方法? 注意:子组件和父组件在两个不同的文件中。

  • 问题内容: 我有两个组成部分。 父组件 子组件 我试图从父级调用孩子的方法,我尝试过这种方法,但没有得到结果 有没有一种方法可以从父级调用子级的方法? 注意:子组件和父组件位于两个不同的文件中 问题答案: 首先,让我表示,这通常不是在React领域中解决问题的方法。通常,您要做的是在props中将功能传递给子级,并在事件中传递子级的通知(或者更好的是:)。 但是,如果必须在子组件上公开命令式方法,

  • 问题内容: public class A{ private int getC(){ return 0; } } 您能告诉我是否有可能通过java中的反射来做一些吸引人的事情吗? 问题答案: class A{ 编辑:这是一个安静的老帖子,但增加了一些建议 重新考虑您的设计 调用父方法的私有方法,虽然可以通过反射实现,但是不应该这样做。在父对象上调用私有方法可能会使类处于无效状态,并可能导致意外行为。

  • 问题内容: 假设我们有3个Entities对象类: 如何使用JPA2.x(或hibernate)批注来: 父级删除时(一对多)自动删除所有子级 删除后自动从子级列表中删除子级(多对一) 儿童删除时(一对一)自动删除玩具 我正在使用Hibernate 4.3.5和mysql 5.1.30。 谢谢 问题答案: 如本文所述, 实体状态转换应从父级到子级联,而不是相反。 您需要这样的东西:

  • 问题内容: 我用这个文章为例(做出反应的方式),但它不是为我工作。请指出我的错误,因为我不明白怎么了。 这是我看到的错误: 未捕获的TypeError:this.props.onClick不是函数 这是我的代码: 提前致谢! 问题答案: 问题在于回调内部不引用React组件,因此是。 您可以通过将第二个参数传递给来显式设置值: 现在,回调 内部 的值与回调 外部 (即实例)的值相同。 这与Reac

  • 问题内容: 在我的应用中,我必须经常在两种布局之间切换。错误在下面发布的布局中发生。 第一次调用布局时,没有发生任何错误,一切都很好。然后,当我调用不同的布局(空白),然后再次调用我的布局时,出现以下错误: 我的布局代码如下所示: 我知道之前曾有人问过这个问题,但对我来说没有帮助。 问题答案: 错误消息说明你应该做什么。