vue父組件監聽子組件數據更新方式(hook)
vue父組件監聽子組件數據更新
this.$on(‘hook : 生命周期鉤子’, () => {})
可以監聽執行生命周期鉤子,適用場合如:
data(){ return { itemID:'', } } mounted(){ // 設置定時器 this.itemID = setInterval(()=> { console.log('開計時器') }, 1000); // 離開頁面時清除定時器 this.$once('hook:beforeDestroy', ()=> { clearInterval(this.itemID) }) }
將定時器和清除定時器放在一起,功能和寫在beforeDestroy生命周期中是一樣滴,這樣維護起來比較方便 ~
定時器裡放需要定時請求的數據,然後離開頁面就清除定時器,也就停止請求
@hook:生命周期鉤子=“觸發的函數”
父組件監聽子組件數據更新,也就是監聽生命周期 ~
來人! 上代碼 !
// 父組件 <template> <div class="father"> <son @hook:update="sonUpdateFun"/> // 我是子組件 </div> </template>
<script> import son from './son.vue' export default { components:{ 'son' }, methods:{ sonUpdateFun(){ console.log("子組件的數據更新啦~~~") } } } </script>
當子組件的數據更新的時候就會觸發函數 sonUpdateFun,就可以進行一些不可描述的操作瞭
監聽子組件內數據變化,父組件綁定change事件
如題,做瞭一個分頁功能,element裡面的分頁,已經有瞭頁碼改變、每頁數量改變的change事件,這樣如果當頁碼改變、每頁數量改變的時候,又要在methods裡面寫change來根據改變的值來獲取分頁,這樣就很麻煩,如果沒個頁面都有分頁,這樣就要在methods裡面多寫change事件。
想到瞭一個解決方法,就是把element的分頁封裝成一個組件,具體思路如下:
子組件
1.這個綁定瞭每頁數量改變的事件,
handleSizeChange handleSizeChange(index) { this.query.length = index },
2.這個綁定瞭當前頁碼改變的事件
handleCurrentChange handleCurrentChange(index) { console.log(index) this.query.start = index }
3.最重要的數據,這裡是當前頁碼和每頁數量,
query: { start: 1, length: 10 }
4.頁碼跟數量改變是在子組件中完成的,寫個watch,然後實時把query傳遞給父組件
watch: { query: { handler(val, oldVal) { this.$emit('changeData', this.query) }, deep: true } },
5.完整子組件代碼
<template> <div> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page.sync="query.start" :page-sizes="[10, 20, 30, 50]" :page-size="query.length" layout="sizes, prev, pager, next" :total="total"> </el-pagination> </div> </template>
<script> export default { name: 'pagination', props: { size: { type: Number, default: function() { return 10 } }, total: { type: Number, default: function() { return 10 } }, start: { type: Number, default: function() { return 1 } } }, created() { this.query = { start: this.start, length: this.size } }, data() { return { query: { start: 1, length: 10 } } }, watch: { query: { handler(val, oldVal) { this.$emit('changeData', this.query) }, deep: true } }, methods: { handleSizeChange(index) { this.query.length = index }, handleCurrentChange(index) { console.log(index) this.query.start = index } } } </script> <style scoped> </style>
父組件
1.先引入組件,組件位置根據自己的而定
import pagination from '../../components/table-pagination/pagination'
2.然後註冊組件
components: { pagination },
3.使用組件
<pagination :size="query.length" :total="total" :start="query.start" @changeData="getList($event)" />
組件傳遞的參數:
4.如何獲取子組件傳遞過來的query對象?
1)父組件獲取
註意:
這裡的changeData跟子組件中$emit發送的地方要相同!
2)子組件部位
註意:this.$emit('changeData',this.query)
changeData就是父組件中子組件部位註冊的自定義事件,this.query就是要傳遞的值
3)我的獲取分頁的函數就是getList(query),直接在自定義事件中寫@changeData="getList($event)"
大功告成
這樣每當子組件中query的值改變之後,父組件都會執行分頁查詢請求,就可以實時更新瞭!
後記:自定義事件,可以做很多事情,比如,點擊子組件按鈕,傳遞參數,然後父組件使用這個參數來做什麼事情,當整個頁面的數據量、邏輯實在是太龐大的時候,就可以把整個也面分成一個個小組件來,這樣就不會顯得頁面龐大復雜瞭…
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Vue使用v-model封裝el-pagination組件的全過程
- vue項目實現分頁效果
- Vue組件庫ElementUI實現表格列表分頁效果
- Vue+ElementUI 封裝簡易PaginationSelect組件的詳細步驟
- js如何使用Pagination+PageHelper實現分頁