el-dialog弹框因为是用display:none和display:block来控制显示隐藏的,dom元素不会被删除,所以dialog弹框里面的内容只会初始化的时候创建dom元素渲染页面,如果里面有组件且组件在初始化时候会调用方法,那么这个方法只会在第一次打开弹框时调用!
通常会有需求:组件嵌套在dialog弹框中,希望在父组件中每次打开弹框都会重新执行子组件中mounted中的方法!
父组件:
<template>
<div class="dialgos">
<el-button type="text" @click="handleClick">点击打开 Dialog</el-button>
<!-- 选择给dialog弹框加个v-if 就可以实现弹框每次打开会会重新创建里面的元素包括引入的组件,相当于重新渲染重新执行组件的方法(缺点是代码不优美,不利于底层的diff算法) -->
<el-dialog title="提示" :visible.sync="dialogVisible" width="30%" v-if="dialogVisible">
<p style="margin-bottom:20px"> 这是组件引入的地方</p>
<Child />
<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>
import Child from '../components/Child/index.vue'
export default {
components: {
Child
},
data() {
return {
dialogVisible: false
}
},
methods: {
//此方法打开弹框
handleClick() {
this.dialogVisible = true
}
}
}
</script>
<style>
</style>
子组件:
<template>
<div>
我是子组件
</div>
</template>
<script>
export default {
//可以看到每次打开弹框下面mounted的方法都会执行
mounted() {
console.log("我是子组件");
}
}
</script>
<style>
</style>
需求实现!缺点就是频繁的创建和销毁dom元素,影响页面加载速度,当然还有别的方法可以实现的!只不过这个更便捷