ref關(guān)鍵字使參數(shù)按引用傳遞
其效果是,當(dāng)控制權(quán)傳遞回調(diào)用方法時(shí),在方法中對(duì)參數(shù)所做的任何更改都將反映在該變量中。若要使用ref參數(shù),則方法定義和調(diào)用方法都必須顯式使用ref關(guān)鍵字。ref是 Reference的縮寫(xiě)。
中文名 ref 外文名 ref 用 途 C#中關(guān)鍵字通過(guò)引用傳遞參數(shù) 引用方法 顯式使用
例如:
class RefExample {
static void Method(ref int i) {
i=44;
}
static void Main() {
int val=0;
Method(ref val);
//val is now 44
}
}
傳遞到ref參數(shù)的參數(shù)必須最先初始化
這與 out 不同,out 的參數(shù)在傳遞之前不需要顯式初始化。盡管ref和out在運(yùn)行時(shí)的處理方式不同,但它們?cè)诰幾g時(shí)的處理方式是相同的。因此,如果一個(gè)方法采用ref參數(shù),而另一個(gè)方法采用out 參數(shù),則無(wú)法重載這兩個(gè)方法。
注意:屬性不是變量,因此不能作為ref參數(shù)傳遞。
ref和out兩個(gè)參數(shù)的不同在于:
1、ref傳進(jìn)去的參數(shù)必須在調(diào)用前初始化,out不必,即:
int i;
SomeMethod(ref i);//語(yǔ)法錯(cuò)誤
SomeMethod(out i);//通過(guò)
2、ref傳進(jìn)去的參數(shù)在函數(shù)內(nèi)部可以直接使用,而out不可:
public void SomeMethod(ref int i) {
int j=i;//通過(guò)
//...
}
public void SomeMethod(out int i) {
int j=i;//語(yǔ)法錯(cuò)誤
}
3、ref傳進(jìn)去的參數(shù)在函數(shù)內(nèi)部可以不被修改,但out必須在離開(kāi)函數(shù)體前進(jìn)行賦值。
ref 被用來(lái)給元素或子組件注冊(cè)引用信息
引用信息將會(huì)注冊(cè)在父組件的 $refs 對(duì)象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素; 如果用在子組件上,引用就指向組件實(shí)例:
<!-- vm.$refs.p will be the DOM node -->
<p ref="p">hello</p>
<!-- vm.$refs.child will be the child comp instance -->
<child-comp ref="child"></child-comp>
當(dāng) v-for 用于元素或組件的時(shí)候,引用信息將是包含 DOM 節(jié)點(diǎn)或組件實(shí)例的數(shù)組。
關(guān)于ref注冊(cè)時(shí)間的重要說(shuō)明: 因?yàn)閞ef本身是作為渲染結(jié)果被創(chuàng)建的,在初始渲染的時(shí)候你不能訪問(wèn)它們 - 它們還不存在!$refs 也不是響應(yīng)式的,因此你不應(yīng)該試圖用它在模版中做數(shù)據(jù)綁定。
子組件索引
盡管有 props 和 events ,但是有時(shí)仍然需要在 JavaScript 中直接訪問(wèn)子組件。為此可以使用 ref
為子組件指定一個(gè)索引 ID 。例如:
<div id="parent">
<user-profile ref="profile"></user-profile>
</div>
var parent = new Vue({ el: '#parent' })
// 訪問(wèn)子組件
var child = parent.$refs.profile
當(dāng) ref和 v-for 一起使用時(shí), ref 是一個(gè)數(shù)組或?qū)ο?,包含相?yīng)的子組件。
$refs只在組件渲染完成后才填充,并且它是非響應(yīng)式的。它僅僅作為一個(gè)直接訪問(wèn)子組件的應(yīng)急方案——應(yīng)當(dāng)避免在模版或計(jì)算屬性中使用 $refs。