• Ant Design of Vue 表单封装


    1.通过v-decorator设置初始值

    2.在自定义组件上使用v-decorator

    3.点击重置按钮,自定义组件恢复初始值

    效果:

    目录:

    Form.vue:

    <template>
      <a-form
        :form="form"
        :label-col="{ span: 5 }"
        :wrapper-col="{ span: 12 }"
        @submit="handleSubmit"
      >
        <a-form-item label="Note">
          <a-input v-decorator="Array.isArray(test) ? test : ''" />
        </a-form-item>
        <a-form-item label="Gender">
          <a-select
            v-decorator="[
              'gender',
              {
                rules: [{ required: true, message: 'Please select your gender!' }],
              },
            ]"
            placeholder="Select a option and change input text above"
            @change="handleSelectChange"
          >
            <a-select-option value="male">
              male
            </a-select-option>
            <a-select-option value="female">
              female
            </a-select-option>
          </a-select>
        </a-form-item>
        <a-form-item label="Time">
          <RangePicker v-decorator="time"></RangePicker>
        </a-form-item>
        <a-form-item label="Name">
          <Input v-decorator="['name', {initialValue: 'xu'}]"></Input>
        </a-form-item>
    
        <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
          <a-button type="primary" html-type="submit">
            Submit
          </a-button>
          <a-button :style="{ marginLeft: '8px' }" @click="handleReset">
            Clear
          </a-button>
        </a-form-item>
      </a-form>
    </template>
    
    <script>
    import RangePicker from "../components/RangePicker"
    import Input from "../components/Input"
    import { oneDay } from '../utils/time'
    
    export default {
      components: {
        RangePicker,
        Input,
      },
      data() {
        return {
          formLayout: "horizontal",
          form: this.$form.createForm(this, { name: "coordinated" }),
          test: [
            "note",
            {
              rules: [{ required: true, message: "Please input your note!" }],
              initialValue: "Hi!",
            },
          ],
          time: [
            "time",
            {
              initialValue: oneDay(),
            },
          ],
        }
      },
      methods: {
        handleSubmit(e) {
          e.preventDefault()
          this.form.validateFields((err, values) => {
            if (!err) {
              console.log("Received values of form: ", values)
            }
          })
          let values = this.form.getFieldsValue()
          console.log(values)
        },
        handleReset() {
          this.form.resetFields();
    
          let values = this.form.getFieldsValue()
          console.log(values)      
        },    
        handleSelectChange(value) {
          console.log(value)
          this.form.setFieldsValue({
            note: `Hi, ${value === "male" ? "man" : "lady"}!`,
          })
        },
      },
      mounted() {
        // this.form.setFieldsValue({
        //   note: `Hi!`,
        // })
        console.log(this.time)
      },
    }
    </script>
    

    RangePicker.vue:

    <template>
      <a-range-picker
        :value="defaultValue"
        @change="change"
        :showTime="showTime"
      ></a-range-picker>
    </template>
    
    <script>
    import moment from "moment"
    export default {
      props: {
        value: {
          type: Array,
        },
      },
      data() {
        let date = this.value
        if (date && date.length)
          date = [moment(this.value[0]), moment(this.value[1])]
        return {
          defaultValue: date,
          showTime: {
            format: "HH:mm:ss",
            defaultValue: [
              moment("00:00:00", "HH:mm:ss"),
              moment("23:59:59", "HH:mm:ss"),
            ],
          },
        }
      },
      methods: {
        change(val) {
          let date = val
          if (val.length)
            date = [moment(val[0]).valueOf(), moment(val[1]).valueOf()]
          this.$emit("change", date)
          this.$emit("input", date)
        },
      },
      watch: {
        value(val) {
          if (val && val.length) {
            this.defaultValue = [moment(val[0]), moment(val[1])]
          }
        },
      },
    }
    </script>
    
    <style scoped></style>
    

    Input.vue:

    <template>
      <input :value="defaultValue" @input="handleInput" placeholder="请输入"/>
    </template>
    
    <script>
    export default {
      props: ['value'],
      data() {
        return {
          defaultValue: this.value
        }
      },
      methods: {
        handleInput(e) {
          this.defaultValue = e.target.value
          this.$emit('change', this.defaultValue)
          this.$emit('input', this.defaultValue)
        }
      },
      watch: {
        value() {
          this.defaultValue= this.value
        }
      }
    }
    </script>
    
    <style>
    
    </style>
  • 相关阅读:
    Poj 3318 Matrix Multiplication( 矩阵压缩)
    Altium Designer PCB的时候 高亮显示引脚连线
    历次PCB板修改意见汇总
    贴片电阻有哪几类封装尺寸?
    AD10中创建材料清单(BOM表)
    深度优先搜索(2)
    AD中测量两点之间的距离
    AD中的library中有些文件的后缀有.intlib .schlib .pcblib 这些都是库文件,但有什么区别呢?
    1.TwoSum
    深度优先搜索
  • 原文地址:https://www.cnblogs.com/xutongbao/p/14876272.html
Copyright © 2020-2023  润新知