Skip to content
官方QQ交流群
pc端ui:468705115   点此加入
移动端ui:468217742   点此加入
技术交流1:87208295   点此加入
技术交流2:787747122   点此加入
官网
云控制台
开放平台
关注微信公众号
代码仓库: 码云

$cvDialogRender 动态弹窗

简要

动态弹窗
render

vue 调用方式

  • 方式1(只能在 setup 下调用 )
js
import { getCurrentInstance, nextTick } from 'vue';

// 获取当前组件实例
const instance = getCurrentInstance();
// 从实例中获取全局属性
const { $cvDrawerRender } = instance.appContext.config.globalProperties;

 nextTick(() => {
    $cvDrawerRender(
      // instance.ctx,
      instance.vnode,
      // 抽屉body,需要展示的内部内容的组件
      DiaTest,
      // 抽屉的属性
      { title: '', size: '100%' },
      // 传递给内部页面的参数,内部用props接收
      { flowID: '' }
    ).show();
  });
  • 方式2(只能在 setup 下调用 )
js
import { getCurrentInstance, nextTick } from 'vue';
import { cvDrawerRender } from '@10yun/cv-pc-ui';
// 获取当前组件实例
const instance = getCurrentInstance();
 nextTick(() => {
    cvDrawerRender(
      // instance.ctx,
      instance.vnode,
      // 抽屉body,需要展示的内部内容的组件
      DiaTest,
      // 抽屉的属性
      { title: '', size: '100%' },
      // 传递给内部页面的参数,内部用props接收
      { flowID: '' }
    ).show();
  });

调用弹窗的页面

vue
<template>
  <div>
    <cv-btn-base @click="openDialogDefult">调用子弹窗默认方式</cv-btn-base>
    <cv-btn-base @click="openDialog1">调用子弹窗简写方式</cv-btn-base>
    <cv-btn-base @click="openDialogTable">测试3-加载列表框</cv-btn-base>
    <!-- <cv-btn-base @click="openDialog2">测试2</cv-btn-base> -->
  </div>
</template>
<script>
import dialogBody1 from './renderJsx/dialogBody1';
import dialogBody2 from './renderJsx/dialogBody2';
import dialogCompTable from './renderJsx/dialogCompTable';

// import JSDialog from "../../../packages/dialog-box/src/index.js";
export default {
  data() {
    return {};
  },
  methods: {
    // 打开子弹窗
    openDialogDefult() {
      let dialogOption = {
        title: '弹窗名称',
        width: '60%',
        beforeClose: (done) => {
          console.log('guanbi前的操作');
          done();
        }
      };
      let propsOption = {};
      let onFunc = {
        subSendParent(chuandiData) {
          console.log('---走到这里了,传递的数据', chuandiData);
        },
        openDialog2(chuandiData) {
          console.log('---走到这里了 openDialog2,准备', this);
          console.log('---走到这里了 openDialog2,传递的数据', chuandiData);
        }
      };
      // 注册弹窗并且打开
      this.$cvDialogRender(dialogBody1, dialogOption, propsOption, onFunc).show();
    },
    openDialogTable() {
      this.$cvDialogRender(
        dialogCompTable,
        { title: '这个是弹窗的名字', class: 'js-dialog' },
        { defaultName: 'JSDialog传递的参数' },
        {
          openDialog2(chuandiData) {
            console.log('---走到这里了,准备', this);
            console.log('---走到这里了,传递的数据', chuandiData);
          }
          // openDialog2: (receiveData) => {
          //   console.log('---走到这里了,准备', receiveData);
          //   this.openDialog2();
          // },
        }
      ).show();
    },
    openDialog1() {
      this.$cvDialogRender(
        dialogBody1,
        { title: '这个是弹窗的名字', class: 'js-dialog' },
        { defaultName: 'JSDialog传递的参数' },
        {
          openDialog2(chuandiData) {
            console.log('---走到这里了,准备', this);
            console.log('---走到这里了,传递的数据', chuandiData);
          }
          // openDialog2: (receiveData) => {
          //   console.log('---走到这里了,准备', receiveData);
          //   this.openDialog2();
          // },
        }
      ).show();
      // const dialog = new JSDialog({
      //   component: dialogBody,
      //   dialogOpts: {title: '这个是弹窗的名字',class: 'js-dialog'},
      //   props: {defaultName: 'JSDialog传递的参数'},
      //   onFunc: {
      //     openDialog2(chuandiData) {
      //       console.log('---走到这里了,准备', this);
      //       console.log('---走到这里了,传递的数据', chuandiData);
      //     },
      //     // openDialog2: (receiveData) => {
      //     //   console.log('---走到这里了,准备', receiveData);
      //     //   this.openDialog2();
      //     // },
      //   },
      //   onOK() {
      //     const inner = dialog.getInner() // 能取到dialogBody的引用
      //     // 控制流程
      //     if (inner.isCanSave()) {
      //       // 获取保存数据
      //       const postData = inner.getSaveData()
      //       console.log('>>>>> postData >>>>>', postData)
      //       // 关闭弹框
      //       dialog.close()
      //     }
      //   },
      //   onCancel() {
      //     dialog.close() // 弹框关闭
      //   }
      // })
      // dialog.show();
    },
    openDialog2() {
      const dialog = new JSDialog({
        component: dialogBody2,
        footer: {
          ok: {
            // 修改默认按钮
            text: '新增'
          },
          cancel: {
            // 隐藏默认按钮
            isHide: true
          },
          add: {
            // 新增按钮
            text: '另存为',
            clickFn() {
              dialog.close();
            },
            order: -1 // 控制按钮顺序,order小的显示在右边
          },
          add2: {
            text: '新增按钮2',
            clickFn() {
              dialog.close();
            },
            order: 3
          }
        }
      });
      dialog.show(); // 弹框显示
    }
  }
};
</script>
  • 弹窗内部内容 dialogBody1
