**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傳遞給子組件,然后子組件
同樣的道理,如果A組件是B組件的父組件,B組件是C組件的父組件,那么可用上面的方法,讓A組件拿到C組件的DOM。但是官方態度是discouraged,這種多級調用確實不雅,我們確實需要考慮其他更好的方案了。
之前遇到 ref動態賦值:
** **
爭對這種動態賦值的, 就要有動態取值: