代碼示例以下所示:javascript
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"></div> <script type="text/javascript" src="./vue.js"></script> <script type="text/javascript"> // 全域組件 Vue.component('subComp',{ template:`<div></div>` }); var App={ // 局部組件建立 template:`<div> <subComp ref="subc"></subComp> <button ref="btn">我是按鈕</button> <p ref="sb">alex</p> </div>`, beforeCreate(){ // 在當前組件建立以前調用 console.log(this.$refs.btn); // 輸出:undefined }, created(){ // 在當前組件建立以後調用 console.log(this.$refs.btn); // 輸出:undefined,此時this對象已經有refs屬性,可是DOM尚未渲染進App組件中 }, beforeMount(){ // 裝載數據到DOM以前會調用 console.log(this.$refs.btn); // 輸出:undefined }, mounted(){ // 裝載數據到DOM以後會調用 console.log(this); // this是一個對象,包含refs屬性$refs: {btn: button, sb: p} console.log(this.$refs.btn); // <button>我是按鈕</button> // 若是是給組件綁定的ref=""屬性那麼this.$refs.subc取到的是組件對象 console.log(this.$refs.subc); var op = this.$refs.sb; this.$refs.btn.onclick = function () { console.log(op.innerHTML); // 點擊按鈕控制檯輸出:alex } }, }; new Vue({ el:'#app', data(){ return{ } }, template:`<App/>`, components:{ App } }) </script> </body> </html>
儘管存在 prop 和事件,有的時候你仍可能須要在 JavaScript 裏直接訪問一個子組件。html
爲了達到這個目的,你能夠經過 ref
特性爲這個子組件賦予一個 ID 引用,以下所示:vue
<button ref="btn">我是按鈕</button> <p ref="sb">alex</p>
ref
被用來給元素或子組件註冊引用信息。引用信息將會註冊在父組件的 $refs
對象上。若是在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;若是用在子組件上,引用就指向組件實例。java
beforeCreate在當前組件建立以前調用,此時輸出確定爲undefined。可是後面created方法是在組件建立以後調用,此時打印this能夠發現裏面也已經有了refss屬性,可是這個時候DOM尚未渲染進App組件中,這裏涉及到了一個虛擬DOM的概念。直到mounted方法,裝載數據到DOM以後纔會正常顯示出this.$refs.btn內容。app
mounted(){ // 裝載數據到DOM以後會調用 console.log(this); // this是一個對象,包含refs屬性$refs: {btn: button, sb: p} console.log(this.$refs.btn); // <button>我是按鈕</button>
// 全域組件 Vue.component('subComp',{ template:`<div></div>` }); var App={ // 局部組件建立 template:`<div> <subComp ref="subc"></subComp> <button ref="btn">我是按鈕</button> <p ref="sb">alex</p> </div>`, // 省略代碼 mounted(){ // 裝載數據到DOM以後會調用 console.log(this); // this是一個對象,包含refs屬性$refs: {btn: button, sb: p} console.log(this.$refs.btn); // <button>我是按鈕</button> // 若是是給組件綁定的ref屬性那麼this.$refs.subc取到的是組件對象 console.log(this.$refs.subc); var op = this.$refs.sb; this.$refs.btn.onclick = function () { console.log(op.innerHTML); // 點擊按鈕控制檯輸出:alex } }, };
若是是給組件綁定的ref屬性,那麼this.$refs.subc取到的是組件對象。函數
$refs:獲取組件內的元素this
$parent:獲取當前組件的父組件spa
$children:獲取當前組件的子組件code
$root:獲取New Vue的實例化對象component
$el:獲取組件對象的DOM元素
vue實現響應式並非數據發生變化後DOM馬上發生變化,而是按照必定的策略進行DOM的更新。
在頁面上製做一個input輸入框,在頁面加載時就讓該輸入框獲取焦點。
<body> <div id="app"></div> <script type="text/javascript" src="./vue.js"></script> <script type="text/javascript"> var App={ // 局部組件建立 data(){ return{ isShow:true } }, template:`<div> <input type="text" v-if="isShow" ref="fos"/> </div>`, mounted(){ // 裝載數據到DOM以後會調用 // focus()方法用於給予該元素焦點 this.$refs.fos.focus(); } }; new Vue({ el:'#app', data(){ return{ } }, template:`<App/>`, components:{ App } }) </script> </body>
頁面加載時就讓該輸入框獲取焦點,顯示效果以下:
<body> <div id="app"></div> <script type="text/javascript" src="./vue.js"></script> <script type="text/javascript"> var App={ // 局部組件建立 data(){ return{ isShow:false } }, template:`<div> <input type="text" v-if="isShow" ref="fos"/> </div>`, mounted(){ // 裝載數據到DOM以後會調用 // vue實現響應式並非數據發生變化後DOM馬上發生變化,而是按照必定的策略進行DOM的更新。 // $nextTick是在下次DOM更新循環結束以後執行的延遲迴調,在修改數據以後使用這個方法則能夠在回調中獲取更新以後的DOM this.isShow = true; console.log(this.$refs.fos); // 輸出undefined // focus() this.$refs.fos.focus(); // focus() 方法用於給予該元素焦點。 } }; new Vue({ el:'#app', data(){ return{ } }, template:`<App/>`, components:{ App } }) </script> </body>
顯示效果以下:
$nextTick是在下次DOM更新循環結束以後執行的延遲迴調,在修改數據以後使用這個方法則能夠在回調中獲取更新以後的DOM。
<body>
<div id="app"></div>
<script type="text/javascript" src="./vue.js"></script>
<script type="text/javascript">
var App={ // 局部組件建立
data(){
return{
isShow:false
}
},
template:`<div>
<input type="text" v-if="isShow" ref="fos"/>
</div>`,
mounted(){ // 裝載數據到DOM以後會調用
// vue實現響應式並非數據發生變化後DOM馬上發生變化,而是按照必定的策略進行DOM的更新。
// $nextTick:
// 是在下次DOM更新循環結束以後執行的延遲迴調,在修改數據以後使用這個方法則能夠在回調中獲取更新以後的DOM
this.isShow = true;
console.log(this.$refs.fos); // 輸出undefined
// focus()
// this.$refs.fos.focus(); // focus() 方法用於給予該元素焦點。
this.$nextTick(function () {
// 回調函數中獲取更新以後真實的DOM
this.$refs.fos.focus();
})
}
};
new Vue({
el:'#app',
data(){
return{
}
},
template:`<App/>`,
components:{
App
}
})
</script>
</body>
顯示效果以下所示: