vue3 from表单模板 省时省力 复制即用

<template>
  <div class="pages">
    <div class="top">
      <div class="left">
        <div class="input">
          <el-date-picker
            v-model="datetime"
            type="year"
            placeholder="请选择日期"
            size="large"
            format="YYYY"
            :clearable="false"
          />
        </div>
        <div class="input">
          <el-input
            style="width: 220px"
            v-model="SearchValue"
            class="w-50 m-2"
            placeholder="请输入关键字搜索"
            :prefix-icon="Search"
          />
        </div>
        <div>
          <el-select v-model="slectValue" class="m-2" placeholder="请选择公司" size="large">
            <el-option
              v-for="item in slectList"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </div>
      </div>
      <div class="right">
        <el-button type="primary" @click="drawer = true">新增</el-button>
      </div>
    </div>
    <el-card>
      <div class="tabeldata">
        <el-table
          :data="tableData"
          style="width: 100%"
          border
          :header-cell-style="hederstyle"
          :row-style="rowstyle"
          :cell-style="cellstyle"
        >
          <el-table-column prop="name1" label="交易单位" align="center" width="150" />
          <el-table-column prop="name2" label="交易名称" align="center" width="200" />
          <el-table-column prop="name3" label="消纳方式" align="center" width="150" />
          <el-table-column prop="name4" label="交易类型" align="center" width="150" />
          <el-table-column prop="name5" label="意向方名称" align="center" width="150" />
          <el-table-column prop="name6" label="意向签订时间" align="center" width="150" />
          <el-table-column prop="name" label="意向电价" align="center" width="150" />
          <el-table-column prop="name7" label="落地省份" align="center" width="150" />
          <el-table-column prop="name8" label="总意向电量" align="center" width="150" />
         
        </el-table>
      </div>
    </el-card>
    <el-drawer v-model="drawer" :size="600" :direction="direction" :before-close="handleClose">
      <div class="top">
        <el-date-picker
          v-model="datetime"
          type="year"
          placeholder="请选择日期"
          size="large"
          format="YYYY"
          :clearable="false"
        />
        <div class="btnbox">
          <el-button type="primary" @click="submitForm(ruleFormRef)">保存 </el-button>
          <el-button @click="resetForm(ruleFormRef)">重置</el-button>
        </div>
      </div>
      <el-card>
        <el-form
          ref="ruleFormRef"
          :model="ruleForm"
          :rules="rules"
          :label-width="120"
          border
          class="demo-ruleForm"
          :size="formSize"
        >
          <div class="box">
            <el-form-item label="交易单位" prop="unit">
              <el-select class="inputDeep" v-model="ruleForm.unit" placeholder="请选择交易单位">
                <el-option label="Zone one" value="shanghai" />
                <el-option label="Zone two" value="beijing" />
              </el-select>
            </el-form-item>
            <el-form-item label="交易名称" prop="jyname">
              <el-input
                style="width: 206.76px"
                maxlength="150"
                class="inputDeep"
                v-model="ruleForm.jyname"
                placeholder="请输入交易名称"
              />
            </el-form-item>
            <el-form-item label="消纳方式" prop="way">
              <el-select class="inputDeep" v-model="ruleForm.way" placeholder="请选择消纳方式">
                <el-option label="Zone one" value="shanghai" />
                <el-option label="Zone two" value="beijing" />
              </el-select>
            </el-form-item>
            <el-form-item label="交易类型" prop="type">
              <el-select class="inputDeep" v-model="ruleForm.type" placeholder="请选择交易类型">
                <el-option label="Zone one" value="shanghai" />
                <el-option label="Zone two" value="beijing" />
              </el-select>
            </el-form-item>
          </div>
          <div class="box">
            <el-form-item label="意向方名称" prop="name">
              <el-input
                maxlength="150"
                style="width: 206.76px"
                class="inputDeep"
                v-model="ruleForm.name"
                placeholder="请输入意向方名称"
              />
            </el-form-item>
            <el-form-item label="意向方签订时间" prop="time">
              <el-date-picker
                style="height: 32px; width: 206.76px"
                v-model="ruleForm.time"
                type="date"
                placeholder="请选择意向方签订时间"
                size="large"
                format="YYYY-MM-DD"
              />
            </el-form-item>

            <el-form-item label="意向电价" prop="electricityprice">
              <el-input
                type="number"
                style="width: 206.76px"
                class="no_number"
                v-model="ruleForm.electricityprice"
                oninput="if(isNaN(value)) { value = null } if(value.indexOf('.')>0){value=value.slice(0,value.indexOf('.')+4)}"
                placeholder="请输入意向电价"
              />
              <span class="yz">元/MWh</span>
            </el-form-item>

            <el-form-item label="落地省份" prop="province">
              <el-select class="inputDeep" v-model="ruleForm.province" placeholder="请选择落地省份">
                <el-option label="Zone one" value="shanghai" />
                <el-option label="Zone two" value="beijing" />
              </el-select>
            </el-form-item>
          </div>
         
        </el-form>
      </el-card>
    </el-drawer>
  </div>
</template>

