一、在项目中,使用父组件页面+子组件(el-Dialog)弹窗的结构
如果在子组件dialog中使用onMounted,那么这个onMounted在父组件加载的时候就会触发(尽管这个时候弹窗没打开)
解决方法:对子组件使用v-if,一开始v-if=false,打开子组件的时候,才把v-if变成true
javascript
//父组件代码
<cloudDiskDialog v-if="visibleCloudDisk" :dialogData="dialogData"></cloudDiskDialog>
// 定义传递给弹框的数据
const dialogData = reactive({
visible: false,
......
})
const visibleCloudDisk = ref(false) //v-if绑定的值
//打开子组件弹窗
function viewCloudDisk() {
//弹窗visible为true
dialogData.visible = true
//v-if绑定的值也为true
visibleCloudDisk.value = true
}
javascript
//子组件代码
<el-dialog
class="confirmDialog"
//控制弹窗打开关闭
v-model="props.dialogData.visible"
:title="'云硬盘详情'"
:destroy-on-close="true"
:close-on-click-modal="false"
@close="closeDialog"
>
......
</el-dialog>
二、(子组件)OnUpdate触发机制
1、(子组件)响应式值用在了页面上,且该值在改变
点击测试按钮,OnUpdated会一直触发
javascript
<template>
<div class="confirmDialog-wrapper">
//值必须写在el-dialog标签的外面,因为el-dialog有插槽,插槽会影响onUpdated触发
{{ testValue }}
<!-- 画质选择弹窗 -->
<el-dialog
class="confirmDialog"
v-model="visible"
title="画质选择"
:destroy-on-close="true"
:close-on-click-modal="false"
:show-close="true"
>
<span class="title">分辨率</span>
<button @click="testing">测试</button>
//省略弹窗代码
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import {onUpdated } from 'vue'
let testValue = ref('')
//测试按钮的回调
function testing() {
testValue.value = Math.random()
}
onUpdated(() => {
console.log('onUpadate')
})
</script>
二、父组件传递给子组件的响应式值改变了(尽管子组件没有使用defineProps接受该值)
javascript
//父组件代码
<div>
<button @click="test">测试</button>
<selectImgQualityDialog
:flag="flag"
></selectImgQualityDialog>
</div>
//传递给子组件的值
const flag = ref(true)
//测试按钮的回调
function test() {
flag.value = !flag.value
}
按父组件的测试按钮,此时在子组件selectImgQualityDialog里,onUpdated在一直执行