Vue六種傳值方式

前言:

六種傳值方式為:

  • 屬性傳值
  • $refs
  • $parent
  • 通知傳值(廣播傳值)
  • 本地傳值
  • 路由傳值

在介紹組件傳值之前先明確三種組件關(guān)系:父子組件扁达、兄弟組件滑肉、無(wú)關(guān)系組件


上圖關(guān)系基于:A谅畅、B組件同一時(shí)刻只存其一的情況下归苍,其中:

  • A是C、D笔呀、E的父組件镜粤,B是F捏题、G、H的父組件
  • C肉渴、D公荧、E是A的子組件,F(xiàn)同规、G循狰、H是B的子組件
  • C和D、E是兄弟組件券勺,F(xiàn)和G晤揣、H是兄弟組件。但E朱灿、F不是兄弟組件
  • A和B是無(wú)關(guān)系組件,E和F也是無(wú)關(guān)系組件

一钠四、屬性傳值

1.可傳值類型

  • 固定值
  • 綁定屬性
  • 方法
  • 本類對(duì)象

2.操作步驟

①.父組件調(diào)用子組件的時(shí)候盗扒,綁定動(dòng)態(tài)屬性 <htitle mess="父組件給子組件傳值"></htitle>

②. 在子組件里邊通過props,接收父組件傳過來的值

3.適用場(chǎng)景

僅適用于 父組件給子組件傳值

4.屬性介紹

組件屬性定義:

 props:["mess","bindMsg","run","fatherThis"],

子組件驗(yàn)證也可傳入?yún)?shù)的合法性:

 props:{
        'mess':String,
        'bindMsg':[String, Number],
        'run':Function, 
        'fatherThis':Object,
}

更多props請(qǐng)查看Vue官網(wǎng):https://cn.vuejs.org/v2/api/?#props

5.示例代碼

父組件:

<template>
  <div id="app">
    <htitle mess="父組件給子組件傳值了" :bindMsg="msg" :run="run" :fatherThis="this"></htitle>
  </div>
</template>

子組件

<template>
    <div class="divfirst">
        <span>{{mess}}</span>
        <h1>{{bindMsg}}</h1>
        <button @click="run()">點(diǎn)擊調(diào)用父組件方法</button>
        <button @click="getPrasent()">點(diǎn)擊獲取父組件實(shí)體(實(shí)體拿到可以使用用父組件的方法和屬性了)</button>
    </div>
</template>

<script>
export default {
    props:{
        'mess':String,
        'bindMsg':[String, Number],
        'run':Function, 
        'fatherThis':Object,
    },
    data(){
        return {}
    },
    methods:{
        getPrasent(){
            this.fatherThis.run();
            alert(this.fatherThis.msg);
        } 
    }
}
</script>

二、父組件獲取子組件數(shù)據(jù)

?父組件通過$refs獲取子組件的數(shù)據(jù)和方法

1.可獲取類型

  • 子組件屬性
  • 子組件方法

2.操作步驟

1.調(diào)用子組件的時(shí)候調(diào)用一個(gè)ref
<v-fgsheader ref="header"></v-fgsheader>
2.在父組件中通過
this.$refs.header.屬性
this.$refs.header.方法

3.適用場(chǎng)景

子組件給父組件傳值

4.示例代碼

父組件

<template>
    <div class="FGSHome">
        <v-fgsheader ref="header"></v-fgsheader>
        <button @click="getChildProp()">獲取子組件的屬性的值</button>
        <button @click="getChildMethod()">獲取子組件的方法</button>
    </div>
</template>

<script>
import FGSHeader from './FGSHeader.vue'
    export default{

        data(){
            return { }
        },
        components:{
            'v-fgsheader':FGSHeader,
        },
        methods: {
          getChildProp(){
              alert(this.$refs.header.msg);
          },  
          getChildMethod(){
              this.$refs.header.run();
          }
        },
    }
</script>

子組件

<script>
    export default{
        data(){
            return {
                msg:"我是子組件header的值喲"
            }
        },
        methods:{
            run(){
                alert("這是子組件Header的方法+"+this.msg);
            }
        }
    }
</script>

三缀去、子組件獲取父組件數(shù)據(jù)

??子組件通過$parent獲取父組件的數(shù)據(jù)和方法侣灶,這種傳值方式實(shí)際上類似于上邊的屬性傳值中父組件給子組件的傳遞了子類對(duì)象this,只不過Vue官方給封裝好了。

1.可獲取類型

  • 父組件屬性
  • 父組件方法

2.操作步驟

直接在子組件中使用this.$parent.XX缕碎,不需要做任何多余操作褥影。

3.適用場(chǎng)景

父組件給子組件傳值

4.示例代碼

子組件

getFatherProp(){
    alert(this.$parent.fatherMsg); 
},
getFatherMethod(){
    this.$parent.fatherRun();
}

四、通知傳值(廣播傳值)

1.可傳值類型

Vue官網(wǎng)只寫了[...args]咏雌,故通知/廣播傳值我們定為只傳基本數(shù)據(jù)類型凡怎,不能傳方法校焦。

