新人成长之入门Vue.js弹窗Dialog介绍(二)
前言
在上一篇博文中介绍了vue.js的常用指令,今天总结归纳一下弹窗dialog的使用,弹窗经常被使用在一些表单的增删改查啊,或者弹出一些提示信息等等,在保留当前页面状态的情况下,告知用户并承载相关操作。
之前做了表格的增删改查任务,其中用到了dialog弹窗,今天总结归纳一下vue.js中几种弹窗dialog的使用
基本用法
dialog弹出对话框
<el-button type="text" @click="dialogvisible = true">点击打开 dialog</el-button> <el-dialog title="提示" :visible.sync="dialogvisible" width="30%" :before-close="handleclose"> <span>这是一段信息</span> <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>
<script> export default { data() { return { dialogvisible: false }; }, methods: { handleclose(done) { this.$confirm('确认关闭?') .then(_ => { done(); }) .catch(_ => {}); } } }; </script>
在上面的代码当中,一个dialog弹窗需要设置visible
属性,它接收boolean
,当为true
时显示 dialog。dialog 分为两个部分:body
和footer
,footer
需要具名为footer
的slot
。title
属性用于定义标题,它是可选的,默认值为空。最后,本例还展示了before-close
的用法,before-close
仅当用户通过点击关闭图标或遮罩关闭 dialog 时起效。如果你在 footer
具名 slot 里添加了用于关闭 dialog 的按钮,那么可以在按钮的点击回调函数里加入 before-close
的相关逻辑。
自定义弹窗内容
dialog 组件的内容可以是任意的,甚至可以是表格或表单,下面分别举例嵌套表单和表格
嵌套表格
eg:
<el-button type="text" @click="dialogtablevisible = true">打开嵌套表格的 dialog</el-button> <el-dialog title="球员信息" :visible.sync="dialogtablevisible"> <el-table :data="griddata"> <el-table-column property="number" label="球衣号码" width="150"></el-table-column> <el-table-column property="name" label="姓名" width="200"></el-table-column> <el-table-column property="position" label="所打位置"></el-table-column> </el-table> </el-dialog>
<script> export default { data() { return { griddata: [{ number: '23', name: 'lebron', position:'sf' }, { number: '3', name: 'wade', position:'sg' }, { number: '3', name: 'paul', position:'pg' }, { number: '7', name: 'anthony', position:'sf' }], dialogtablevisible: false, }; } }; </script>
嵌套表单
eg:
<el-button type="text" @click="dialogformvisible = true">打开嵌套表单的 dialog</el-button> <el-dialog title="增加球员" :visible.sync="dialogformvisible"> <el-form :model="form"> <el-form-item label="球员名称" :label-width="formlabelwidth"> <el-input v-model="form.name" auto-complete="off"></el-input> </el-form-item> <el-form-item label="球员位置" :label-width="formlabelwidth"> <el-select v-model="form.number" placeholder="请选择球员位置"> <el-option label="组织后卫" value="pg"></el-option> <el-option label="得分后卫" value="sg"></el-option> <el-option label="小前锋" value="sf"></el-option> <el-option label="大前锋" value="pf"></el-option> <el-option label="中锋" value="c"></el-option> </el-select> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="dialogformvisible = false">取 消</el-button> <el-button type="primary" @click="dialogformvisible = false">确 定</el-button> </div> </el-dialog>
<script> export default { data() { return { dialogformvisible: false, form: { name: '', region: '', }, formlabelwidth: '120px' }; } }; </script>
嵌套的dialog
如果需要在一个dialog内部嵌套另外一个dialog,则需要使用"append-to-body"属性
eg:
<template> <el-button type="text" @click="outervisible = true">点击打开外层 dialog</el-button> <el-dialog title="外层 dialog" :visible.sync="outervisible"> <el-dialog width="30%" title="内层 dialog" :visible.sync="innervisible" append-to-body> </el-dialog> <div slot="footer" class="dialog-footer"> <el-button @click="outervisible = false">取 消</el-button> <el-button type="primary" @click="innervisible = true">打开内层 dialog</el-button> </div> </el-dialog> </template>
<script> export default { data() { return { outervisible: false, innervisible: false }; } } </script>
正常情况下,不建议使用嵌套的 dialog,如果需要在页面上同时显示多个 dialog,可以将它们平级放置。对于确实需要嵌套 dialog 的场景,使用append-to-body
属性。如上代码示例,将内层 dialog 的该属性设置为 true,它就会插入至 body 元素上,从而保证内外层 dialog 和遮罩层级关系的正确。
居中布局
标题和底部可水平居中
eg:
<el-button type="text" @click="centerdialogvisible = true">点击打开 dialog</el-button> <el-dialog title="提示" :visible.sync="centerdialogvisible" width="30%" center> <span>需要注意的是内容是默认不居中的</span> <span slot="footer" class="dialog-footer"> <el-button @click="centerdialogvisible = false">取 消</el-button> <el-button type="primary" @click="centerdialogvisible = false">确 定</el-button> </span> </el-dialog>
<script> export default { data() { return { centerdialogvisible: false }; } }; </script>
dialog 的内容是懒渲染的,即在第一次被打开之前,传入的默认 slot 不会被渲染到 dom 上。因此,如果需要执行 dom 操作,或通过 ref
获取相应组件,请在 open
事件回调中进行。
如果 visible
属性绑定的变量位于 vuex 的 store 内,那么 .sync
不会正常工作。此时需要去除 .sync
修饰符,同时监听 dialog 的 open
和 close
事件,在事件回调中执行 vuex 中对应的 mutation 更新 visible
属性绑定的变量的值。
dialog弹窗(attributes)属性总结
dialog弹窗(events)事件总结
dialog弹窗(slot)插槽总结(插槽决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性)