天天看點

vue元件傳值-父子-兄弟傳值

vue元件傳值

元件傳值應用非常廣泛,将元件抽離,檔案格式更加規範。首先說明元件之間的關系,父子,兄弟,常用的元件為父子元件。

1、單獨編寫的vue檔案就是一個子元件,假定名稱為tableList,将該元件導入到其他頁面時,一般用

<table-list></table-list>

這種樣式呈現。

<table-list></table-list>

所在的元件就是父元件。父子元件通過傳值來改變目前狀态。注意,父元件導入子元件,要在component中挂載才能使用哦!

父元件傳值形式通常為:

// 父元件中
<table-list v-show="have" 
:data="tableData" 
:total="total" 
:categoryId="categoryId" 
:listQuery="listQuery"
>
></table-list>
           

2、想要傳遞的資料直接:綁定就可以。子元件用來接收時,要在子元件中通過props獲得,props和data是同級哦,是以data中的資料怎麼拿,props中的就怎麼拿。

// 子元件中
props: {
    data: {
      type: Array
    },
    total: {
      type: Number
    },
    listQuery: {
      type: Object
    },
    categoryId: {
      type: String
    }
  }
           

傳遞過來如何用呢,接收了要使用的呀。注意以下:data=“data”,引号中的data就是傳遞過來的data,此時才完成了父元件傳值給子元件,子元件接收,子元件使用的完整流程。

<el-table
        ref="multipleTable"
        :data="data"
        tooltip-effect="dark"
        style="width: 100%"
        @selection-change="handleSelectionChange"
      >
           

父傳子很簡單,子傳父同樣道理,不過要通過事件觸發。子元件往往不隻是用來簡單展示,還要有一些操作,比如對表格的增删改。新增一條資料就要重新整理重新請求該頁資料,重新整理就要改變子元件綁定的資料

:data = data

,vue中子元件不能直接修改父元件傳遞過來的資料,是以這就是子傳父的重要應用場景。

還是那個子元件,但是父元件中使用時綁定了一個事件,這個事件名時自定義的。此處叫

expandChoose

<table-list v-show="have" 
:data="tableData" 
:total="total" 
:categoryId="categoryId" 
:listQuery="listQuery"
@expandChoose="expandChoose"
>
></table-list>
           

比如新增事件,通過

this.$emit('父元件上的自定義事件名')

,後面的參數想傳什麼加在後面就行,如下

add() {
      this.$emit('expandeChoose', 參數1,2,...)
    },
           

傳遞過去了如何接受呢,同樣要用的呀。

// 父元件中
expandChoose(a,b,c) {
      //這個事件就可以拿到傳遞過來的參數,比如新增事件要重新整理表格資料
      // 直接讓父元件重新指派即可,這個資料會通過父傳子,響應到子元件上
      this.findAll(a)
},
// 父元件的方法修改了資料
findAll() {
	findAllCustomer(a).then(res => {
		this.tableData = res.data.list
	})
}
           

總結流程就是,子元件通過事件,觸發綁定在父元件上的自定義,自定義事件處理資料綁定到父元件上,父元件傳遞給子元件。子—父---子的形式。兄弟傳值道理相同,隻不過要建立一個中間橋梁。在任意位置建立一個bus.js檔案。

import Vue from 'vue'
const Bus = new Vue()
export default Bus
           

就是又建立了一個vue執行個體。如何使用呢?首先兄弟兩個要同僚引入這個bus.js,路徑就是這個檔案所在的位置。同樣通過事件觸發。格式為Bus.$emit(‘自定義事件名’,參數1,2,…)

// 兄弟元件1
add() {
        Bus.$emit('sendByBus', name,age)
    },
           

如何接受呢?格式如下:要在mounted中Bus.$on(‘自定義事件名’,參數1,2)

// 兄弟元件2
mounted() {
    Bus.$on('sendByBuser', (a,b) => {
      // 這裡将傳遞過來的資料做處理
    })
}
           

總結:通過中間橋梁傳遞,但是不太推薦使用,大部分情況父子元件互相傳值都能解決。