2.操作步驟

1、新建一個(gè)js文件 然后引入vue 實(shí)例化vue 最后暴露這個(gè)實(shí)例

2统倒、在要廣播的地方引入剛才定義的實(shí)例

3寨典、通過 VueEmit.$emit('名稱','數(shù)據(jù)')傳播數(shù)據(jù)

4、在接收收數(shù)據(jù)的地方通過 $on接收廣播的數(shù)據(jù)
VueEmit.$on('名稱',function(){})

3.適用場(chǎng)景

適用于父子組件房匆、兄弟組件間進(jìn)行傳值耸成。
\color{red}{注意:} 無(wú)關(guān)系組件不能用這種方式傳值。(筆者理解是:對(duì)于上圖中的A浴鸿、B組件井氢。假設(shè)A廣播通知,B接收通知岳链。掛載A的時(shí)候B卸載了花竞,也就是說B被內(nèi)存銷毀了,B是接收不到廣播的)

4.屬性介紹

對(duì)于通知傳值而言,可以一人廣播宠页,然后多者接收左胞。

5.示例代碼

vueEvent.js

import Vue from 'vue'
var vueEvents = new Vue();
export default vueEvents;

兄弟組件C(廣播者)

import vueEvents from '../Model/vueEvent.js'

sendEmit(){
      var numbery =  (Math.random()+300).toFixed(3);
      vueEvents.$emit('notifyToNew',this.homeMsg+numbery);
 }

兄弟組件D(接收者)

import vueEvents from '../Model/vueEvent.js'
mounted(){
     var _this = this;
     vueEvents.$on("notifyToNew",function(data_P){
            //注意this的作用域
           console.log('廣播傳過來的值是'+data_P);
          _this.receive = data_P;
    })
}

五、本地傳值

本地傳值方式對(duì)于Vue而言有兩種举户,一種是JS的localStorage烤宙,另一種Vuex

1.可傳值類型

localStorage: String(可通過JSON進(jìn)行json數(shù)據(jù)與String之間的轉(zhuǎn)化)
Vuex:方法俭嘁、數(shù)據(jù)躺枕、異步方法

2.操作步驟

2.1 localStorage

存:

localStorage.setItem('tolist',JSON.stringify(this.tolist));

取:

var tolist = JSON.parse(localStorage.getItem('tolist'));
2.2 Vuex

2.1 src新建一個(gè)vuex文件夾
2.2 vuex文件夾里新建一個(gè)store.js
2.3 安裝vuex cnpm install vuex --save
2.4 在剛才創(chuàng)建的store.js 中引入vue供填、vuex 引入vuex 并且use

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

2.5 定義數(shù)據(jù) state在vuex中用于存儲(chǔ)數(shù)據(jù)

var state = {  count:1,}

2.6 定義方法 mutations里邊放的是方法,方法主要用于改變state里邊的數(shù)據(jù)

var mutations = {
    incCount(){
            ++state.count;
   }
}
   //類似于計(jì)算屬性  state里邊的數(shù)據(jù)改變時(shí)候觸發(fā)的方法拐云。 可以做一些操作 并且可以有返回值
var getterfl={
         completedCountChange(state){
         return state.count * 2 +'位';
        }
    }

Action 類似于 mutation,不同在于: Action 提交的是 mutation近她,而不是直接變更狀態(tài)叉瘩。Action 可以包含任意異步操作

var actionfl = {
  asynIncCount(context){  
//因此你可以調(diào)用context.commit來提交一個(gè)mutation  使用action需要用dispatch
      context.commit('incCount');
  }
}

2.7 實(shí)例化 vuex

const store = new Vuex.Store({
            state,//state: state  簡(jiǎn)寫
            mutations: mutations,//屬性的簡(jiǎn)寫是 mutations
    getters:getterfl,
       actions:actionfl,
})

2.8 對(duì)外暴露

export default  store;

2.9 在需要用的地方引入

import store from '../vuex/store.js'

2.10 注冊(cè)store ,放在methods,data同級(jí)

export default {
    data(){
        return{}
    },
    store:store,
    methods:{
        incCount(){
            this.$store.commit('incCount');
        }
    }
}

2.11 使用vuex
使用數(shù)據(jù): this.\$store.state.count
調(diào)用方法: this.$store.commit('incCount');

3.適用場(chǎng)景

父子組件粘捎、兄弟組件薇缅、無(wú)關(guān)系組件任意組件之間的傳值

4.品鑒

Vuex本質(zhì)上也是一種本地存儲(chǔ),比localStorage的單純值傳遞多了方法攒磨、屬性泳桦、異步方法等功能。但是因?yàn)槭菍?nèi)容本地化娩缰,所以就會(huì)被在瀏覽器中獲取到灸撰。

六、路由傳值

\color{red}{注意:}
1.父組件push使用this.$router.push
2.在子組件中獲取參數(shù)的時(shí)候是this.$route.params

