React中無狀態組件是無法通過ref獲取的
在React中,無法使用refs獲取無狀態組件,因為無狀態組件掛載時,只是方法調用,沒有新建實例。
const Test = (props) => { return <div>{props.children}</div> } export default class App extends Component { componentDidMount() { console.log(this.test) } render() { return ( <Test ref={(test) => {this.test = test}}>hello world</Test> ) }}
上面的寫法大家可以自己做測試,直接會拋異常。
可是,有的時候,必須要獲取到無狀態組件的Dom怎麼辦呢?
很簡單,你可以在外層做一次包裹,代碼如下:
const Test = (props) => { return <div>{props.children}</div>}export default class App extends Component { componentDidMount() { console.log(this.test) } render() { return ( <div ref={(test) => {this.test = test}> <Test>hello world</Test> </div> ) } }
這樣在無狀態組件外層包裹一個元素就可以獲取到內部Dom了,當然現在React是不推薦大家直接用字元串的形式來創建ref的,使用上面的函數是更為推薦的形式。
ref的作用一般有兩個,一個是獲取Dom,另外一個就是父組件使用ref來獲取子組件,從而調用子組件的方法~
補充:
孟禿 提出的方案很有意思,我大概用代碼實現了一下:
父組件:
class App extends Component { render() { return ( <Child ref1={(element) => this.element = element}></Child> ); } componentDidMount() { console.log(this.element) }}
子組件:
export default ({ref1}) => { return <div ref={ref1}>Example</div>}
如果ref1能夠被替換成ref,那麼這種方案更加完美,但是問題是,父組件中的ref對應的函數,子組件的props接收不到,所以導致代碼只能寫成這樣,這部分內容大家如果有更優方案,可以留言。
推薦閱讀:
※GraphQL概述: 使用React前端框架創建一個 to-Do List API
※redux源碼分析
※React v15.5.0更新說明 & v16.0.0更新預告
※React高階組件實踐
※React源碼分析5 -- 組件通信,refs,key,ReactDOM
TAG:React |