react中ref使用支持父调用子组件的方法
父组件不管是类还是函数组件都支持creatRef(),函数组件可以用useRef();
子组件中,函数组件由于没有实例,只能使用forwardRef搭配useImperativeHandle使用
import React, { createRef,forwardRef} from 'react'
import styles from './index.module.scss'
import { useImperativeHandle } from 'react';
import { useRef } from 'react';
class Test extends React.PureComponent {
test() {
console.log("Test111");
}
render() {
return <h2>Test</h2>;
}
}
// 创建一个函数组件, 作为子组件测试
// 使用forwardRef将函数包裹起来
const Foo = forwardRef(function(props, ref) {
const testfoo = () => {
console.log('testfoo');
}
useImperativeHandle(ref, () => {
return {
testfoo
}
},[])
return (
<h2 ref={ref}>Foo</h2>
)
})
// export default class About extends React.Component{
// constructor(){
// super()
// this.testRef = createRef();
// this.fooRef = createRef();
// }
// getDom() {
// this.testRef.current.test();
// console.log(this.fooRef.current,'current');
// this.fooRef.current.testfoo();
// }
// render() {
// return (
// <div>
// <Test ref={this.testRef}/>
// <Foo ref={this.fooRef}/>
// <button onClick={() => this.getDom()}>获取DOM</button>
// </div>
// )
// }
// }
const About = () => {
// const testRef = useRef();
// const fooRef = useRef();
const testRef = createRef();
const fooRef = createRef();
const getDom = () => {
testRef.current.test();
fooRef.current.testfoo();
}
return (
<div>
<Test ref={testRef}/>
<Foo ref={fooRef}/>
<button onClick={getDom}>获取DOM</button>
</div>
)
}
export default About;