[vue3快速入門] 18.vue組件基礎(chǔ)2——props父組件給子組件傳值

上節(jié)課我們寫了一個計數(shù)器組件猿推,但是它每次初始化顯示出來都一樣,我們這節(jié)課學(xué)習(xí)通過父組件給子組件傳值铝阐,根據(jù)傳遞不同的值讓子組件有不同的效果宏粤。這就要用到組件一個重要功能porps。

這節(jié)課我們做一個超級英雄投票系統(tǒng)骂因,每個計數(shù)器顯示一個超級英雄的名字炎咖,點擊后給這個英雄投票,他的票數(shù)加一寒波。

方便起見乘盼,先把上節(jié)課的counter組件復(fù)制出來一個,改個名叫hero.vue俄烁,App.vue里的counter也都要改成hero

1)子組件定義一個prop
hero組件要放進(jìn)App.vue里使用绸栅,所以hero就是子組件了,我們給子組件增加一個prop叫heroName页屠,意思是初始化這個子組件時粹胯,子組件需要heroName這個參數(shù)
在vue中的語法是,在導(dǎo)出的對象增加一個屬性props辰企,

export default {
  props:['heroName'], // 增加
  data() {
    return {
      count: 0,
    }
  },
  methods: {
    onClick() {
      this.count++
    },
  },
}

props是一個數(shù)組风纠,表明子組件要接受那些值最為參數(shù),可以是多個牢贸,這里數(shù)組里只有一個元素竹观,表示我們我們接受一個叫heroName的參數(shù)
現(xiàn)在這么寫是沒有錯誤的,但是包含的信息有點少潜索,為了以后維護(hù)方便和vue更能理解我們的代碼臭增,我們給heroName這個參數(shù)多加點信息,寫法如下

  props: {
    heroName: {
       type: String,  // 表示heroName這個參數(shù)的數(shù)據(jù)類型是字符串
       default: '', // 如果父組件沒有傳heroName這個參數(shù)時帮辟,默認(rèn)是空字符串
    },
},

需要注意速址,這時props是一個對象object,不再是數(shù)組
這樣寫這個prop表達(dá)了三個信息

  1. hero這個組件可以接收一個叫heroName參數(shù)
  2. heroName這個參數(shù)必須是字符串類型
  3. heroName沒有傳遞時由驹,它的值是一個空字符串
    這樣我們就為hero這個組件聲明了一個叫做heroName的prop芍锚,大家要記住這種寫法
    ps:如果需要傳遞多個prop,就在props里面寫多個這樣的屬性蔓榄,形式是一樣

2)使用prop
prop的時候和data里面的屬性使用一樣并炮,在script直接可以使用this.訪問

  mounted(){
    console.log(this.heroName)
  },

在template中也使用雙花括號來綁定

  <div @click="onClick" class="counter-btn">
    {{ heroName }}的票數(shù)是:{{ count }},點擊增加
  </div>

完整的代碼是

<template>
  <div @click="onClick" class="counter-btn">
    {{ heroName }}的票數(shù)是:{{ count }}甥郑,點擊增加
  </div>
</template>

<script>
export default {
  props: {
    heroName: {
      type: String,
      default: '',
    },
  },
  data() {
    return {
      count: 0,
    }
  },
  mounted() {
    console.log(this.heroName)
  },
  methods: {
    onClick() {
      this.count++
    },
  },
}
</script>

<style>
.counter-btn {
  display: inline-block;
  padding: 10px 20px;
  background-color: #ccc;
  border-radius: 5px;
  cursor: pointer;
}
</style>

3)父組件給子組件傳遞prop
現(xiàn)在子組件全部都準(zhǔn)備好了逃魄,就等父組件傳值了,
父組件在template中澜搅,通過給子組件的標(biāo)簽添加屬性的方式傳值伍俘,一看就知道了

<hero heroName="鋼鐵俠"></hero>

在App.vue中添加一個數(shù)組邪锌,用來渲染多個超級英雄

  data(){
    return {
      list: ['鋼鐵俠', '蜘蛛俠', '美國隊長', '蝙蝠俠'],
    }
  }

在template寫一個v-for循環(huán)

    <ul>
      <li v-for="(item, index) in list" :key="index" class="list-item">
        <hero :heroName="item"></hero>
      </li>
    </ul>
