vue中创建一个简单的表单弹框举例

11 阅读1分钟

vue中创建一个简单的表单弹框举例,外层使用vue-nice-modal来打开这个弹框,这里主要是对el-form的简单使用,以及vue-nice-modal使用的简单举例,备忘

<template>
  <!-- 样式设置弹框 -->
  <el-dialog
    :title="t('saveModel')"
    :visible="visible"
    @update:visible="$emit('update:visible', false)"
    width="480px"
    ref="dialog"
    v-dialogDrag
    :modal="false"
    :close-on-click-modal="false"
    :destroy-on-close="true"
    @close="handleCancel"
  >
    <el-form
      @submit.native.prevent
      ref="form"
      :rules="rules"
      :model="modelInfoForm"
      label-width="150px"
      label-position="top"
    >
      <el-form-item :label="t('modelName')" prop="modelName">
        <el-input
          v-model="modelInfoForm.modelName"
          ref="name"
          :placeholder="t('enterPlaceholder')"
        ></el-input>
      </el-form-item>
      <el-form-item :label="t('modelDes')" prop="modelDes">
        <el-input
          type="textarea"
          :rows="4"
          v-model="modelInfoForm.modelDes"
          ref="description"
        ></el-input>
      </el-form-item>
    </el-form>
    <span slot="footer" class="dialog-footer">
      <el-button @click="handleCancel">{{ t('cancel') }}</el-button>
      <el-button type="primary" @click="handleConfirm">{{ t('saveBtn') }}</el-button>
    </span>
  </el-dialog>
</template>

<script setup lang="ts" name="SaveModelDialog">
import { getByteLen, validateName } from '@common/utils/validateFunc';
import { reactive } from 'vue';
import { useI18n } from 'vue-i18n-bridge';

interface IProps {
  visible: boolean;
  callback: (action: 'confirm' | 'cancel', payload?: any) => void;
  remove: () => void;
  hide: () => void;
}

interface IEmits {
  (e: 'update:visible', visible: boolean): void;
}
const { t } = useI18n({
  messages: {
    zh: {
      saveModel: '保存模型',
      cancel: '取消',
      saveBtn: '保存',
      modelName: '模型名称',
      modelDes: '描述',
      enterPlaceholder: '请输入模型名称',
    },
    en: {
      saveModel: 'Save Model',
      cancel: 'Cancel',
      saveBtn: 'Save',
      modelName: 'Model Name',
      modelDes: 'Description',
      enterPlaceholder: ' Please enter model name',
    },
  },
});

const modelInfoForm = reactive({
  modelName: '',
  modelDes: '',
});

const rules = {
  modelName: [
    {
      required: true,
      validator: validateName,
    },
  ],
  modelDes: [
    {
      validator: (rule, value, callback) => {
        if (getByteLen(value) > 80) {
          callback(t('global.exceedInfo'));
        } else {
          callback();
        }
      },
    },
  ],
};

const emit = defineEmits<IEmits>();

const props = defineProps<IProps>();

function handleConfirm() {
  props.hide();

  props.callback('confirm', modelInfoForm);
}
function handleCancel() {
  emit('update:visible', false);
  props.callback('cancel');
}
</script>

相关引用函数

export function validateName(rule, value, callback) {
  if (
    value[0] === ' ' ||
    value[0] === '_' ||
    value[value.length - 1] === ' ' ||
    value[value.length - 1] === '_'
  ) {
    callback(new Error(i18n.t('dataset.nameValidationName.startTypeWarning')));
  } else {
    callback();
  }
}

export function getByteLen(string) {
  let len = 0;
  for (let i = 0; i < string.length; i++) {
    // eslint-disable-next-line no-bitwise
    if ((string.charCodeAt(i) & 0xff00) !== 0) len++;
    len++;
  }
  return len;
}

外层打开弹框

import { create } from 'vue-nice-modal';//此处vue-nice-modal的版本为1.1.1
const saveModalDialog = create(SaveModelDialog);

 const result = await saveModalDialog.show({});//这里是弹框点击确认传过来的参数

const modelName = (result as any)?.modelName;
const modelDes = (result as any)?.modelDes ?? '';