vue總結(jié)「二」--組件間的通訊

1. 父子組件通訊:props 和 $emit

父組件 index.vue

  • 給子組件 Input 傳遞事件 addHandler
  • 給子組件 List 傳遞數(shù)據(jù)list、事件 deleteHandler
<template>
  <div>
    //傳遞 addHandler事件
    <Input @add="addHandler"/>
    //傳遞 list數(shù)據(jù)、deleteHandler事件
    <List :listFather="list" @delete="deleteHandler"/>
  </div>
</template>

<script>
//引入子組件
import Input from './Input'
import List from './List'
export default {
  //注冊(cè)子組件
  components:{
    Input,
    List
  },
  data() {
    return {
      list:[
        {
          id:"id 1",
          title:"標(biāo)題 1"
        },
        {
          id:"id 2",
          title:"標(biāo)題 2"
        },
      ]
    };
  },
  methods: {
    addHandler(title){
      this.list.push({
        id:`id-${Date.now()}`,
        title
      })
    },
    deleteHandler(id){
      this.list=this.list.filter(item=>item.id!=id)
    }
  },
};
</script>

子組件 Input.vue

  • 通過(guò)$emit調(diào)用父組件的 add事件 并傳值
<template>
  <div>
    <input type="text" v-model="title">
    <button @click="addTitle">add</button>
  </div>
</template>

<script>
import event from './event'
export default {
  data() {
    return {
      title:""
    };
  },
  methods: {
    addTitle(){
      //調(diào)用父組件的事件
      this.$emit('add',this.title)
    }
  },
};
</script>

子組件 List.vue

  • 通過(guò)props獲取到父組件傳的數(shù)據(jù)listFather
  • 通過(guò)$emit調(diào)用父組件的 delete事件 并傳值
<template>
  <div>
    <ul>
      <li v-for="item in listFather" :key="item.id">
        {{item.title}}
        <button @click="deleteItem(item.id)">刪除</button>
      </li>
    </ul>
  </div>
</template>

<script>
import event from './event'
export default {
  props:{
    // 定義類(lèi)型和默認(rèn)值
    listFather:{
      type:Array,
      default(){
        return []
      }
    }
  },
  data() {
    return {};
  },
  methods: {
    deleteItem(id){
      this.$emit('delete',id)
    },
  },
};
</script>

2. 組件間通訊:自定義事件

實(shí)現(xiàn)組件input 和 組件 List之間的通訊

① 新建文件event.js 實(shí)例一個(gè)vue對(duì)象
② 兩個(gè)組件分別引入該實(shí)例
③ 通過(guò)綁定自定義事件,調(diào)用自定義事件實(shí)現(xiàn)組件間的通訊

組件List.vue

  • 綁定自定義事件onAddTit
  • 在deforeDestroy鉤子中銷(xiāo)毀 自定義事件onAddTit,防止造成內(nèi)存泄露
<template>
  <div>
    <ul>
      <li v-for="item in listFather" :key="item.id">
        {{item.title}}
        <button @click="deleteItem(item.id)">刪除</button>
      </li>
    </ul>
  </div>
</template>

<script>
import event from './event'
export default {
  data() {
    return {
      listFather:[]
    };
  },
  mounted() {
    //綁定自定義事件
    event.$on('onAddTit',this.addTitHandler)
  },
  deforeDestroy(){
    //及時(shí)銷(xiāo)毀,負(fù)責(zé)可能造成內(nèi)存泄露
    event.$off('onAddTit',this.addTitHandler)
  },
  methods: {
    addTitHandler(title){
      listFather.push(title)
    }
  },
};
</script>

組件 Input.vue

  • 調(diào)用在List組件中綁定的自定義事件 onAddTit
<template>
  <div>
    <input type="text" v-model="title">
    <button @click="addTitle">add</button>
  </div>
</template>

<script>
import event from './event'
export default {
  data() {
    return {
      title:""
    };
  },
  methods: {
    addTitle(){
      //調(diào)用自定義事件
      event.$emit('onAddTit',this.title)
      this.title=''
    }
  },
};
</script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容