vue子組件封裝彈框隻能執行一次的mounted問題及解決
vue子組件封裝彈框隻能執行一次的mounted
封裝瞭一個子組件來處理彈框內容,發現隻能執行一次,在父組件添加一個 v-if 即可,當每次彈框關閉的時候銷毀掉該組件就沒有問題瞭。
貼一下簡易代碼:
父組件:
<add-dialog v-if="addVisible" :dialogVisible="addVisible" @addClose="addClose"></add-dialog> addClose () { this.addVisible = false }
子組件:
<template> <div class="box"> <el-dialog title="提示" :visible.sync="dialogVisible" :before-close="handleClose"> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">取 消</el-button> <el-button type="primary" @click="dialogVisible = false">確 定</el-button> </span> </el-dialog> </div> </template> <script> export default { props: { dialogVisible: Boolean }, watch: { dialogVisible: function () { this.$emit('addClose') } } } </script>
vue mounted方法在什麼情況下使用和js定時器使用
在常見的博客中都會這樣寫到
created
:在模板渲染成html前調用,即通常初始化某些屬性值,然後再渲染成視圖。mounted
:在模板渲染成html後調用,通常是初始化頁面完成後,再對html的dom節點進行一些需要的操作。
在實際的開發過程中我們會經常使用create方法,在頁面還未渲染成html前,調用函數,從後端獲取數據,在實現對頁面的數據進行顯示。
比如說下面例子
created() { if(this.$route.params.id) this.orderNo=this.$route.params.id this.getOrderInfo() }, methods:{ getOrderInfo(){ order.getOrderByNum(this.orderNo).then(resp=>{ this.order=resp.data.data.data console.log((this.order)) //根據訂單中的老師id,獲取老師姓名 getDetailTeacher(this.order.teacherName).then( resp=>{ this.teacherName=resp.data.data.teacher.name console.log(this.teacherName) } ) }).catch(error=>{ }) },
我們在什麼時候使用mounted方法?
mounted通常是在一些插件的使用或者組件的使用中進行操作 也就是頁面渲染之後執行 通常情況下我們會在沒有相應的點擊事件,但需要在頁面展示過程中去不斷調用某一函數情況下使用。
比如說在常見的訂單支付功能,我們點擊立即付款後,跳轉到付款頁面。
這是時候需要我們不斷訪問後端接口查看用戶是否支付成功,支付成功後進行跳轉。
我們需要將查詢函數的調用寫在mounted函數中,並通過計時器不斷調用。
mounted() { //頁面渲染之後執行,設置為3s一更新 this.timer1 = setInterval(() => { this.queryOrderStatus(this.payObj.out_trade_no) }, 3000); }, methods: { //支付跳轉 queryOrderStatus(orderNo) { orderApi.queryPayStatus(orderNo) .then(response => { if (response.data.success) { //支付成功,清除定時器 clearInterval(this.timer1) //提示 this.$message({ type: 'success', message: '支付成功! 💴' }) //跳轉回到課程詳情頁面 this.$router.push({ path: '/course/' + this.payObj.course_id }) } }) } }
定時器方法介紹
this.time1=setInterval(()=>{ this.queryPayStatus(this.this.payObj.out_trade_no) },3000)
setInterval()有兩個參數一個是要執行的函數,一個是要執行的時間間隔單位為毫秒,此處函數采用箭頭函數
ES5 語法如下
setInterval(function(){ alert(“Hello”); }, 3000);
將定時器賦給time 對象
清除定時器 clearInterval(this.time1)
總結
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Vue中created和mounted使用場景分析
- vue如何隨心所欲調整el-dialog中body的樣式
- Vue 中生命周期定義及流程
- vue中的eventBus會不會產生內存泄漏你知道嗎
- vue項目中掃碼支付的實現示例(附demo)