React Hook父组件获取子组件的数据/函数

咱们知道在react中,经常使用props实现子组件数据到父组件的传递,可是父组件调用子组件的功能却不经常使用。文档上说ref其实不是最佳的选择,可是想着偷懒不学redux,在网上找了不少教程,要不就是hook的讲的太少,要不就是父子组件傻傻分不清,因而只好再啃了一下文档,就学了一下其它hook的api。
在这里咱们须要用到useImperativeHandle这个api,其函数形式为react

useImperativeHandle(ref, createHandle, [deps])

其实这个api也是ref的一种形式,可是至关于作了必定的优化,能够选择让子组件只暴露必定的api给父组件,根据在文档和其余博客上给出的方法,一共有两大步骤:redux

  1. 将ref传递到子组件中
  2. 须要使用forwardRef对子组件进行包装

子组件MyWorldMapapi

const mapRef = useRef(null);
    useImperativeHandle(ref, () => {

        return {
            //clickSwitch是子组件暴露的函数
            clickSwitch() {
             
                if(type == 1){
                    initChinaMap();
                    setType(2);
                }else{
                    initWordMap();
                    setType(1);
                }
              
            }
        }
    })

//你的return内容,注意ref

    return(
        <React.Fragment>

            <div id={"myWorldMap"} style={{ width: "800px", height: "400px" }}  ref={mapRef}></div>

        </React.Fragment>


    )
}


//最后要配合forwardRef
MyWorldMap = forwardRef(MyWorldMap);
export default MyWorldMap;

注:ref是子组件声明的时候传进来的,也就是函数

function MyWorldMap (props,ref){
//..你的代码
}

//export...

其实官方文档给出来的例子是:优化

function FancyInput(props, ref) {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => {
      inputRef.current.focus();
    }
  }));
  return <input ref={inputRef} ... />;
}
FancyInput = forwardRef(FancyInput);

两种方法都是能够的this

父组件MyTripcode

const myWordMapRef = useRef();

return(
  //省略一些代码,注意ref
 <MyWorldMap proData = { myMapData} handleMapClick = {handleMapClick.bind(this)} ref={myWordMapRef}>

 </MyWorldMap>
<div className={styles["mapButton-wrap"]}>
       <ButtonGroup>
               <Button onClick={() => myWordMapRef.current.clickSwitch()}>Switch</Button>
               <Button onClick={()=>clickAll() }>All</Button>
        </ButtonGroup>
 </div>
)

如今你就能够在父组件里面经过myWordMapRef.current.clickSwitch()调用函数了教程

相关文章
相关标签/搜索