這里需要注意一下,現(xiàn)在傳遞參數(shù)的是時候是通過一個動態(tài)變量item傳的癌瘾,所以在heroName前面加了冒號:,是v-bind:的簡寫

這樣我們的超級英雄投票系統(tǒng)就完成了


App.vue的完整代碼是

<template>
  <div>
    <ul>
      <li v-for="(item, index) in list" :key="index" class="list-item">
        <hero :heroName="item"></hero>
      </li>
    </ul>
  </div>
</template>

<script>
import hero from './components/hero.vue'
// 組件基礎(chǔ)
export default {
  name: 'App',
  components: {
    hero,
  },
  data() {
    return {
      list: ['鋼鐵俠', '蜘蛛俠', '美國隊長', '蝙蝠俠'],
    }
  },
}
</script>

<style>
.list-item {
  margin: 10px;
}
</style>

需要注意的是觅丰,在傳遞prop時,如果是數(shù)字妨退、布爾值妇萄、數(shù)組、對象都需要加上冒號:

<!-- 即便 `42` 是靜態(tài)的咬荷,我們?nèi)匀恍枰?`v-bind` 來告訴 Vue     -->
<!-- 這是一個 JavaScript 表達(dá)式而不是一個字符串冠句。             -->
<blog-post :likes="42"></blog-post>

<!-- 即便 `false` 是靜態(tài)的,我們?nèi)匀恍枰?`v-bind` 來告訴 Vue  -->
<!-- 這是一個 JavaScript 表達(dá)式而不是一個字符串幸乒。             -->
<blog-post :is-published="false"></blog-post>

<!-- 即便數(shù)組是靜態(tài)的懦底,我們?nèi)匀恍枰?`v-bind` 來告訴 Vue        -->
<!-- 這是一個 JavaScript 表達(dá)式而不是一個字符串。             -->
<blog-post :comment-ids="[234, 266, 273]"></blog-post>


<!-- 即便對象是靜態(tài)的逝变,我們?nèi)匀恍枰?`v-bind` 來告訴 Vue        -->
<!-- 這是一個 JavaScript 表達(dá)式而不是一個字符串基茵。             -->
<blog-post
  :author="{
    name: 'Veronica',
    company: 'Veridian Dynamics'
  }"
></blog-post>

上面是官網(wǎng)的說明

這節(jié)可以主要分為三點

  1. 使用prop向子組件傳值
  2. 子組件對prop的驗證:類型和默認(rèn)值的指定
  3. 在傳遞動態(tài)參數(shù)、數(shù)字壳影、布爾等值時拱层,一定要加冒號:,這是新手特別容易出錯的一個地方,大家一定要注意
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宴咧,一起剝皮案震驚了整個濱河市根灯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掺栅,老刑警劉巖烙肺,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氧卧,居然都是意外死亡桃笙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門沙绝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搏明,“玉大人,你說我怎么就攤上這事闪檬⌒侵” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵粗悯,是天一觀的道長虚循。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么横缔? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任铺遂,我火速辦了婚禮,結(jié)果婚禮上剪廉,老公的妹妹穿的比我還像新娘娃循。我一直安慰自己炕檩,他們只是感情好斗蒋,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笛质,像睡著了一般泉沾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妇押,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天跷究,我揣著相機(jī)與錄音,去河邊找鬼敲霍。 笑死俊马,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肩杈。 我是一名探鬼主播柴我,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扩然!你這毒婦竟也來了艘儒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤夫偶,失蹤者是張志新(化名)和其女友劉穎界睁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兵拢,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翻斟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了说铃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片访惜。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖截汪,靈堂內(nèi)的尸體忽然破棺而出疾牲,到底是詐尸還是另有隱情,我是刑警寧澤衙解,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布阳柔,位于F島的核電站,受9級特大地震影響蚓峦,放射性物質(zhì)發(fā)生泄漏舌剂。R本人自食惡果不足惜济锄,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霍转。 院中可真熱鬧荐绝,春花似錦、人聲如沸避消。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岩喷。三九已至恕沫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纱意,已是汗流浹背婶溯。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留偷霉,地道東北人迄委。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像类少,于是被迫代替她去往敵國和親叙身。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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