一文就夠了-vue2.0組件間的傳參方式

1.父子組件

通常父子組件間我們使用props傳值,方式如下

1.1父?jìng)髯?/h3>

父組件

<template>
  <HelloWorld :msg="msg">
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  data(){
    return({
      msg:"父組件的值"
    })
  },
  components: {
    HelloWorld
  }
}

子組件

<template>
  <div class="hello">
    {{ msg }}
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: {
      //以下數(shù)據(jù)皆為選填數(shù)據(jù)
      type: 'String',    // 驗(yàn)證傳來(lái)值的數(shù)據(jù)類型 
      default: '' ,    //父組件如果沒(méi)有傳值首繁,就取這個(gè)默認(rèn)值;如果說(shuō)是一個(gè)數(shù)組或者對(duì)象障斋,需要寫(xiě)成函數(shù)形式
      required: true/false ,   // true--必須傳的
      validator:function(val){         // v是父組件的數(shù)據(jù)可以對(duì)傳入的值進(jìn)行自定義的校驗(yàn)通過(guò)添加一個(gè)validator函數(shù)進(jìn)行數(shù)據(jù)的校驗(yàn)酌住,如果函數(shù)返回false,則校驗(yàn)失敗叼旋,進(jìn)而報(bào)錯(cuò)
        return false                  // 驗(yàn)證失敗
        return true                  // 驗(yàn)證成功
      }
    }
    },
  data:()=>{
    return{
    
    }
  },
  methods:{

  }
}
</script>

1.2子傳父

子組件

<template>
  <div class="hello" @click="toFar">
    點(diǎn)擊
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
 
  data:()=>{
    return{
    
    }
  },
  methods:{
    toFar(){
      this.$emit('fromChild','msg')
    }
  }
}
</script>

父組件

<template>
  <HelloWorld @formChild="getMsg">
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  data(){
    return({
      msg:"父組件的值"
    })
  },
  methods:{
    getMsg(val){
      console.log(val)
    } 
  },
  components: {
    HelloWorld
  }
}
</script>

2.兄弟組件

2.1公共的事件總線eventBus

我們可以創(chuàng)建一個(gè)eventbus.js文件來(lái)作為中轉(zhuǎn)文件

import Vue from 'vue'
export default new Vue()

A組件派發(fā)事件

//pageName:a組件
<template>
  <div @click="toB">

  </div>
</template>

<script>
import eventBus from '../tools/eventbus.js'
export default {
  data () {
    return {
    }
  },
  methods: {
    toB(){
      eventBus.#emit('formA','Aval')
    }
  }, 
}
</script>

B組件點(diǎn)閱事件

//pageName:b組件
<template>
  <div></div>
</template>

<script>
import eventBus from '../tools/eventbus.js'
export default {
  data () {
    return {
    }
  },
  mounted(){
    eventBus.$on('formA',setData(val))
  },
  methods: {
    setData(val){
     console.log(val)
    }
  }, 
}
</script>

3.路由傳參

3.1query傳參

this.$router.push({
      path: '/detail',
      query: {
         id: id
       }
 })
 
 // 對(duì)應(yīng)路由配置:
 {
     path: '/detail',
     name: 'Detail',
     component: Detail
 }
 
 // 子組件獲取參數(shù):
 this.$route.query.id

3.2params傳參

this.$router.push({
    name: 'Detail',
    params: {
       id: id
    }
 })
 
 // 對(duì)應(yīng)路由配置:
 {
     path: '/detail',
     name: 'Detail',
     component: Detail
  }
  
 // 子組件獲取參數(shù):
 this.$route.params.id

3.3params傳參且提前約定好參數(shù)

// 直接在路由地址后面拼接參數(shù)
this.$router.push({
      path: `/detail/${id}`,
 })
 
// 路由配置
{
     path: '/detail/:id',
     name: 'Detail',
     component: Detail
 }
 
//獲取參數(shù)
this.$route.params.id

關(guān)于query傳參和params傳參的特點(diǎn)
query傳參
1.標(biāo)定路由時(shí)name和path都行
2.query傳參類似于get請(qǐng)求參數(shù)會(huì)處于url上
3.頁(yè)面刷新時(shí)參數(shù)不會(huì)消失
params傳參
1.標(biāo)定路由時(shí)使用name
2.請(qǐng)求參數(shù)不會(huì)處于URL上
3.頁(yè)面刷新參數(shù)會(huì)失效(除非約定好參數(shù))

4.$refs,$parent,$children

4.1$refs

獲取的是設(shè)置ref的子組件的實(shí)例靶衍,
在子組件中

<template>
  <div class="hello" @click="toFar">
    子組件
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
 
  data:()=>{
    return{
     num:1
    }
  },
  methods:{
    toFar(){
      this.$emit('fromChild','msg')
    }
  }
}
</script>

在父組件中

<template>
  <HelloWorld ref="hw" @formChild="getMsg" />
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  data(){
    return({
      msg:"父組件的值"
    })
  },
  mounted(){
    
    console.log(this.$refs)
  },
  methods:{
    getMsg(){
      console.log(this.$children)
    } 
  },
  components: {
    HelloWorld
  }
}
</script>

打印得到的結(jié)果是

ref對(duì)象.png

可以看到我們的子組件定義的狀態(tài)和方法都會(huì)被獲取到灾炭,但是該方法獲取數(shù)據(jù)時(shí)并不是響應(yīng)式的。$parent,$children方法也類似颅眶,但是可以直接在子元素或者父元素中獲取蜈出,無(wú)需掛載在ref類似的標(biāo)識(shí)上

