vue的組件傳值

組件化思想是vue框架里面極具重要的一種思想,使用組件可以在我們的項目之中更好的搭建整體布局狂芋,從而輕松的使用少量的代碼完成大量的工作。

父組件向子組件傳值

父組件向子組件進(jìn)行傳值,使用的是綁定一個屬性的方式没炒。我們先看一個例子:

            <todo-item v-bind:content = '1'>
            </todo-item>

我們定義了一個模板如下:

var TodoItem = {
        props: ['content' ],       //子組件接收父組件的傳值
        template: "<li>{{content}}</li>"
    }

這是最簡單的父組件向子組件傳值,父組件綁定了一個屬性犯戏,其名為content(這里content是我們自己定義的送火,你也可以之間使用已經(jīng)定義好的屬性,比如title)先匪,而它所攜帶的參數(shù)為數(shù)字1漾脂,這個1是number類型

這里我們需要注意一個重點,就是我們在父組件里面綁定屬性用的是v-bind胚鸯,你也可以不使用v-bind骨稿,直接寫content='1',他倆的區(qū)別在于姜钳,直接寫屬性名后跟屬性值坦冠,這個屬性值只能是字符串類型,而使用v-bind綁定參數(shù)哥桥,而后跟的可以不僅僅是字符串辙浑,可以是任意類型

到現(xiàn)在為止父組件只需要做這么一件事即可,接下來子組件需要去獲取到父組件傳出來的數(shù)據(jù)

我們在子組件里面獲取數(shù)據(jù)需要用到props來接收拟糕,其后面可以接收多個數(shù)據(jù)判呕,當(dāng)我們接收到數(shù)據(jù)之后,就可以直接使用這個傳出來的content了

  • 另外需要注意的地方在于送滞,vue規(guī)定子組件對于數(shù)據(jù)只有使用權(quán)不可以修改數(shù)據(jù)侠草,因為可能有多個子組件接收父組件傳出來的數(shù)據(jù),如果這個數(shù)據(jù)是引用數(shù)據(jù)犁嗅,那么有一個子組件修改了數(shù)據(jù)边涕,勢必影響其他的子組件,如果非要修改,我們可以使用一個變量拷貝接收的數(shù)據(jù)

子組件向父組件傳值

子組件向外傳出數(shù)據(jù)需要用到$emit
這里我們直接先放上例子功蜓,我就直接附上了完整的html代碼

<body>
    <div id="root">
        <ul>
            <!--v-bind是父組件向子組件傳值园爷,簡寫方法直接寫冒號即可
                這里@click是父組件監(jiān)聽子組件傳出來的click事件,如果發(fā)現(xiàn)了子組件拋出的click事件式撼,就會觸發(fā)后面的itemClick函數(shù)-->
            <todo-item :content = '1' @click="itemClick"></todo-item>
        </ul>
    </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    Vue.component('TodoItem' , {
        props: ['content'],       //子組件接收父組件的傳值
        template: "<li @click='handleItemClick'>{{content}}</li>",
        methods: {
            handleItemClick: function(){
                //點擊子組件的時候童社,會向外拋出一個click事件,$emit用于向外拋出事件著隆,后面可以跟一個或多個參數(shù)叠洗,用于傳值
                this.$emit("click" , this.content)  
            }
        }
    })
    var vm = new Vue({
        el: '#root',
        methods: {
            //形參value是用來接收事件觸發(fā)的時候傳過來的參數(shù),就是$emit后面攜帶的參數(shù)
            itemClick: function(value){
                alert(value)
            }
        }
    })
</script>

這段代碼的功能是點擊元素的時候旅东,會彈框顯示里面的內(nèi)容
大體思路就是灭抑,

  • 一開始定義模板的時候,就已經(jīng)綁定了會觸發(fā)handleItemClick函數(shù)的點擊事件
  • 當(dāng)我們點擊li標(biāo)簽的時候抵代,觸發(fā)該函數(shù)腾节,通過$emit方法向外拋出一個名為click的事件
  • 我們在父組件里面進(jìn)行監(jiān)聽,如果發(fā)現(xiàn)了click事件荤牍,就會觸發(fā)后面的itemClick事件案腺,并執(zhí)行里面的回調(diào)函數(shù),打印里面的值

非父子組件傳值

  • 這里建議父子組件已經(jīng)掌握的同學(xué)康吵,再對非父子組件進(jìn)行學(xué)習(xí)
    我們先附上例子劈榨,這樣比較方便上下文查看,所以我依然附上完整代碼晦嵌,建議大家比著思路一點一點敲出來同辣,盡量不要復(fù)制粘貼