1 、動(dòng)態(tài)路由傳值
   1.1 配置動(dòng)態(tài)路由
      routes:[
         //動(dòng)態(tài)路由參數(shù)  以冒號(hào)開頭
         {path:'/user/:id',conponent:User}
       ]

   1.2 傳值
     第一種寫法 :  <router-link :to="'/user/'+item.id">傳值</router-link>
     第二種寫法 : goToUser(id) {
                    this.$router.push( {path:'/user/'+id});
                  }
   1.3 在對(duì)應(yīng)頁(yè)面取值
       this.$route.params;  //結(jié)果:{id:123}
2浮毯、 Get傳值(類似HTMLGet傳值)
 2.1 配置路由
     const routes = [{path:'/user',component:User},]
 2.2 傳值  
     第一種寫法 : <router-link :to="'/user/?id='+item.id">傳值</router-link>
     第二種寫法 : goToUser(id) {
                        //'user' 是路徑名稱
                      this.$router.push({path:'user',query:{ID:id}});
                  }
 2.3 在對(duì)應(yīng)頁(yè)面取值
     this.$route.query;  //結(jié)果 {id:123}

Tips:路徑傳遞參數(shù)會(huì)拼接在URL路徑后

3 完疫、命名路由push傳值
3.1 配置路由
   const routes = [{path:'/user',name: 'User',component:User},]
3.2 傳值  
        goToUser(id) {
                //'User' 是路徑重命名
              this.$router.push({name:'User',params:{ID:id}});
           }
3.3 在對(duì)應(yīng)頁(yè)面取值
       this.$route.params;  //結(jié)果:{id:123}

Tips:命名路由傳遞參數(shù)不在URL路徑拼接顯示

結(jié)束語(yǔ)

單一組件間建議使用屬性傳值單,一對(duì)多傳值建議廣播傳值亲轨,路由傳值需配合路由進(jìn)行處理趋惨,全局性的值(敏感信息除外)使用本地緩存?zhèn)髦怠8缸咏M件間傳值使用$refs惦蚊、$parent器虾。組件各種傳值方式各有優(yōu)劣,諸君請(qǐng)按實(shí)際情況選取蹦锋。

如果您有什么疑問或者發(fā)現(xiàn)書寫歧義兆沙,非常感激您能留言~
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市莉掂,隨后出現(xiàn)的幾起案子葛圃,更是在濱河造成了極大的恐慌,老刑警劉巖憎妙,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件库正,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡厘唾,警方通過查閱死者的電腦和手機(jī)褥符,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抚垃,“玉大人喷楣,你說我怎么就攤上這事『资鳎” “怎么了铣焊?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)罕伯。 經(jīng)常有香客問我曲伊,道長(zhǎng),這世上最難降的妖魔是什么追他? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任熊昌,我火速辦了婚禮,結(jié)果婚禮上湿酸,老公的妹妹穿的比我還像新娘。我一直安慰自己灭美,他們只是感情好推溃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著届腐,像睡著了一般铁坎。 火紅的嫁衣襯著肌膚如雪蜂奸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天硬萍,我揣著相機(jī)與錄音扩所,去河邊找鬼。 笑死朴乖,一個(gè)胖子當(dāng)著我的面吹牛祖屏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播买羞,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼袁勺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了畜普?” 一聲冷哼從身側(cè)響起期丰,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吃挑,沒想到半個(gè)月后钝荡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舶衬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年埠通,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片约炎。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡植阴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出圾浅,到底是詐尸還是另有隱情掠手,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布狸捕,位于F島的核電站喷鸽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏灸拍。R本人自食惡果不足惜做祝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸡岗。 院中可真熱鬧混槐,春花似錦、人聲如沸轩性。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至悯嗓,卻和暖如春件舵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脯厨。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工铅祸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人合武。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓临梗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親眯杏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夜焦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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

  • 組件(Component)是Vue.js最核心的功能,也是整個(gè)架構(gòu)設(shè)計(jì)最精彩的地方岂贩,當(dāng)然也是最難掌握的茫经。...
    六個(gè)周閱讀 5,617評(píng)論 0 32
  • 摘要: 總有一款合適的通信方式。 作者:浪里行舟 Fundebug經(jīng)授權(quán)轉(zhuǎn)載萎津,版權(quán)歸原作者所有卸伞。 前言 組件是 v...
    Fundebug閱讀 15,574評(píng)論 3 57
  • 前言 組件是 vue.js最強(qiáng)大的功能之一,而組件實(shí)例的作用域是相互獨(dú)立的锉屈,這就意味著不同組件之間的數(shù)據(jù)無(wú)法相互引...
    浪里行舟閱讀 8,266評(píng)論 0 49
  • 前言 組件是 vue.js最強(qiáng)大的功能之一荤傲,而組件實(shí)例的作用域是相互獨(dú)立的,這就意味著不同組件之間的數(shù)據(jù)無(wú)法相互引...
    7abbcd54a89d閱讀 711評(píng)論 0 1
  • 前言 組件是 vue.js最強(qiáng)大的功能之一颈渊,而組件實(shí)例的作用域是相互獨(dú)立的遂黍,這就意味著不同組件之間的數(shù)據(jù)無(wú)法相互引...
    Vicky丶Amor閱讀 5,995評(píng)論 10 162