vue
<template>
  <div v-loading="isLoading" element-loading-text="加载中" element-loading-spinner="el-icon-loading" style="height: 100%">
    <div style="width: 100%; height: calc(100% - 90px)">
      <div class="item">
        <div>名称</div>
        <el-input v-model="name"></el-input>
      </div>
      <div class="item">
        <el-radio-group v-model="attention">
          <el-radio value="已关注">已关注</el-radio>
          <el-radio value="等下关注">等下关注</el-radio>
        </el-radio-group>
      </div>
      <div class="item">
        <el-radio-group v-model="like">
          <el-radio value="已点赞">已点赞</el-radio>
          <el-radio value="等下点赞">等下点赞</el-radio>
        </el-radio-group>
      </div>
      <el-button @click="handleTitle">设置新的标题</el-button>
    </div>
    <!-- <el-dialog v-model="isShow" width="300" appendToBody>弹窗333</el-dialog> -->
    <div style="padding: 10px 20px 20px 0; text-align: right; box-sizing: border-box">
      <cv-btn-base @click="onClose">取 消</cv-btn-base>
      <cv-btn-base type="primary" @click="handleOk1">子弹窗</cv-btn-base>
      <cv-btn-base type="primary" @click="handleOk2">测试方法 openDialog2</cv-btn-base>
      <cv-btn-base type="primary" @click="onOK">确 定</cv-btn-base>
    </div>
  </div>
</template>

<script>
// import { reactive, toRefs } from '@vue/composition-api'
import { ElMessage } from 'element-plus';
import dialogBody2 from './dialogBody2.vue';
export default {
  props: {
    defaultName: String
  },
  data() {
    return {
      isLoading: true,
      name: this.defaultName, // 名称
      attention: '已关注', // 关注
      like: '已点赞', // 点赞
      formData: {
        a: 1,
        b: 2,
        c: 3
      },
      isShow: false
    };
  },
  created() {
    this.initData();
  },
  methods: {
    initData() {
      // 这边模拟请求数据
      setTimeout(() => {
        this.isLoading = false;
        this.isShow = true;
      }, 800);
    },
    handleTitle() {
      console.log('取消');
      this.$emit('setTitle', '我是新的标题');
    },
    handleOk1() {
      this.$cvDialogRender(
        dialogBody2,
        {
          title: '这个是子弹窗的名字222',
          class: 'js-dialog',
          // width: '400px',
          draggable: true,
          style: 'width: 400px;'
        },
        { defaultName: 'JSDialog传递的参数' },
        {
          openDialog2(chuandiData) {
            console.log('---走到这里了,准备', this);
            console.log('---走到这里了,传递的数据', chuandiData);
          }
          // openDialog2: (receiveData) => {
          //   console.log('---走到这里了,准备', receiveData);
          //   this.openDialog2();
          // },
        }
      ).show();
    },
    handleOk2() {
      console.log('内部11111');
      this.$emit('openDialog2');
      console.log('内部22222');
    },
    onOK() {},
    onClose() {
      this.$emit('close');
      // this.$emit('openDialog2', this.formData);
    },
    onNameBlur() {},
    // 保存前校验
    isCanSave() {
      const ATTENTIONED = '已关注';
      const LIKED = '已点赞';
      if (this.attention !== ATTENTIONED || this.like !== LIKED) {
        ElMessage.error('未关注或者点赞,不能关闭,嘻嘻');
        return false;
      }
      return true;
    },
    // 获取保存数据
    getSaveData() {
      // ******* lodash pick 从对象中抽取数据
      return {
        name: this.name,
        attention: this.attention,
        like: this.like
      };
    }
  }
};
</script>
  • 弹窗内部内容 dialogBody2
vue
<template>
  <div v-loading="isLoading" element-loading-text="加载中" element-loading-spinner="el-icon-loading">
    <div style="width: 100%; height: 300px">
      <el-scrollbar style="height: 300px">
        <h2>我是第二个弹窗啊啊啊啊</h2>
        <div>------</div>
        <div class="item">
          <div>撒打算大</div>
          <cv-input-text v-model="formData.name" />
        </div>
        <div class="item">
          <el-radio-group v-model="attention">
            <el-radio value="已关注">已关注</el-radio>
            <el-radio value="等下关注">等下关注</el-radio>
          </el-radio-group>
        </div>
        <div class="item">
          <el-radio-group v-model="like">
            <el-radio value="已点赞">已点赞</el-radio>
            <el-radio value="等下点赞">等下点赞</el-radio>
          </el-radio-group>
        </div>
      </el-scrollbar>
    </div>
    <div style="padding: 10px 20px 20px 0; text-align: right; box-sizing: border-box">
      <cv-btn-base @click="handleClose">取 消</cv-btn-base>
      <cv-btn-base type="primary" @click="handleOk">确 定</cv-btn-base>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    defaultName: String
  },
  data() {
    return {
      isLoading: true,
      name: this.defaultName, // 名称
      attention: '已关注', // 关注
      like: '已点赞', // 点赞
      formData: {}
    };
  },
  created() {
    this.initData();
  },
  methods: {
    initData() {
      // 这边模拟请求数据
      setTimeout(() => {
        this.isLoading = false;
      }, 1400);
    },
    // 保存前校验
    handleOk() {
      this.$emit('close');
    },
    handleClose() {
      this.$emit('close');
    }
  }
};
</script>
<style scoped>
.el-scrollbar__wrap {
  overflow-x: hidden !important;
}
</style>

$cvDialogRender 全局方法参数说明

  • 参数说明
字段类型注释参考
第1个参数 bodyComponent子组件需要加载的《弹窗内容》的组件
第2个参数 dialogOption对象object弹窗主体说明
第3个参数 propsOption对象object需要传入《弹窗内容》组件的props数据
第4个参数 onFunc对象object《弹窗内容》组件调用父页面绑定的方法

参数 bodyComponent 说明

参数 dialogOption 说明

字段类型默认说明参考
titlestring-弹窗标题
widthstring-弹窗宽度
dragbooleanfalse是否拖拽true、false
closeIsConfirmBooleanfalse关闭弹窗时,是否确认true、false
closeIsDestroyBooleantrue关闭弹窗时,是否销毁true、false
beforeCloseFunctionnull关闭前事件

参数 propsOption 说明

参数 onFunc 说明

可以监听多个方法

$cvDialogRender 提供给 bodyComponent 弹窗内容调用的方法

方法说明参考
close关闭弹窗
setTitle设置标题

在 bodyComponent 弹窗内容组件里面,调用方式

js

this.$emit(方法名字,传递参数);

// 关闭弹窗
this.$emit('close');


// 设置弹窗标题
this.$emit('setTitle','这是一个新的弹窗标题');

流程

1、 业务页面
-》 唤起弹窗
标题、引入组件(先引入-写死)、是否显示、宽度、高度
-》

参考

Copyright © 2017 10yun.com | 十云提供计算服务-IPV6 | ctocode组开发