Vben Admin 自己学習記録 - Drawer コンポーネントの基本的な使い方と実践 (随時更新中...)

引き出し引き出しコンポーネント

antv のドロワー コンポーネントをカプセル化し、ドラッグ アンド ドロップ、全画面表示、高さの調整などの機能を拡張します。

引き出し関連の使用法と概念

演習 - 前のテーブルに基づいてビュー関数を追加し、ビュー ボタンをクリックすると、単一のテーブル データを表示するドロワーがポップアップ表示されます。このテーブル データは変更できません。

過去の関連記録: Table コンポーネントの基本的な使用法と演習

ViewDrawer.vue を src/views/myComponents/tableTest に追加して、Drawer を独立して使用し、内部コードを記述します

ここに画像の説明を挿入します
data.ts のドロワーのフォームフィールドを構成する

export const schemasView: FormSchema[] = [
  {
    
    
    field: 'divider-bill',
    component: 'Divider',
    label: '信息',
    colProps: {
    
    
      span: 24,
    },
  },
  {
    
    
    field: 'name',
    component: 'Input',
    label: '姓名',
    required:true,
  },
  {
    
    
    field: 'sex',
    component: 'Select',
    label: '性别',
    required:true,
    componentProps: {
    
    
      options: sexOption,
    },
  },
  {
    
    
    field: 'dt',
    component: 'DatePicker',
    label: '出生日期',
    required:true,
    componentProps: {
    
    
      style: {
    
    width: '100%',},
      valueFormat: 'YYYYMMDD',
    },
  },
  {
    
    
    field: 'age',
    component: 'InputNumber',
    label: '年龄',
    required:true,
    componentProps: {
    
    
      style: {
    
    width: '100%',},
      step: 1,
      min: 0,
      max: 150,
    },
  },
  {
    
    
    label: '电话',
    field: 'tel',
    component: 'Input',
    required:true,
    dynamicRules: ({
    
     values }) => {
    
    
      if (values.tel !== undefined){
    
    
        if (values.tel.indexOf('-')>0){
    
    
          return [
            {
    
    
              required:true,
              trigger: 'change',
              message: '请输入正确的号码',
              pattern:   /(^\d{4}-\d{7}$)|(^\d{3}-\d{8}$)/,
            }
          ];
        }
        else {
    
    
          return [
            {
    
    
              required:true,
              trigger: 'change',
              message: '请输入正确的号码',
              pattern: /^1[3|4|5|7|8][0-9]{9}$/,
            },
          ];
        }
      }
      else {
    
    
        return[{
    
    required:true,message: '请输入电话',}]
      }
    },
  },
  {
    
    
    field: 'address',
    component: 'InputTextArea',
    label: '住址',
    required:true,
  },
];

ViewDrawer コード

<template>
  <div
    :style="{
      overflow: 'hidden',
    }"
  >
    <BasicDrawer
      v-bind="$attrs"
      @register="registerDrawer"
      @visibleChange="handleVisibleChange"
      :isDetail="true"
      title="查看"
      placement="bottom"
      height="100%"
      :destroyOnClose="true"
    >
      <div>
        <BasicForm @register="registerForm"></BasicForm>
      </div>
    </BasicDrawer>
  </div>
</template>

<script lang="ts">
  import {
      
       defineComponent } from 'vue';
  import {
      
       Divider } from 'ant-design-vue';
  import {
      
       BasicDrawer, useDrawerInner } from '/@/components/Drawer';
  import {
      
       BasicForm, useForm } from '/@/components/Form';
  import {
      
       schemasView } from './data';
  export default defineComponent({
      
      
    name: 'ViewDrawer',
    components: {
      
      
      BasicDrawer,
      BasicForm,
      Divider,
    },
    setup(_, {
       
        emit }) {
      
      
      // 配置Drawer
      const [registerDrawer, {
      
       closeDrawer }] = useDrawerInner(async (data) => {
      
      
        console.log('打印从table传递的数据:', data);
        setFieldsValue(data), setProps({
      
       disabled: true });  // data值赋给表单,设置disabled
      });

      // 配置Form
      const [registerForm, {
      
       validate, setFieldsValue, setProps }] = useForm({
      
      
        labelWidth: 150,
        baseColProps: {
      
      
          offset: 1,
          span: 10,
        },
        schemas: schemasView,
        showActionButtonGroup: false,
      });

      function handleVisibleChange(visible: boolean) {
      
      
        if (!visible) {
      
      
          emit('reload');
        }
      }
      return {
      
      
        registerDrawer,
        closeDrawer,

        registerForm,
        validate,
        setFieldsValue,
        setProps,

        handleVisibleChange
      };
    },
  });
</script>

<style scoped></style>

BasicTable.vueで使用されます

<template>
  <div
    :style="{
      overflow: 'hidden',
      position: 'relative',
      height: '100%',
    }"
  >
    <!-- 注册table -->
    <BasicTable @register="registerTable">
      <template #action="{ record }">
        <TableAction
          :actions="[
            {
              tooltip: '查看',
              icon: 'clarity:info-standard-line',
              onClick: handleView.bind(null, { data: record }), 
            },
            {
              tooltip: '编辑',
              icon: 'clarity:note-edit-line',
              // onClick: handleEdit.bind(null, { data: record,}),
            },
            {
              tooltip: '删除',
              color: 'error',
              icon: 'ant-design:delete-outlined',
              // popConfirm: {
              //   title: '是否确定删除?',
              //   confirm: handleDel.bind(null, record),
              // },
            },
          ]"
        />
      </template>
      <template #toolbar>
        <a-button type="primary">{
   
   { '新增' }}</a-button>
      </template>
    </BasicTable>

	<!-- 页面引入 -->
    <ViewDrawer @reload="handleReload" @register="registerDrawer" />
  </div>
</template>

<script lang="ts">
  import {
      
       defineComponent } from 'vue';
  import {
      
       formConfig, columns, initData } from './data';
  import {
      
       BasicTable, useTable, TableAction } from '/@/components/Table';
  import {
      
       useDrawer } from '/@/components/Drawer';
  import ViewDrawer from './ViewDrawer.vue';
  export default defineComponent({
      
      
    name: 'tableTest',
    components: {
      
      
      BasicTable,
      TableAction,
      ViewDrawer,
    },
    setup() {
      
      
      const data = initData();

      // 设置table
      const [registerTable, {
      
       reload }] = useTable({
      
      
        title: '查询结果',
        dataSource: data,
        columns: columns,
        bordered: true,
        useSearchForm: true, //开启搜索区域
        formConfig: formConfig,
        actionColumn: {
      
      
          width: 120,
          title: '操作',
          dataIndex: 'action',
          slots: {
      
       customRender: 'action' },
        },
        rowSelection: {
      
       type: 'radio' },
        pagination: {
      
       pageSize: 10 },
        showTableSetting: true,
        tableSetting: {
      
       fullScreen: true },
        showIndexColumn: true,
        indexColumnProps: {
      
       fixed: 'left' },
      });

      // 注册Drawer
      const [registerDrawer, {
      
       openDrawer }] = useDrawer();

      // 查看按钮
      function handleView({
       
        data }) {
      
      
      	// 弹出抽屉,传递data
        openDrawer(true, data);
      }

      function handleReload() {
      
      
        reload();
      }
      return {
      
      
        registerTable,
        reload,
        registerDrawer,
        handleView,
        handleReload,
      };
    },
  });
</script>

<style scoped></style>

ページ効果

引き出し 引き出し

おすすめ

転載: blog.csdn.net/qq_36842789/article/details/130538851