大概梳理下傳值的幾種方式
一:父子元件傳值
- props方式
子元件對外暴露方法並向父元件傳遞由於觸發方法導致的值的變化,父元件接收子元件傳遞來的值;子元件接收父元件傳遞來的值,並根據傳遞來的值在子元件內部進行各種操作
Tips:子元件只能接受值和發射(狀態)值,父元件不能操作子元件的方法和屬性
僅適合傳入資料
- $parents與$children方式
可操作父元件或子元件方法及屬性,但不推薦
1. $parent : 當前元件樹的根例項,如果沒有則是該元件樹本身
用於子元件獲取父元件例項並操作父元件屬性和方法;
高元件化開發環境下不建議使用,高耦合度,不易複用;
2. $children:當前例項的 **直屬** 子元件集合
以陣列方式存在,陣列內子元件成員可能會因為增減元件導致下標發生偏移;
不保證順序,非響應式,僅可拿到子元件下標;
若有需要,推薦使用for...of遍歷子元件例項;
在需要拿到所有子元件時才用到,日常不建議使用;
- $refs與ref方式
用於呼叫子元件的屬性和方法,預設空物件;
最常用;
應該在父元件內給子元件本身新增ref;
this.$refs的意義:該vue例項下的有ref標識的子元件的合集,可以直接通過this.$refs.ref.data/methods來呼叫子元件資料或方法;
為確保子元件完全掛載完畢,應在mounted生命週期內或者使用this.$nextTick()回撥來操作子元件的方法或屬性;
語法: this.$refs.ref
二:非父子元件傳值
- $root: 訪問VUE根元件
略略略
- $emit 與 $on
該方法可以直接實現兩個頁面間傳值,而不拘泥於是否是父子關係
該方式需要新建一個js檔案作為載體, 由該檔案物件負責傳遞資料;
// 公共檔案 pub.js
import Vue from 'vue'
let pub = new Vue()
export default pub
//至此,公共檔案建立完畢
假設頁面a傳送資料,頁面b接收資料:
頁面a,頁面b均需要匯入檔案pub.js
//頁面a
import Pub from '../utils/public.js'
export default {
data(){
pageA:'我是頁面a的資料'
},
methods:{
emitPub(){
Pub.$emit('goThere',pageA)
}
}
}
//頁面b
import Pub from '../utils/public.js'
export default {
data(){
pageB:''
},
mounted(){
//需要在元件載入完畢後使用
//res: 頁面a發射的資料
Pub.$on('goThere',res=>{
this.pageB = res
})
}
}
tips: 經試驗,$on的引數二如果是普通函式,this指向會發生錯誤,因而推薦使用箭頭函式(這是由於箭頭函式下的this繼承了所處函式的上下文環境,妙蛙)
以上