react 之 ref屬性標簽


**ant design 官網地址: **

https://ant.design/components/form-cn/#header

今天來講一下 rfeact 中的ref屬性標簽

    React 支持一種非常特殊的屬性 Ref ,你可以用來綁定到 render() 輸出的任何組件上。

 這個特殊的屬性允許你引用 render() 返回的相應的支撐實例( backing instance )。這樣就可以確保在任何時間總是拿到正確的實例。

 ref顧名思義我們知道,其實它就可以被看座是一個組件的參考,也可以說是一個標識。作為組件的屬性,其屬性值可以是一個字符串也可以是一個函數。

 其實,ref的使用不是必須的。即使是在其適用的場景中也不是非用不可的,因為使用ref實現的功能同樣可以轉化成其他的方法來實現。但是,既然ref有其適用的場景,那也就是說ref自有其優勢。關於這一點和ref的適用場景,官方文檔中是這樣說的:`

注意:

    在從 render 方法中返回 UI 結構之后,你可能想沖出 React 虛擬 DOM 的限制,在 render 返回的組件實例上調用某些方法。
    通常來說,這樣做對於應用中的數據流動是不必要的,因為活躍的數據( Reactive data )流總是確保最新的 props 被傳遞到每一 
    個從 render() 輸出的子級中去。然而,仍然有幾個場景使用這種方式是必須的,或者說是有益的:查找渲染出的組件的DOM標記(可以認為是DOM的標識ID),
    在一個大型的非React應用中使用React組件或者是將你現有的代碼轉化成React。`

String的使用方法
綁定一個 ref 屬性到 render 的返回值上

<input ref="myInput" />
在其它代碼中,通過 this.refs 獲取支撐實例

    var input = this.refs.myInput;
    var inputValue = input.value;
    var inputRect = input.getBoundingClientRect(); 

ref作為回調函數的方式去使用

     class Input extends Component {
        constructor(props){
            super(props);
        }

        focus = () => {
            this.textInput.focus();
        }

        render(){
            return (
                <div>
                    <input ref={(input) => { this.textInput = input }} />
                </div>
            )
        }
    }

input參數是哪來的

當我們在DOM Element中使用ref時,回調函數將接收當前的DOM元素作為參數,然后存儲一個指向這個DOM元素的引用。
那么在示例代碼中,我們已經把input元素存儲在了this.textInput中,在focus函數中直接使用原生DOM API實現
focus聚焦。

回調函數什么時候被調用

答案是當組件掛載后和卸載后,以及ref屬性本身發生變化時,回調函數就會被調用。

可以在組件實例中使用ref。

前面的示例代碼是在DOM添加ref屬性,那么我們來看看如何在組件實例中使用。再上代碼:

     //Input標簽來源於上面的示例代碼👆
    class AutoFocusTextInput extends Component {
        componentDidMount(){
            this.textInput.focus();
        }

        render(){
            return (
                <Input ref={(input) => { this.textInput = input }}>
            )
        }
    }

當我們在Input標簽中添加ref屬性時,其回調函數接收已經掛載的組件實例Input標簽作為參數,並通過this.textInput訪
問到其內部的focus方法。也就是說,上面的示例代碼實現了當AutoFocusTextInput組件掛載后Input標簽組件的自動聚
焦。
接下來文檔指出,Input標簽組件必須是使用class聲明的組件,不然無法使用。這意味着React逐漸與ES6全面接軌了
`

不能在無狀態組件中使用ref。

原因很簡單,因為ref引用的是組件的實例,而無狀態組件准確的說是個函數組件(Functional Component),沒有實
例。上代碼:

上面的代碼是無法正常工作的。

父組件的ref回調函數可以使用子組件的DOM。

這是Facebook非常不推薦的做法,因為這樣會打破組件的封裝性,這種方法只是某些特殊場景下的權宜之計。我們看看
如 何實現,上代碼:

原理就是父組件把ref的回調函數當做inputRefprops傳遞給子組件,然后子組件 把這個函數和當前的DOM綁定,最終的結果是父組件 的this.inputElement存儲的DOM是子組件 中的input。
同樣的道理,如果A組件是B組件的父組件,B組件是C組件的父組件,那么可用上面的方法,讓A組件拿到C組件的DOM。但是官方態度是discouraged,這種多級調用確實不雅,我們確實需要考慮其他更好的方案了。

之前遇到 ref動態賦值:

** **
爭對這種動態賦值的, 就要有動態取值:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM