1. /*
    2. * @Description : 对话框混淆
    3. * @Author : XH
    4. * @Date
    5. * @LastEditors
    6. * @LastEditTime
    7. */
    8. import { dialogForm } from '@/components/dialog';
    9. import _ from 'lodash';
    10. export default {
    11. components: {
    12. dialogForm
    13. },
    14. props: {
    15. // 是否显示
    16. visible: {
    17. type: Boolean,
    18. default: false
    19. },
    20. // 标题
    21. title: {
    22. type: String,
    23. default: '弹窗'
    24. },
    25. // 初始化表单参数
    26. data: {
    27. type: Object,
    28. default: () => ({})
    29. },
    30. // 配置传参,非表单参数
    31. config: {
    32. type: Object,
    33. default: () => ({})
    34. }
    35. },
    36. data() {
    37. return {
    38. // 自定义 可选值:[small/medium/large/custom]
    39. 'size': 'medium',
    40. 'sizeCustom': {},
    41. // 弹窗配置
    42. 'custom-class': 'el-dialog',
    43. 'appendToBody': true,
    44. 'isFullScreen': false,
    45. 'hasScrollbar': true, // 是否有滚动条
    46. 'labelWidth': '150px', // 表单的label
    47. 'hasFooterSlot': true, // 是否有底部插槽
    48. 'hasTablePadding': false, // 表格页弹窗 是否需要table的padding
    49. 'titleInfo': '', // 弹窗后的描述
    50. // 表单相关
    51. 'modalData': {}, // 表单数据
    52. 'modalConfig': {}, // 配置传参
    53. // 内部参数
    54. 'defaultModalData': {}, // 记录初始表单数据
    55. 'defaultModalConfig': {}, // 配置传参
    56. 'pvt_visible': false // 先请求数据再决定是否渲染
    57. }
    58. },
    59. created() {
    60. this.defaultModalData = _.cloneDeep(this.modalData);
    61. this.defaultModalConfig = _.cloneDeep(this.modalConfig);
    62. },
    63. methods: {
    64. /**
    65. * 弹窗打开之前的回调
    66. * !!! 说明:主要针对于请求数据之后再确定是否打开情况
    67. * @return {boolean}
    68. */
    69. beforeOpenDialog() {
    70. return true;
    71. },
    72. /**
    73. * 弹窗打开动画之后的回调
    74. * 主要解决 打开时获取弹窗内部的 refs
    75. */
    76. beforeOpenedDialog() {
    77. },
    78. /**
    79. * 弹窗关闭动画之后的回调
    80. */
    81. beforeClosedDialog() {
    82. },
    83. /**
    84. * 确定的回调事件
    85. */
    86. comfirmSet() {
    87. console.log(this.modalData);
    88. },
    89. /**************** 分割线 以下方法不可重写 ****************/
    90. /**
    91. * 关闭输入框 自动数据重置
    92. */
    93. cancelDialogShow() {
    94. this.$emit('update:visible', false);
    95. },
    96. /**
    97. * 触发父组件成功回调
    98. * @param data
    99. */
    100. emitBtnSuccess(data = {}) {
    101. this.$emit('btnSuccess', data);
    102. },
    103. /**
    104. * 验证正则 确定按钮 无需外部调用
    105. */
    106. handleConfirmSet() {
    107. if (!this.$refs.modalDataDialog) {
    108. console.warn("el-dialog-form 需添加 ref='modalDataDialog'");
    109. }
    110. this.$refs.modalDataDialog && this.$refs.modalDataDialog.validate((valid) => {
    111. if (valid) {
    112. this.confirmSet();
    113. }
    114. });
    115. },
    116. /**
    117. * 弹窗关闭动画结束时的回调
    118. */
    119. closed() {
    120. this.beforeClosedDialog();
    121. this.clearUploadFiles();
    122. },
    123. // 通过refs判断 如果是upload组件 则还原上传组件
    124. clearUploadFiles() {
    125. _.forEach(this.$refs, (item) => {
    126. if (item && item.$options.name == 'el-upload') {
    127. item.clearFiles();
    128. }
    129. });
    130. }
    131. },
    132. watch: {
    133. async visible(val) {
    134. if (val) {
    135. this.modalData = _.merge({}, this.defaultModalData, this.data);
    136. this.modalConfig = _.merge({}, this.defaultModalConfig, this.config);
    137. let res = await this.beforeOpenDialog();
    138. if (res) {
    139. this.pvt_visible = true;
    140. } else {
    141. this.cancelDialogShow();
    142. }
    143. } else {
    144. this.pvt_visible = false;
    145. }
    146. }
    147. }
    148. }