從 TodoList 中學(xué)父子組件通信

簡單的 TodoList

實現(xiàn)一個簡單的 todolist课锌,當(dāng)我輸入內(nèi)容后,點擊提交自動添加在下面狡赐,如下圖所示:

[圖片上傳失敗...(image-a6ff6a-1559921379879)]

用代碼實現(xiàn)這個效果:

<div id="app">
    <input type="text" v-model="inputVal">
    <button v-on:click="clickBtn">提交</button>
    <ul>
        <li v-for="item in list">{{item}}</li>
    </ul>
</div>
<script>
    let vm = new Vue({
        el:'#app',
        data:{
            list:[],
            inputVal:''
        },
        methods:{
            clickBtn(){
                this.list.push(this.inputVal)
                inputVal = ''
            }
        }
    })
</script>

當(dāng)我在input框中輸入內(nèi)容后稚虎,點擊提交乡范,Vue 會自動將內(nèi)容渲染在頁面中奸柬,具體是怎么實現(xiàn)的呢生年?

我們都知道 Vue 是一個 MVVM 框架,讓開發(fā)者專注于數(shù)據(jù)變更廓奕,無需關(guān)注 Dom抱婉,所以它的核心是VM層,也就是說渲染這部分不需要開發(fā)者考慮了桌粉。

循環(huán)v-for

v-for指令是 Vue 提供的api蒸绩,可以實現(xiàn)循環(huán)添加

v-for="item in list"

list中數(shù)據(jù)循環(huán)添加到頁面中,值為item

所以當(dāng)我點擊提交時番甩,只需要獲取到輸入框中的值侵贵,然后pushlist中届搁,我們看到的效果就是一個個添加缘薛。

綁定v-model

如何獲取輸入框中的值變成了一個問題,沒用 Vue 之前卡睦,獲取輸入框中的值宴胧,非常簡單,用$(input).val()就能輕松獲取表锻。

用了 Vue 之后恕齐,不應(yīng)該操作 Dom 來獲取值,Vue 肯定也考慮到這點了瞬逊,提供了一個api

v-model="inputVal"

第一次用這個指令時显歧,踩了一個坑,我在inputVal兩邊加上了雙括號确镊,從而導(dǎo)致頁面中沒任何反應(yīng)士骤,這邊是不需要加雙括號的。渲染模版時才需要用 Vue 提供的模版字符串

一個簡單的 TodoList 就已經(jīng)實現(xiàn)了蕾域。

組件化

每個li其實都是一個組件拷肌,我們可以用組件的形式來開發(fā)

全局組件:

<div id="app">
    <input type="text" v-model="inputVal">
    <button v-on:click="clickBtn">提交</button>
    <ul>
        <todo-list v-for="item in list"
                    v-bind:content="index"
        ></todo-list>
    </ul>
</div>
<script>
    Vue.component('TodoLsit',{
        props:['content'],
        template:`<li>{{content}}</li>`,
    })
    let vm = new Vue({
        el: '#app',
        data: {
            list: [],
            inputVal: ''
        },
        methods: {
            clickBtn() {
                this.list.push(this.inputVal)
                this.inputVal = ''
            }
        }
    })
</script>

用 Vue 提供的component創(chuàng)建組件可創(chuàng)建一個全局組件到旦,組件的名字TodoList在模版中需要用todo-list來實現(xiàn),大小變小寫巨缘,中間用-連接添忘。

局部組件:

<div id="app">
    <input type="text" v-model="inputVal">
    <button v-on:click="clickBtn">提交</button>
    <ul>
        <todo-list v-for="item in list"
                  v-bind:content="item"
        ></todo-list>
    </ul>
</div>
<script>
    let TodoList = {
        props:['content'],
        template: `<li>{{content}}</li>`,
    }
    let vm = new Vue({
        el: '#app',
        data: {
            list: [],
            inputVal: ''
        },
        component:{     //注冊組件
          TodoList  
        },
        methods: {
            clickBtn() {
                this.list.push(this.inputVal)
                this.inputVal = ''
            }
        }
    })
</script>

使用局部組件,聲明一個對象若锁,內(nèi)容和全局組件一樣搁骑,不過需要再 Vue 中注冊一下,使用component屬性注冊

component:{
    TodoList
}

用了組件后之后又固,就會涉及到數(shù)據(jù)通信靶病,一般有兩種:

  1. 組件中如何才能拿到外面的數(shù)據(jù)
  2. 組件中數(shù)據(jù)變化,外面如何知道

父 -> 子組件通信

現(xiàn)在已經(jīng)用組件實現(xiàn)上面的功能了口予,但是組件中還沒有數(shù)據(jù)娄周,如果將我輸入框中的數(shù)據(jù)傳遞給子組件。

子組件中獲取數(shù)據(jù)沪停,還是用v-for循環(huán)煤辨,用v-bind綁定需要的數(shù)據(jù),組件中用props獲取綁定的數(shù)據(jù)

