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属性发生变更,不会引发重新渲染组件的
             */
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲤忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值