<script lang="ts" setup>
  import moment from 'moment';
  import { Search } from '@element-plus/icons-vue';
  import { ref } from 'vue';
  import type { FormInstance } from 'element-plus';
  const formSize = ref('default');
  const ruleFormRef = ref<FormInstance>();
  const datetime = ref(moment());
  const direction = ref('ttb');
  const slectValue = ref('青海公司');
  const SearchValue = ref('');
  const drawer = ref(false);
  const slectList = [
    {
      value: 'all',
      label: '青海公司',
    },
   
  ];

  const tableData = [
    {
      name: '1',
     
    },
  ];
  onMounted(() => {});
  const ruleForm = reactive({
    unit: '',
    jyname: '',
    way: '',
    type: '',
    name: '',
    time: moment(),
    electricityprice: '',
    province: '',
   
  });

  const rules = reactive({
    unit: [{ required: true, message: '请选择交易单位', trigger: 'change' }],
    jyname: [{ required: true, message: '请输入交易名称', trigger: 'blur' }],
    way: [{ required: true, message: '请选择消纳方式', trigger: 'change' }],
    type: [{ required: true, message: '请选择交易类型', trigger: 'change' }],
    electricityprice: [{ required: true, message: '请输入意向电价', trigger: 'blur' }],
  });
  const submitForm = (formEl: FormInstance | undefined) => {
    if (!formEl) return;
    formEl.validate((valid) => {
      if (valid) {
        console.log('submit!');
      } else {
        console.log('error submit!');
        return false;
      }
    });
  };
  const resetForm = (formEl: FormInstance | undefined) => {
    if (!formEl) return;
    formEl.resetFields();
  };
  const hederstyle = {
    background: '#f0f0f0',
    color: '#000',
    border: '1px solid #ccc',
  };
  const rowstyle = {
    color: '#000',
    border: '1px solid #ccc',
  };
  const cellstyle = {
    border: '1px solid #ccc',
    color: '#000',
  };
</script>

<style lang="less" scoped>
  ::v-deep input::-webkit-outer-spin-button,
  ::v-deep input::-webkit-inner-spin-button {
    -webkit-appearance: none !important;
  }
  ::v-deep input[type='number'] {
    -moz-appearance: textfield !important;
  }
  .pages {
    padding: 2px;

    .top {
      display: flex;
      justify-content: space-between;
      align-items: center;
      border: 1px solid #ccc;
      border-radius: 2px;
      background-color: #eee;
      padding: 5px;
      .left {
        display: flex;
        // justify-content: space-between;
        align-items: center;
        width: 60%;
        .input {
          width: 20%;
          margin-right: 60px;
          .el-input {
            height: 38px;
          }
        }
      }
    }
    .box {
      display: flex;
      justify-content: space-around;
    }
    .yz {
      position: absolute;
      // top: -20px;
      color: #aeb0b6;
      right: 5px;
    }
  }
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要安装 `ant-design-vue` 和 `vue3` 。 ``` npm install ant-design-vue@next npm install vue@next ``` 然后,你可以创建一个表单组件 `Form.vue` : ```vue <template> <a-form :form="form" @submit="handleSubmit"> <slot /> </a-form> </template> <script> import { defineComponent, ref } from 'vue'; import { Form } from 'ant-design-vue'; export default defineComponent({ components: { Form }, props: { initialValues: Object, onFinish: Function, onFinishFailed: Function, }, setup(props, { emit }) { const form = ref(null); const handleSubmit = (e) => { e.preventDefault(); form.value .validateFields() .then((values) => { if (props.onFinish) { props.onFinish(values); } }) .catch((error) => { if (props.onFinishFailed) { props.onFinishFailed(error); } }); }; return { form, handleSubmit, }; }, }); </script> ``` 在这个表单组件中,我们使用了 `a-form` 组件和插槽。我们为 `a-form` 组件绑定了 `form` 对象和 `submit` 事件。在组件的 `setup` 函数中,我们定义了一个 `form` 的引用,并且定义了一个 `handleSubmit` 函数,用于处理表单的提交事件。 接下来,我们可以创建一个表单项组件 `FormItem.vue` : ```vue <template> <a-form-item :label="label" :name="name" :rules="rules"> <slot /> </a-form-item> </template> <script> import { defineComponent } from 'vue'; import { FormItem } from 'ant-design-vue'; export default defineComponent({ components: { FormItem }, props: { label: String, name: String, rules: Array, }, }); </script> ``` 在这个表单项组件中,我们使用了 `a-form-item` 组件和插槽。我们为 `a-form-item` 组件绑定了 `label`、`name` 和 `rules` 属性。 现在,我们可以在 `Form.vue` 组件中使用 `FormItem.vue` 组件来创建表单项了: ```vue <template> <Form :form="form" @submit="handleSubmit"> <FormItem label="Username" name="username" :rules="[{ required: true, message: 'Please input your username' }]"> <a-input v-model:value="formData.username" /> </FormItem> <FormItem label="Password" name="password" :rules="[{ required: true, message: 'Please input your password' }]"> <a-input-password v-model:value="formData.password" /> </FormItem> <FormItem> <a-button type="primary" html-type="submit">Submit</a-button> </FormItem> </Form> </template> <script> import { defineComponent, reactive } from 'vue'; import Form from './Form.vue'; import FormItem from './FormItem.vue'; export default defineComponent({ components: { Form, FormItem }, setup() { const formData = reactive({ username: '', password: '', }); const handleSubmit = (values) => { console.log(values); }; return { formData, handleSubmit, }; }, }); </script> ``` 在这个例子中,我们创建了两个表单项:用户名和密码。我们使用 `v-model` 指令将表单数据绑定到 `formData` 对象上。我们也定义了一个 `handleSubmit` 函数,在表单提交时输出表单数据。 最后,我们需要在 `main.js` 文件中引入 `ant-design-vue` 组件库和 `Form.vue` 组件: ```js import { createApp } from 'vue'; import App from './App.vue'; import Antd from 'ant-design-vue'; import 'ant-design-vue/dist/antd.css'; import Form from './components/Form.vue'; const app = createApp(App); app.use(Antd); app.component('Form', Form); app.mount('#app'); ``` 现在,我们就可以在 Vue 3 中使用 Ant Design Vue表单组件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值