首页 > 其他分享 >ant design vue 1.x 和 3.x 自定义表单示例

ant design vue 1.x 和 3.x 自定义表单示例

时间:2023-11-21 11:22:37浏览次数:49  
标签:vue const 自定义 示例 value Moment right triggerChange left

以下是项目中用到的自定义表单的写法,vue2 vue3 各记录一个。

1.x(For vue2)

自定义表单的示例

实现如下图的控件

代码如下:

import { Component, Prop, Vue, Watch } from 'vue-property-decorator'
import { Moment } from 'moment'

type Value = { left: Moment; right: Moment }

@Component
export default class TimeRange extends Vue {
  @Prop(Object) readonly value!: Value
  public left = this.value.left
  public right = this.value.right

  @Watch('value')
  onValueChange (val: Value) {
    this.left = val.left
    this.right = val.right
  }

  handleLeftChange (left: Moment) {
    this.left = left
  }

  handleRightChange (right: Moment) {
    this.right = right
  }

  triggerChange (changedValue: {
    [K in keyof Value]: Moment
  }) {
    this.$emit('change', Object.assign({}, this.$data, changedValue))
  }

  openChangeHandle (open: boolean) {
    if (open) {
      this.$emit('focus')
    } else {
      this.checkTimeValue()
    }
  }

  checkTimeValue () {
    const { left, right } = this
    if (left.isAfter(right)) {
      this.triggerChange({
        left: right,
        right: left
      })
    } else {
      this.triggerChange({
        left,
        right
      })
    }
  }

  render () {
    const { left, right } = this

    return <span>
      <a-time-picker
        allowClear={false}
        format="HH:mm"
        value={left}
        onOpenChange={this.openChangeHandle}
        onChange={this.handleLeftChange} />
      <span> - </span>
      <a-time-picker
        allowClear={false}
        format="HH:mm"
        value={right}
        onOpenChange={this.openChangeHandle}
        onChange={this.handleRightChange}
      />
    </span>
  }
}

3.x (vue3)

自定义表单的示例

实现如下图的控件

<template>
  <a-form-item-rest>
    <a-input-number
      :value="value[0]"
      :min="0"
      @change="onLeftNumberChange"
      @blur="blur"
    ></a-input-number>
    -
    <a-input-number
      :value="value[1]"
      :min="0"
      @change="onRightNumberChange"
      @blur="blur"
    ></a-input-number>
  </a-form-item-rest>
</template>
<script lang="ts" src="./index.ts"></script>
<style lang="less" scoped></style>
import { Form } from "ant-design-vue";
import { defineComponent, PropType } from "vue";

export type RangeNumberValue = number | null;

export default defineComponent({
  name: "h-number-range",
  props: {
    value: {
      type: Array as unknown as PropType<[RangeNumberValue, RangeNumberValue]>,
      required: true,
    },
  },
  emits: ["update:value"],
  setup(props, { emit }) {
    const formItemContext = Form.useInjectFormItemContext();
    const triggerChange = (
      changedValue: [RangeNumberValue, RangeNumberValue]
    ) => {
      emit("update:value", [...changedValue]);
      formItemContext.onFieldChange();
    };

    const blur = () => {
      let [left, right] = props.value;

      // 保证右 >= 左
      if (left !== null && right !== null && left > right) {
        const temp = left;
        left = right;
        right = temp;
      }

      triggerChange([left, right]);
    };

    const onLeftNumberChange = (value: RangeNumberValue) => {
      triggerChange([value, props.value[1]]);
    };
    const onRightNumberChange = (value: RangeNumberValue) => {
      triggerChange([props.value[0], value]);
    };
    return {
      onLeftNumberChange,
      onRightNumberChange,
      blur,
    };
  },
});

标签:vue,const,自定义,示例,value,Moment,right,triggerChange,left
From: https://www.cnblogs.com/shapeY/p/17846198.html

相关文章

  • vue实现会议室拖拽布局排座
    会议室拖拽布局排座是vue-draggable结合vue-draggable-resizable-gorkys进行开发vue-draggable是拖拽组件,可以在组件里拖动排序,也可以多个组件之间拖动排序vue-draggable-resizable-gorkys是一更强大的拖拽组件,可以随意拖拽,有点坐标先进行会议室的布局然后对某个会议进行人......
  • 解放VSCode+Vue的完整组件库智能提示(包括ant-design-vue、element-plus等)
    解放VSCode+Vue的完整组件库智能提示最近因为一些原因从WebStrom转回VSCode,首先感受到的就是组件库没有智能提示了:这能忍吗?根本不可能!接下来,我带你花三分钟找回遗失的智能提示~首先,本篇文章适用于通过unplugin-vue-components自动引入组件的项目;也就是说,在你的vite.config.js......
  • vue3路由重定向失效
    页面刷新时遇到路由重定向无效的问题,可能是因为路由重定向是在客户端进行的,而页面刷新会重新加载整个应用程序,导致重定向逻辑丢失。为了解决这个问题,你可以使用服务器端的重定向来确保在页面刷新时也能正确地重定向到指定的路由。以下是一种常见的解决方案:在服务器端配置,确保......
  • springboot中实现上传文件的功能简单示例
    在SpringBoot中实现文件上传可以通过以下步骤:配置文件上传相关的依赖:在项目的pom.xml文件中,添加以下依赖:<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency>创建文件上传接口:在......
  • 创建自定义日志筛选器
    Windows的事件查看器中的日志包含了很多信息,但是系统自带的筛选器只能筛选固定的字段和内容。有时候想根据某个事件中的用户名或者IP筛选的时候就没办法了。此时需要创建自定义筛选器来实现。首先找到希望筛选的日志,调整成详细的XML视图。  这里面就有我们需要用到的字段信......
  • vue3_Extraneous non-props attributes (class) were passed to component but could
    今天的开发中发现了这个问题Extraneousnon-propsattributes(class)werepassedtocomponentbutcouldnotbeautomaticallyinheritedbecausecomponentrendersfragmentortextrootnodes.原因:是因为vue3中允许在<template>中不设置根节点,所以我在某个页面中......
  • SpringBoot + vue2.0查询所用功能
    导入数据库文件CREATEDATABASE`springboot`/*!40100DEFAULTCHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ci*//*!80016DEFAULTENCRYPTION='N'*/CREATETABLE`users`(`id`intunsignedNOTNULLAUTO_INCREMENT,`name`varchar(40)CHARACTERSETu......
  • 手撕Vue-Router-提取路由信息
    前言好了经过上一篇的学习,我们已经知道了如何监听Hash的变化,如何监听路径的一个变化,本篇我们就可以来实现我们自己的VueRouter了,那么怎么实现呢,在实现之前我们先来回顾一下官方的VueRouter是怎么使用的。VueRouter的使用首先需要去下载官方的VueRouter,如果是通过np......
  • vue自定义指令按enter键触发事件
    directives:{enter:{bind(el,binding){document.addEventListener('keyup',(event)=>{if(event.keyCode===13){binding.value()}})}}},v-enter="search"......
  • VUE框架实现原理及代码构成结构详解------前端
    VUE框架实现原理及代码构成结构详解------VUE框架<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title&......