其他分享
首页 > 其他分享> > 浅谈react hook ( useImperativeHandle)

浅谈react hook ( useImperativeHandle)

作者:互联网



 

import React, { forwardRef, useRef, useImperativeHandle,useState} from "react";

import ReactDOM from "react-dom";

import "./index.css";


 

// useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值。在大多数情况下,应当避免使用 ref 这样的命令式代码。useImperativeHandle 应当与 forwardRef 一起使用。

// ref:定义 current 对象的 ref createHandle:一个函数,返回值是一个对象,即这个 ref 的 current

// 对象 [deps]:即依赖列表,当监听的依赖发生变化,useImperativeHandle 才会重新将子组件的实例属性输出到父组件

// ref 的 current 属性上,如果为空数组,则不会重新输出。

//forwardRef获取子组件的Dom

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

 

    // 监听当num变化的时候 count 才会传过来

    const inputEl = useRef(null)

    const [num,setNum] = useState(0)

    const [count,setCount] = useState(0)

    useImperativeHandle(ref, () => ({

        name: '武大郎',

            focus: () => {

                inputEl.current.focus()

            },

            count

    }),[num])

    return (

        <div>

            <input type='text' ref={inputEl}></input>

            <h1>{num}</h1>

            <h1>{count}</h1>

            <button onClick={() => {

               setNum(num+1)

            }}>num</button>

            <button onClick={() => {

               setCount(count+1)

            }}>count</button>

        </div>

    )

})

// 子组件的方法和属性暴露给父组件

function App() {

    const el = useRef(null)

    return (

        <div className="App">

            <Forward ref={el}></Forward>

            <button onClick={() => {

                console.log(el.current);

                console.log(el.current.focus);

                el.current.focus()

            }}>获取子组件的方法和属性</button>

 

        </div>

    );

}

ReactDOM.render(<App />, document.getElementById("root"));

标签:count,current,浅谈,useImperativeHandle,react,hook,num,组件,ref
来源: https://blog.csdn.net/snowXZZ/article/details/117561883