5.vuex

Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開(kāi)發(fā)的狀態(tài)管理模式。它的狀態(tài)存儲(chǔ)是響應(yīng)式的涛酗。采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài)铡原,也就是說(shuō)偷厦,對(duì)數(shù)據(jù)的所有操作都要在vuex中進(jìn)行。但是我們?cè)撊绾稳ナ褂媚匮嗫蹋挷欢嗾f(shuō)
先來(lái)看看vuex的基本雛形

const store = new Vuex.Store({
    state: {
        //相當(dāng)于自定義組件中的data
      count: 1,
    },
    getters:{
        //相當(dāng)于自定義組件中的computed
        dataList:(state)=>{
           //計(jì)算分頁(yè)后的數(shù)據(jù)
            
            return (state.count + 1);
        },
    },
    mutations: {
        //相當(dāng)于自定義組件中的methods只泼,只能做同步的操作
        //對(duì)state中的數(shù)據(jù)進(jìn)行修改
        increment(state) {
          state.count++
      },
    },
    actions: {
        //異步操作,例如ajax請(qǐng)求
        //使用commit 觸發(fā) mutations
    }
})

store代表倉(cāng)庫(kù)的意思卵洗,在vuex中也依舊是请唱,它存儲(chǔ)了state(狀態(tài)),getters(自定義的依賴變量)忌怎,mutations(同步操作函數(shù)集)籍滴,actions(異步操作函數(shù)集)

5.1state(狀態(tài))

state中存放定義的狀態(tài)酪夷,獲取的在頁(yè)面中獲取的方法有
this.$store.state
如果需要獲取的數(shù)據(jù)過(guò)多時(shí)我們可以使用語(yǔ)法糖

...mapState({
      count: 'count'
    })

5.2getters(依賴狀態(tài)自定義變量)

getter 相當(dāng)于自定義組件中的computed榴啸,getter 的返回值會(huì)根據(jù)它的依賴被緩存起來(lái),且只有當(dāng)它的依賴值發(fā)生了改變才會(huì)被重新計(jì)算晚岭。
getter 接受 state 作為其第一個(gè)參數(shù)鸥印,也可以接受其他 getter 作為第二個(gè)參數(shù)。
可以使用this.$store.getters 訪問(wèn)這些值坦报。

5.3mutations

vuex的機(jī)制中只有mutation可以更改 Vuex 的 State 中數(shù)據(jù)库说。
通過(guò) store.commit(type,data)調(diào)用 mutation,第一個(gè)參數(shù)為事件類型片择,需要和mutation中函數(shù)名稱一致潜的;第二個(gè)參數(shù)為要傳遞的參數(shù)。
mutation中的函數(shù)接受 state 作為其第一個(gè)參數(shù)字管,第二個(gè)參數(shù)是commit一個(gè)mutations中的函數(shù)時(shí)所傳遞的函數(shù)啰挪。
語(yǔ)法糖有

...mapMutations(['cartAdd']),

5.4actions

action 主要用來(lái)操作所有的異步請(qǐng)求。
action 不能直接對(duì)State 中的數(shù)據(jù)進(jìn)行操作嘲叔,只能通過(guò)commit(type,data) 方法調(diào)用 mutation亡呵。
action 函數(shù)接受一個(gè)與 store 實(shí)例具有相同方法和屬性的 context 對(duì)象,因此你可以調(diào)用 context.commit 提交一個(gè) mutation硫戈,或者通過(guò) context.state 和 context.getters 來(lái)獲取 state 和 getters锰什。
通過(guò) store.dispatch(type)方法觸發(fā)action,參數(shù)為事件類型丁逝,需要和action中函數(shù)名稱一致汁胆。

以上就是vue2.0組件間參數(shù)傳遞的常用內(nèi)容,僅供參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霜幼,一起剝皮案震驚了整個(gè)濱河市嫩码,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辛掠,老刑警劉巖谢谦,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件释牺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡回挽,警方通過(guò)查閱死者的電腦和手機(jī)们陆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門洁奈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事坷牛。” “怎么了轩娶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵魄缚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我喜滨,道長(zhǎng)捉捅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任虽风,我火速辦了婚禮棒口,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辜膝。我一直安慰自己无牵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布厂抖。 她就那樣靜靜地躺著茎毁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忱辅。 梳的紋絲不亂的頭發(fā)上七蜘,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音耕蝉,去河邊找鬼崔梗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛垒在,可吹牛的內(nèi)容都是我干的蒜魄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼场躯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谈为!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起踢关,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伞鲫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后签舞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秕脓,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柒瓣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吠架。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芙贫。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖傍药,靈堂內(nèi)的尸體忽然破棺而出磺平,到底是詐尸還是另有隱情,我是刑警寧澤拐辽,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布拣挪,位于F島的核電站,受9級(jí)特大地震影響俱诸,放射性物質(zhì)發(fā)生泄漏菠劝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一乙埃、第九天 我趴在偏房一處隱蔽的房頂上張望闸英。 院中可真熱鬧,春花似錦介袜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至捶牢,卻和暖如春鸠珠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秋麸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工渐排, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灸蟆。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓驯耻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親炒考。 傳聞我的和親對(duì)象是個(gè)殘疾皇子可缚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容