您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页react中回调

react中回调

来源:华佗小知识
    <script type="text/babel">
        function App(){
            console.log('--------------APP---------------------');
            // let childEl = React.useRef(null);
            /**
             * 使用useCallback 代替useRef
             * callback ref 的ref值发生变化,会通知组件
             */ 
            let childEl = React.useCallback((node)=>{
                console.log('--------------------use callback---------------------',node);
                if(node !==null){
                    setVal(node.value)
                }
            },[])
            let [val,setVal] = React.useState('')
            const getChild = ()=>{
                console.log(childEl.current.value);
                setVal(childEl.current.value) 
            }

            /**
             * 需求: 监听chilEl当Child中ref变化时候,是否可以通知到App
             * 
             * 问题:当ref对象发生变化时候,useRef是不会通知的。即使使用了也是无效的。。
             * 结论:.current属性发生变更,不会引发重新渲染组件的
             */ 
            // bug
            // React.useEffect(()=>{
            //     console.log(childEl.current.value);
            //     setVal(childEl.current.value)
            // },[childEl])

            return (
                <div>
                    <div>
                       子组件:<Child ref={childEl}></Child>
                    </div>
                    <div>父组件:<h1>{ val }</h1></div>
                    <button onClick={()=>getChild()}>获取子组件dom</button>
                </div>
            )
        } 
        const Child = React.forwardRef((props,ref)=>{
            let [val,setVal] = React.useState('aaaaa');
            let inputRef = React.useRef(null)
            const change = e=>{
                setVal(e.target.value)
            }

            React.useImperativeHandle(
              ref, 
              () => {
               return {
                value:inputRef.current.value,
               }
              },
            )
            return (
               <div>
                 <input type="text" ref={inputRef} value={val} onChange={e=>change(e)} />
                </div>
            )
        })
        let root = ReactDOM.createRoot(document.getElementById('app'));
        root.render(<App /> )

    </script>

 /**
             * 使用useCallback 代替useRef
             * callback ref 的ref值发生变化,会通知组件
             */

    /**
             * 需求: 监听chilEl当Child中ref变化时候,是否可以通知到App
             *
             * 问题:当ref对象发生变化时候,useRef是不会通知的。即使使用了也是无效的。。
             * 结论:.current属性发生变更,不会引发重新渲染组件的
             */
 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务