ps:忽略全局數據組織方案如vuex和redux等
round 1: 父子爺孫傳參
首先上場的使我們的vue,國人開源界驕傲尤雨溪的親兒子。以簡單易上手api豐富而著稱,
props
:父 => 子: props, 子 =>父:props,爺孫:通過父來連接
通過props像子元素傳值,原則上子元素不可以修改props的值,但是傳遞的props爲引用值時,子元素修改也會反映到父元素,用起來方便得很,非常適用於樹形組件結構props + $emit
: 父 => 子: props,子 => 父 :$emit, 爺孫:通過父來連接。
如果props是非引用類型,就可以使用emit來改變父元素傳遞的數據了props + 函數
:父 => 子:props,子 => 父:props傳遞的函數,爺孫: 通過父來連接
通過props向子組件傳遞一個修改父組件數據的函數,來改變父組件$parent, $chindren
:父 => 子:$children
,子 => 父:$parent
,爺孫:$parent.$parent和$children[0].$children...
vue實例注入了$parent 和 、$children 引用,指向父子
,用起來也很方便event bus
:父 => 子: event bus ,子 => 父:event bus,爺孫: event bus。
定義一個單獨的vue文件,作爲事件傳播器,用起來很方便,父子兄弟都可以共同使用provide,inject
:父 => 子:inject,子 => 父:可以使用props的所有子 => 父方法,爺孫:inject
多層級傳遞數據,如果不向上傳遞數據使用起來還是蠻方便$attr, $listeners
:父 => 子:$attr, $listener
,子 => 父:可以使用props的所有子 => 父方法,爺孫:$attr, $listener
使用較少,文檔說在創建高級別的組件時非常有用。$refs
:父 => 子:$refs
,子 => 父:可以使用props的所有子 => 父方法,爺孫:$refs
使用較爲方便,完美獲取子組件所有方法。
其次上場的是我們久負盛名的react,函數式,支持typescript,靈活小巧無一不讓前端開發者們歡呼吶喊
-
props
:父 => 子:props,子 => 父:props傳遞的函數,爺孫:通過父來連接
和vue的第三種一樣, -
props 傳遞組件
:父 => 子:在父組件中隨便給傳遞的組件賦值,子 => 父:通過賦值的函數,爺孫: 通過父來傳遞props組件 -
render props
:與第二個同理 -
context
:與vue provide inject類似, -
ref
: 與vue$refs
用法類似。 -
event bus
: 與vue 用法類似
vue 略勝一籌
round 2:兄弟組件傳參
這次讓react先上場吧,爲了公平,畢竟第一回合輸了
-
通過共同的祖先傳遞參數
: 父組件,context等, -
event bus
:通過共同的朋友傳遞參數...
總之就是通過別人傳遞
接下來看看vue有沒有什麼好的表現
-
通過共同的祖先傳遞參數
: 父組件,provide,attr等, -
event bus
:通過共同的朋友傳遞參數...
總之也是通過別人傳遞
打平,,沒啥好辦法
總結
通過以上對決,我們能夠看出,組件間傳遞數據兩者方法都很像,唯一的區別就是vue提供了更多的api來方便我們的使用,而react很函數式,組件都能傳來傳去....使得react的寫法異常靈活。。
本場pk結束!