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

$cvDrawerRender 动态抽屉

简要

动态抽屉
render

示例

::: demo

vue
<template>
  <div>
    <cv-btn-base @click="openDialog1">测试打开抽屉1</cv-btn-base>
    <cv-btn-base @click="openDialogTable">测试打开抽屉2-加载列表框</cv-btn-base>
    <cv-btn-base @click="openDialogEditor">测试打开抽屉3-加载编辑期</cv-btn-base>
  </div>
</template>
<script setup>
import { cvDrawerRender } from '../../../lib/cv-ui.js';
import { getCurrentInstance } from 'vue';
// 获取当前组件实例
const instance = getCurrentInstance();
// 从实例中获取全局属性
const appVue = instance.appContext.app;
console.log(instance);
function openDialog1() {
  cvDrawerRender(
    appVue,
    // 抽屉body,需要展示的内部内容的组件
    drawerBody1,
    // 抽屉的属性
    {
      title: '这个是弹窗的名字',
      size: '100%',
      class: 'js-drawer',
      beforeClose: (done) => {
        console.log('guanbi前的操作');
        done();
      }
    },
    // 传递给内部页面的参数,内部用props接收
    { props1: 'JSDialog传递的参数', props2: '这个是传递进来的222' },
    // 这些是【内部】 this.$emit()调用的方法
    {
      inside_call_func1(chuandiData) {
        console.log('---内部调用了方法1,传递回来的数据 chuandiData :', chuandiData);
      },
      inside_call_func2: (receiveData) => {
        console.log('---内部调用了方法2,传递回来的数据 receiveData :', receiveData);
      }
    }
  ).show();
}
</script>
<script>
import drawerBody1 from './renderJsx/drawerBody1.vue';
import drawerBody2 from './renderJsx/drawerBody2.vue';
import dialogCompTable from './renderJsx/dialogCompTable.vue';
import dialogEditor from './renderJsx/dialogEditor.vue';
export default {
  data() {
    return {};
  },
  methods: {
    // openDialog1() {
    //   cvDrawerRender(
    //     instance.vnode,
    //     // 抽屉body,需要展示的内部内容的组件
    //     drawerBody1,
    //     // 抽屉的属性
    //     {
    //       title: '这个是弹窗的名字',
    //       class: 'js-drawer',
    //       beforeClose: (done) => {
    //         console.log('guanbi前的操作');
    //         done();
    //       }
    //     },
    //     // 传递给内部页面的参数,内部用props接收
    //     { props1: 'JSDialog传递的参数', props2: '这个是传递进来的222' },
    //     // 这些是【内部】 this.$emit()调用的方法
    //     {
    //       inside_call_func1(chuandiData) {
    //         console.log('---内部调用了方法1,传递回来的数据 chuandiData :', chuandiData);
    //       },
    //       inside_call_func2: (receiveData) => {
    //         console.log('---内部调用了方法2,传递回来的数据 receiveData :', receiveData);
    //       }
    //     }
    //   ).show();
    // },
    openDialogTable() {
      this.$cvDrawerRender(
        // 抽屉body,需要展示的内部内容的组件
        dialogCompTable,
        // 抽屉的属性
        { title: '这个是弹窗的名字', class: 'js-drawer' },
        // 传递给内部页面的参数,内部用props接收
        { defaultName: 'JSDialog传递的参数' },
        // 这些是【内部】 this.$emit()调用的方法
        {
          inside_call_func1(chuandiData) {
            console.log('---内部调用了方法1,传递回来的数据 chuandiData :', chuandiData);
          },
          inside_call_func2: (receiveData) => {
            console.log('---内部调用了方法2,传递回来的数据 receiveData :', receiveData);
          }
        }
      ).show();
    },
    openDialogEditor() {
      this.$cvDrawerRender(
        // 抽屉body,需要展示的内部内容的组件
        dialogEditor,
        // 抽屉的属性
        {
          title: '编辑器',
          class: 'js-drawer',
          direction: 'btt',
          size: '100%',
          beforeClose: (done) => {
            console.log('---呵呵---');
            done();
          }
        },
        // 传递给内部页面的参数,内部用props接收
        { defaultName: 'JSDialog传递的参数' },
        // 这些是【内部】 this.$emit()调用的方法
        {
          inside_call_func1(chuandiData) {
            console.log('---内部调用了方法1,传递回来的数据 chuandiData :', chuandiData);
          },
          inside_call_func2: (receiveData) => {
            console.log('---内部调用了方法2,传递回来的数据 receiveData :', receiveData);
          }
        }
      ).show();
    }
  }
};
</script>

:::

  • 抽屉内部内容 drawerBody1
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('inside_call_func1', '内部调用外部定义的方法');
      this.$emit('inside_call_func2', '内部调用外部定义的方法');
      this.$emit('close');
    },
    handleClose() {
      this.$emit('close');
    }
  }
};
</script>
<style scoped>
.el-scrollbar__wrap {
  overflow-x: hidden !important;
}
.js-dialog .el-drawer__body {
  padding: 20px;
}
</style>
  • 抽屉内部内容 drawerBody2
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.$confirm('确认关闭?')
        .then((_) => {
          this.$emit('close');
        })
        .catch((_) => {});
    }
  }
};
</script>
<style scoped>
.el-scrollbar__wrap {
  overflow-x: hidden !important;
}
</style>

$cvDrawerRender 全局方法参数说明

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

参数 bodyComponent 说明

参数 dialogOption 说明

字段类型默认说明参考
titlestring-抽屉标题
sizestring40%抽屉大小40%
directionstringrtl抽屉打开方向rtl(右向左) / ltr(左向右) / ttb(上向下) / btt(下向上)
closeIsConfirmBooleantrue关闭抽屉时,是否确认true、false
closeIsDestroyBooleantrue关闭抽屉时,是否销毁true、false
beforeCloseFunctionnull关闭前事件

参数 propsOption 说明

参数 onFunc 说明

可以监听多个方法

$cvDrawerRender 提供给 bodyComponent 抽屉内容调用的方法

方法说明参考
close关闭抽屉
setTitle设置标题

在 bodyComponent 抽屉内容组件里面,调用方式

js

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

// 关闭抽屉
this.$emit('close');


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

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