React Ref 和 React.forwardRef的使用 ...
-
Ref 和Dom,Ref是reference(引用)的簡寫。
- 能力:大多數情況下,props前遞可以解決一切問題,但是依然有需要觸達React實例或者Dom節點的情況,這時候應該使用React Ref。
- 使用:
- 用來處理立即執行的動畫。
- 用來處理非受控組件的焦點,什麼是受控/非受控組件參考文章。
- 用來與第三方庫對接,我知道的有d3 或者 cocos。
-
React.forwardRef((props,ref)=><Compnent>)
- 簡而言之就是自動透傳引用(Ref),能讓組件接收傳過來的ref, 向下(或者說向前)傳遞Ref。
const FancyButton = React.forwardRef((props, ref) => ( <button ref={ref} className="FancyButton"> {props.children} </button> )); // You can now get a ref directly to the DOM button: const ref = React.createRef(); <FancyButton ref={ref}>Click me!</FancyButton>;
-
上述代碼的解釋:
- 首先創建了一個ref, 這個ref的目的就是抓到孫子組件中的input節點
- 通過組件屬性把ref傳給子組件<FancyButton>
- 子組件通過React.forwardRef透傳props和ref,這裡ref才是我們要註意的點。
- 參數ref賦值給孫子組件<button>
- 這個ref就能抓到孫子組件的實例。
- 簡而言之就是自動透傳引用(Ref),能讓組件接收傳過來的ref, 向下(或者說向前)傳遞Ref。
-
React.forwardRef((props, ref)=><Componnet>)在高階組件中的使用:
- 比如我們寫一個列印前後屬性的高階組件logProps,這個高階組件能夠透傳ref
1 function logProps(Component) { 2 class LogProps extends React.Component { 3 componentDidUpdate(prevProps) { 4 console.log('old props:', prevProps); 5 console.log('new props:', this.props); 6 } 7 8 render() { 9 const {forwardedRef, ...rest} = this.props; 11 // 把常規屬性"forwardedRef"作為ref賦值給傳過來的Component組件 12 return <Component ref={forwardedRef} {...rest} />; 13 } 14 } 15 16 // 註意React.forwardRef提供的第二個參數ref. 17 // 我們可以把ref作為一個常規屬性"forwardedRef"傳給LogProps這個組件 18 // 就可以跟實例綁定. 19 return React.forwardRef((props, ref) => { 20 return <LogProps {...props} forwardedRef={ref} />; 21 }); 22 }
- 比如我們寫一個列印前後屬性的高階組件logProps,這個高階組件能夠透傳ref