關於$refs的官方介紹
一個對象,持有注冊過 ref attribute 的所有 DOM 元素和組件實例
關於$el的官方介紹
Vue 實例使用的根 DOM 元素
我們自己新建組件的時候,如何讓父組件直接觸發子組件的方法,比如父組件讓子組件的數據加1
父組件
1 <template> 2 <div> 3 <div class="parent"> 4 父組件 5 <button @click="add">父組件按鈕讓子組件加一</button> 6 <Child ref="addChild"></Child> 7 </div> 8 </div> 9 </template> 10 11 <script> 12 import Child from './components/Child.vue' 13 14 export default { 15 components:{ 16 Child 17 }, 18 methods:{ 19 add(){ 20 console.log(this.$refs.addChild) 21 this.$refs.addChild.add() 22 } 23 } 24 } 25 </script> 26 27 <style scoped> 28 .parent{ 29 width: 200px; 30 height: 300px; 31 padding: 0 50px; 32 background: blue; 33 color: white; 34 } 35 </style>
子組件
1 <template> 2 <div> 3 <div class="child"> 4 子組件數據{{a}} 5 6 </div> 7 </div> 8 </template> 9 10 <script> 11 export default { 12 data(){ 13 return{ 14 a:100 15 } 16 }, 17 props:['name'], 18 methods:{ 19 add(){ 20 console.log(123) 21 this.a++ 22 }, 23 24 } 25 } 26 </script> 27 28 <style scoped> 29 .child{ 30 width: 200px; 31 height: 200px; 32 background: orange; 33 } 34 </style>
需要注意的是$refs獲取的對象內容就是對應的ref屬性的實例

$refs屬性的內容包含了當前組件的所有dom和方法
此時我們在父組件中調用了子組件的add方法
1 methods:{ 2 add(){ 3 this.$refs.addChild.add() 4 } 5 }
子組件中的方法
1 methods:{ 2 add() { 3 console.log(123) 4 this.a++ 5 } 6 7 }
此時我們看到觸發了子組件中的方法

如果一個頁面中有多個ref,此時會返回一個JSON對象,分別代表對應的ref實例
1 <template> 2 <div> 3 <div class="parent"> 4 父組件 5 <button @click="add">父組件按鈕讓子組件加一</button> 6 <Child ref="addChild1"></Child> 7 <Child ref="addChild2"></Child> 8 9 </div> 10 </div> 11 </template>

如果ref對象不是一個自定義組件而是一個普通元素,返回的就是該元素本身
1 <div ref="Div"> 2 我是div標簽 3 </div>
1 methods:{ 2 add(){ 3 console.log(this.$refs.Div) 4 // this.$refs.addChild.add() 5 } 6 }

此時思考一個問題,可以通過$refs去修改組件的樣式嘛?
1 methods:{ 2 add(){ 3 console.log(this.$refs.addChild.style) 4 // this.$refs.addChild.add() 5 } 6 }
按時瀏覽器卻返回的是undefined,因為$refs如果是一個組件,就沒有style樣式屬性,我們要想修改對應的組件樣式,需要通過$el

1 methods:{ 2 add(){ 3 console.log(this.$refs.addChild.$el) 4 // this.$refs.addChild.add() 5 } 6 }
此時我們會發現這里返回的是一個根節點

我們試一下
1 methods:{ 2 add(){ 3 console.log(this.$refs.addChild.$el.style="color:red") 4 // this.$refs.addChild.add() 5 } 6 }
此時點記憶下,發現可以用$el來修改對應的組件樣式