<todo-list v-for="(item,index) in list"
           v-bind:content="item"
           v-bind:index="index"
           v-on:delete="handleItemDelete"
></todo-list>

let TodoList = {
    props:['content'],
    template: `<li>{{content}}</li>`,           // content 就是相關(guān)數(shù)據(jù)
}

父 -> 子組件通信實現(xiàn)了往組件里面添加數(shù)據(jù)木张,如果子組件中要刪除一項众辨,應(yīng)該怎么操作呢?

子 -> 父組件通信

子 -> 父組件通信舷礼,Vue 提供了一個$emit()方法鹃彻,組件中使用v-on指令可綁定事件

<div id="app">
    <input type="text" v-model="inputVal">
    <button v-on:click="clickBtn">提交</button>
    <ul>
        <todo-list v-for="(item,index) in list"
                  v-bind:item="item"
                  v-bind:index="index"
                  v-on:delete="handleItemDelete"
        ></todo-list>
    </ul>
</div>
<script>
    Vue.component('TodoList',{
      props:['item', 'index'],
      template: `<li v-on:click="handleItemClick">{{item}}</li>`,
      methods: {
          handleItemClick() {
              this.$emit('delete', this.index)
          }
      }
    })
    let vm = new Vue({
        el: '#app',
        data: {
            list: [],
            inputVal: ''
        },
        methods: {
            clickBtn() {
                this.list.push(this.inputVal)
                this.inputVal = ''
            },
            handleItemDelete(index) {
                this.list.splice(index, 1)
            }
        }
    })
</script>

組件中綁定事件,第一個參數(shù)是事件名妻献,第二個參數(shù)是要傳遞給父元素的參數(shù)

template: '<li v-on:click="handleItemClick">{{item}}</li>'' //綁定事件為 click蛛株,需要執(zhí)行的函數(shù)是 handleItemClick

methods: {                                  //寫在組件里面
    handleItemClick() {
        this.$emit('delete', this.index)  
    }
}

父元素監(jiān)聽事件

<todo-list v-for="(item,index) in list"
           v-bind:item="item"
           v-bind:index="index"
           v-on:delete="handleItemDelete"   //監(jiān)聽 delete 事件, 執(zhí)行函數(shù)是 handleItemDelete
></todo-list>

handleItemDelete(index) {                   //寫在 Vue 實例中
    this.list.splice(index, 1)
}

通過父子組件之間的通信育拨,就可以實現(xiàn) 父->子 子->父 之間數(shù)據(jù)傳輸問題谨履。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市熬丧,隨后出現(xiàn)的幾起案子笋粟,更是在濱河造成了極大的恐慌,老刑警劉巖析蝴,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件害捕,死亡現(xiàn)場離奇詭異,居然都是意外死亡闷畸,警方通過查閱死者的電腦和手機尝盼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腾啥,“玉大人东涡,你說我怎么就攤上這事冯吓。” “怎么了疮跑?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵组贺,是天一觀的道長。 經(jīng)常有香客問我祖娘,道長失尖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任渐苏,我火速辦了婚禮掀潮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘琼富。我一直安慰自己仪吧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布鞠眉。 她就那樣靜靜地躺著薯鼠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪械蹋。 梳的紋絲不亂的頭發(fā)上出皇,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音哗戈,去河邊找鬼郊艘。 笑死,一個胖子當(dāng)著我的面吹牛唯咬,可吹牛的內(nèi)容都是我干的纱注。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼副渴,長吁一口氣:“原來是場噩夢啊……” “哼奈附!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起煮剧,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎将鸵,沒想到半個月后勉盅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡顶掉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年草娜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痒筒。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡宰闰,死狀恐怖茬贵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情移袍,我是刑警寧澤解藻,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站葡盗,受9級特大地震影響螟左,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜觅够,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一胶背、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喘先,春花似錦钳吟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至树枫,卻和暖如春直焙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砂轻。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工奔誓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搔涝。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓厨喂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庄呈。 傳聞我的和親對象是個殘疾皇子蜕煌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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

  • 組件(Component)是Vue.js最核心的功能,也是整個架構(gòu)設(shè)計最精彩的地方诬留,當(dāng)然也是最難掌握的斜纪。...
    六個周閱讀 5,614評論 0 32
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容文兑。關(guān)于...
    云之外閱讀 5,050評論 0 29
  • vue概述 在官方文檔中盒刚,有一句話對Vue的定位說的很明確:Vue.js 的核心是一個允許采用簡潔的模板語法來聲明...
    li4065閱讀 7,227評論 0 25
  • 基于Vue的一些資料 內(nèi)容 UI組件 開發(fā)框架 實用庫 服務(wù)端 輔助工具 應(yīng)用實例 Demo示例 element★...
    嘗了又嘗閱讀 1,154評論 0 1
  • 什么是組件? 組件 (Component) 是 Vue.js 最強大的功能之一绿贞。組件可以擴展 HTML 元素因块,封裝...
    youins閱讀 9,480評論 0 13