阅读之前
此文章为实战教程,已假定你熟悉了【界面设计器】较为完整的【自定义组件】相关内容。
如果在阅读过程中出现的部分概念无法理解,请自行学习相关内容。【前端】文章目录
业务背景
用户在输入【金额】字段时,实时展示千分位格式。
业务分析
从需求来看,我们需要实现一个【千分位】组件,并且该组件允许在【表单】视图中使用。
扩展实现:该组件虽然仅要求在【表单】中使用,但也可以在【搜索】中使用完全相同的实现,因此这里我们在注册时会增加【搜索】视图,将【千分位】组件应用在【搜索】中。对于【表格】、【详情】和【画廊】来说,该组件是没有【输入】行为的展示组件,在这里我们不进行演示。
准备工作
此处你应该已经在某个业务模型下,可以完整执行当前模型的全部【增删改查】操作。
业务模型定义
(以下仅展示本文章用到的模型字段,忽略其他无关字段。)
名称 | API名称 | 业务类型 | 是否多值 | 长度(单值长度) |
---|---|---|---|---|
编码 | code | 文本 | 否 | 128 |
名称 | name | 文本 | 否 | 128 |
金额 | money | 金额 | 否 | - |
创建组件、元件
准备工作完成后,我们需要根据【业务背景】确定【组件】以及【元件】相关信息,并在【界面设计器】中进行创建。
以下操作过程将省略详细步骤,仅展示可能需要确认的关键页面。
创建千分位组件
创建千分位元件
启动SDK工程进行组件基本功能开发
(npm
相关操作请自行查看SDK工程中内置的README.MD
)
关键点详解
数据交互类型
的字段组件(以下简称展示组件
)与仅展示类型
的字段组件(以下简称交互组件
)有一些差别。
通常情况下,在展示组件
中仅需使用value
属性即可展示相关内容。在交互组件
中除了value
用于展示外,还需使用change
、focus
以及blur
处理用户输入时的基本交互逻辑。
数据交互方法主要功能说明:
change
方法:当值发生变更时调用,根据字段相关配置将值回填至表单中。focus
方法:当组件获取焦点时调用,记录当前值,并在调用blur
方法时进行处理。blur
方法:当前组件失去焦点时调用,根据focus
方法记录的值,进行失焦触发逻辑的执行。
这里的三个数据交互方法仅仅是对用户行为的抽象,而并非限定其使用场景。
通常来说,这三个方法的调用顺序为:focus
--> change
--> blur
。
如在日期时间组件中,面板打开时调用了focus
方法,面板值发生变更时,调用了change
方法,面板关闭时调用了blur
方法。
如在地图组件中,选中地图上的某个点时仅会调用change
方法,用户交互上并不能体现出focus
和blur
的行为。因此对于这个组件而言,只会有change
方法被执行。
代码实现参考
PS:oio-input-number
样式必须升级到4.6.x
以上的最新版本才支持
Thousandth.vue
<template>
<a-input-number
class="oio-input-number"
:value="inputValue"
:formatter="formatter"
:parser="parser"
@update:value="change"
@focus="focus"
@blur="blur"
/>
</template>
<script lang="ts">
import { InputNumber as AInputNumber } from 'ant-design-vue';
import { computed, defineComponent } from 'vue';
export default defineComponent({
name: 'Thousandth',
components: {
AInputNumber
},
props: {
value: {
type: [String, Number]
},
change: {
type: Function
},
focus: {
type: Function
},
blur: {
type: Function
}
},
setup(props) {
const inputValue = computed(() => {
return props.value;
});
const formatter = (value) => {
return <span class="hljs-subst">${value}</span>
.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
};
const parser = (value) => {
return value.replace(/\$\s?|(,*)/g, '');
};
return {
inputValue,
formatter,
parser
};
}
});
</script>
FormMoneyThousandthFieldWidget.ts
import { FormFieldWidget, ModelFieldType, SPI, ViewType } from '@kunlun/dependencies';
import Thousandth from './Thousandth.vue';
@SPI.ClassFactory(
FormFieldWidget.Token({
viewType: [ViewType.Form, ViewType.Search],
ttype: ModelFieldType.Currency,
widget: 'Thousandth',
multi: false
})
)
export class FormMoneyThousandthFieldWidget extends FormFieldWidget {
public initialize(props) {
super.initialize(props);
this.setComponent(Thousandth);
return this;
}
}
Oinone社区 作者:数式-海波原创文章,如若转载,请注明出处:https://doc.oinone.top/frontend/67.html
访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验