1. 16.3版本之前,是通过父组件给子组件传个ref属性 ,然后在父组件调用this.refs.xxx来获取子组件的dom,从而调用他的方法 ```jsx var Child = React.createClass({ childMethod: function(){
      1. alert("组件之间通信成功");
      }, render: function() {
      1. return(
      2. <div>
      3. <h1>Hello {this.props.name}</h1>
      4. <button onClick={this.childMethod}>子组件</button>
      5. </div>
      6. )
      } });

    // 父组件 var Parent = React.createClass({ getDS: function(){ // 调用组件进行通信 this.refs.getSwordButton.childMethod(); }, render: function(){ return (

    ); } });

    1. 2. 16.3版本之后,父组件通过给子组件传递一个方法,子组件componentDidMount中,调用该方法并把this传过去,也就是把子组件自己传过去,从而父组件就获得子组件的dom
    2. ```jsx
    3. import React, {Component} from 'react';
    4. export default class Parent extends Component {
    5. render() {
    6. return(
    7. <div>
    8. <Child onRef={this.onRef} />
    9. <button onClick={this.click} >click</button>
    10. </div>
    11. )
    12. }
    13. onRef = (ref) => {
    14. this.child = ref
    15. }
    16. click = (e) => {
    17. this.child.myName()
    18. }
    19. }
    20. class Child extends Component {
    21. componentDidMount(){
    22. this.props.onRef(this)
    23. }
    24. myName = () => alert('xiaohesong')
    25. render() {
    26. return ('woqu')
    27. }
    28. }
    1. 类组件中,通过React.createRef()创建一个ref对象,并通过ref属性将该对象绑定给子组件,该对象下的current属性就指向了子组件 ```jsx import React, {Component} from ‘react’;

    export default class Parent extends Component { constructor(props){ super(props); this.ref = React.createRef(); } click = (e) => { this.ref.current.myName() } render() { return(

    ) }

    }

    class Child extends Component { myName = () => alert(‘xiaohesong’)

    1. render() {
    2. return ('woqu')
    3. }

    }

    1. 4. react hooks中,父组件通过useRef()创建一个ref对象并将他通过props属性方式传递给子组件,因为ref是不能挂在到函数组件上的,因为函数组件没有实例,所以子组件需要通过useImperativeHandle将子组件的函数挂载到父组件的ref.current
    2. ```jsx
    3. import {useRef, useState, useImperativeHandle} from 'react;
    4. const Child = ({ref}) => {
    5. const [val, setVal] = useState();
    6. // 此处注意useImperativeHandle方法的的第一个参数是目标元素的ref引用
    7. useImperativeHandle(ref, () => ({
    8. // changeVal 就是暴露给父组件的方法
    9. changeVal: (newVal) => {
    10. setVal(newVal);
    11. }
    12. }));
    13. return (
    14. <div>{val}</div>
    15. )
    16. }
    17. Child = forwardRef(Child);
    18. const Parent = () => {
    19. const ref = useRef();
    20. const updateChildState = () => {
    21. // changeVal就是子组件暴露给父组件的方法
    22. ref.current.changeVal(99);
    23. }
    24. ...
    25. return (
    26. <>
    27. {/* 此处注意需要将childRef通过props属性从父组件中传给自己 ref={childRef} */}
    28. <ChildComp ref={ref} />
    29. <button onClick={updateChildState}>触发子组件方法</button>
    30. </>
    31. )
    32. }