- 16.3版本之前,是通过父组件给子组件传个ref属性 ,然后在父组件调用this.refs.xxx来获取子组件的dom,从而调用他的方法
```jsx
var Child = React.createClass({
childMethod: function(){
}, render: function() {alert("组件之间通信成功");
} });return(
<div>
<h1>Hello {this.props.name}</h1>
<button onClick={this.childMethod}>子组件</button>
</div>
)
// 父组件 var Parent = React.createClass({ getDS: function(){ // 调用组件进行通信 this.refs.getSwordButton.childMethod(); }, render: function(){ return (
2. 16.3版本之后,父组件通过给子组件传递一个方法,子组件componentDidMount中,调用该方法并把this传过去,也就是把子组件自己传过去,从而父组件就获得子组件的dom
```jsx
import React, {Component} from 'react';
export default class Parent extends Component {
render() {
return(
<div>
<Child onRef={this.onRef} />
<button onClick={this.click} >click</button>
</div>
)
}
onRef = (ref) => {
this.child = ref
}
click = (e) => {
this.child.myName()
}
}
class Child extends Component {
componentDidMount(){
this.props.onRef(this)
}
myName = () => alert('xiaohesong')
render() {
return ('woqu')
}
}
- 类组件中,通过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’)
render() {
return ('woqu')
}
}
4. react hooks中,父组件通过useRef()创建一个ref对象并将他通过props属性方式传递给子组件,因为ref是不能挂在到函数组件上的,因为函数组件没有实例,所以子组件需要通过useImperativeHandle将子组件的函数挂载到父组件的ref.current
```jsx
import {useRef, useState, useImperativeHandle} from 'react;
const Child = ({ref}) => {
const [val, setVal] = useState();
// 此处注意useImperativeHandle方法的的第一个参数是目标元素的ref引用
useImperativeHandle(ref, () => ({
// changeVal 就是暴露给父组件的方法
changeVal: (newVal) => {
setVal(newVal);
}
}));
return (
<div>{val}</div>
)
}
Child = forwardRef(Child);
const Parent = () => {
const ref = useRef();
const updateChildState = () => {
// changeVal就是子组件暴露给父组件的方法
ref.current.changeVal(99);
}
...
return (
<>
{/* 此处注意需要将childRef通过props属性从父组件中传给自己 ref={childRef} */}
<ChildComp ref={ref} />
<button onClick={updateChildState}>触发子组件方法</button>
</>
)
}