<body>
    <div id="root">
        <child content='Dell'></child>
        <child content='Leo'></child>
    </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    //在vue的原型上面定義一個bus并讓其等于vue的實例,vue是一個函數(shù)惭载,所以它有原型鏈旱函,這樣任意一個vue實例都可以使用bus屬性
    Vue.prototype.bus = new Vue()

    Vue.component('child' , {
        props:['content'],
        //這里有一個重點,組件里面使用的data必須是一個函數(shù)描滔,且必須返回一個對象棒妨,所用到的數(shù)據(jù)都在該對象里面
        //下面這句話的意思就是我們把接收到的數(shù)據(jù)進(jìn)行了拷貝,讓selfContent等于當(dāng)前content的值
        data: function(){
            return {
                selfContent: this.content
            }
        },
        template: '<div @click="handleClick">{{selfContent}}</div>',
        methods: {
            handleClick: function(){
                //通過實例自身的bus方法向外觸發(fā)change事件含长,并攜帶了selfContent參數(shù)
                this.bus.$emit('change' , this.selfContent)
            }
        },
        //生命周期鉤子券腔,頁面掛載后立即觸發(fā)
        mounted: function(){
            //綁定當(dāng)前組件對象,回調(diào)函數(shù)執(zhí)行的時候this指向會改變
            let that = this
            //對事件進(jìn)行監(jiān)聽拘泞,$on可以對事件進(jìn)行監(jiān)聽纷纫,監(jiān)聽bus的改變,$emit用于向外觸發(fā)事件田弥,$off用于取消自定義事件監(jiān)聽器
            //bus是組件定義的實例涛酗,所以每個組件都會有bus屬性,而bus是實例偷厦,所以它也會有$on方法
            this.bus.$on('change' , function(msg){
                //讓組件中的selfContent全部等于傳進(jìn)來的參數(shù)
                that.selfContent = msg
            })
        }
    })

    var vm = new Vue({
        el: '#root'
    })
</script>

這段代碼的作用是商叹,頁面中的兩個元素是兄弟元素,當(dāng)我們點擊其中一個元素的時候只泼,其他標(biāo)簽里面的值會和當(dāng)前點擊的標(biāo)簽里面的值相等

我來講一下實現(xiàn)原理:父組件兩個child組件是屬于兄弟元素剖笙,我們想要他們之間進(jìn)行數(shù)值互傳。

  • 所以我們先定義一個bus方法讓其在vue原型上面请唱,這樣只要是vue實例都可以使用該方法弥咪。
  • 然后我們在模板綁定點擊事件,當(dāng)元素點擊時觸發(fā)handleClick函數(shù)十绑,當(dāng)handleClick點擊事件觸發(fā)的時候聚至,執(zhí)行回調(diào)函數(shù),向外拋出change事件本橙,并傳出去從父組件接收到的參數(shù)扳躬,selfContent
  • 緊接著我們使用生命周期鉤子,mounted甚亭,它會在頁面掛載之后觸發(fā)
  • 所有的組件都會調(diào)用$on監(jiān)聽bus的改變贷币,如果發(fā)現(xiàn)change事件,立即調(diào)用回調(diào)函數(shù)亏狰,并對$emit傳出來的參數(shù)進(jìn)行接收
  • 最后執(zhí)行函數(shù)即可

純原創(chuàng)役纹,如果有錯誤,歡迎指正暇唾,我一定及時修改 =^=

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末促脉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子策州,更是在濱河造成了極大的恐慌嘲叔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抽活,死亡現(xiàn)場離奇詭異硫戈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)下硕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門丁逝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梭姓,你說我怎么就攤上這事霜幼。” “怎么了誉尖?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵罪既,是天一觀的道長。 經(jīng)常有香客問我,道長琢感,這世上最難降的妖魔是什么丢间? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮驹针,結(jié)果婚禮上烘挫,老公的妹妹穿的比我還像新娘。我一直安慰自己柬甥,他們只是感情好饮六,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著苛蒲,像睡著了一般卤橄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臂外,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天窟扑,我揣著相機(jī)與錄音,去河邊找鬼寄月。 笑死辜膝,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漾肮。 我是一名探鬼主播厂抖,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼克懊!你這毒婦竟也來了忱辅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谭溉,失蹤者是張志新(化名)和其女友劉穎墙懂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扮念,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡损搬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柜与。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巧勤。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖弄匕,靈堂內(nèi)的尸體忽然破棺而出颅悉,到底是詐尸還是另有隱情,我是刑警寧澤迁匠,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布剩瓶,位于F島的核電站驹溃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏延曙。R本人自食惡果不足惜豌鹤,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搂鲫。 院中可真熱鬧傍药,春花似錦磺平、人聲如沸魂仍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擦酌。三九已至,卻和暖如春菠劝,著一層夾襖步出監(jiān)牢的瞬間赊舶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工赶诊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留笼平,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓舔痪,卻偏偏與公主長得像寓调,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锄码,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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