最近在使用vue進行開發,遇到了組件之間傳參的問題,此處主要是針對非父子組件之間的傳參問題進行總結,方法以下:
1、若是兩個組件用友共同的父組件,即vue
FatherComponent.vue代碼 <template> <child-component1/> <child-component2/> </template> 此時須要組件1給組件2傳遞某些參數,實現以下:
一、父組件給組件1綁定一個方法,讓組件1進行回調,組件2接收某個屬性,經過改變父組件的數據從而實現組件2的屬性值的更新,即
父組件vuex
<child-component1 :callback="child1Callback" /> <child-component2 :props="child2Props" /> data () { return { child2Props: ''; } } child1Callback ([args...]) { // 此處更新了父組件的data,使組件2的屬性prop改變 this.child2Props = [args...] }
組件1學習
props: ['callback'] change () { this.callback([args...]) }
二、經過bus進行實現,首先bus.js以下this
const bus = new Vue() export default bus
組件1code
import bus from './bus' methods: { change () { bus.$emit('callComponent2', [args...]) } }
組件2component
import bus from './bus' mounted () { bus.$on('callComponent2', function ([args...]) { // 作你想作的 }) }
三、利用vuex實現,建立store.js至關於某些全局變量,可是能夠被vue檢測到變化開發
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({ state: { pageNo: 0 }, mutations: { 'change' (state, [args...]) { state.pageNo++ } } }) export default store
項目入口js文檔
import store from './store.js' new Vue({ ... store: store ... })
此時在任意vue文件均可以改變pageNo的值,而且會影響到全部使用了pageNo的組件,都會進行更新
childComponent1.vueit
this.$store.commit('change')
childComponent2.vueio
{{this.$store.state.pageNo}}
總結: 一、第一種比較繞,須要有共同的父組件,若是組件間層級太多,會致使代碼混亂,比較難維護。 二、第二種比較直觀,推薦使用,可是要理解,請仔細閱讀官方文檔 三、利用vuex在不少項目中都會顯得殺雞用牛刀,雖然更好理解,可是也帶來了學習成本,而且可能會有一些反作用,可是若是項目比較複雜,利用vuex更加直觀綜合各類方法的優缺點,推薦使用第二種,項目過於複雜請使用第三種若是有更好的方法,請留言指教,謝謝