<script setup>
import ViewForm from './field/index.vue'
 
</script>

# 弹框表单

## 介绍
结合了弹框和表单的组件
- `querykey`: 必填。控制弹框关闭的key值
- `submitloading`: 可选。控制确认按钮loading状态
- `oktext`: 可选。自定义内置确认按钮文本
- `canceltext`: 可选。自定义内置取消按钮文本
- `KsField`: formitem表单，配置entity即可。
- `footer`: 插槽，可选。form表单自带footer（确定和取消按钮），如需要自己配置footer, 预留了 footer插槽
- `unit`: 插槽，可选。跟随在field后面的单位
- `tip`: 插槽，可选。在field下面的描述语言

![alt text](image.png)


## 使用
参加Ksdialog 和 KsForm 组件的用法

## 完整代码如下：

<div class="options-api">

```vue
<template>
	<div class="app-field-box">
		<h3>1. form表单基本使用</h3>
		<KsFormModal title="我是测试" querykey="formmodal" @mysubmit="submit">
			<KsField entityKey="name" @change="onChange" showCount maxlength="10" />
			<KsField entityKey="textarea" @change="onChange" type="textarea"/>
			<KsField entityKey="password" @change="onChange" type="password" showPassword/>
			<KsField entityKey="singletype" @change="onChange"/>
			<KsField entityKey="multipletype" multiple/>
			<KsField entityKey="switchType" on="11" off="22"/>
			<KsField entityKey="switchType2" @change="onChange"/>
			<KsField entityKey="radioType" @change="onChange"/>
			<KsField entityKey="checkboxType" @change="onChange"/>
			<KsField entityKey="slider" @change="onChange" unit="MB" class="zy-demo"/>
			<KsField entityKey="time" @change="onChange" range type="datetime" clearable/>
			<KsField entityKey="buttonGroup" seperate @change="onChange"/>
			<KsField entityKey="buttonGroup2" checkType="checkbox" @change="onChange"/>
		</KsFormModal>
	</div>
</template>
<script setup>
import { reactive, provide } from 'vue';
import { PageEntity } from './entity';
import { KsFormModal,KsField } from '@ksconsole/components'

const formState = reactive({
	name: undefined,
	password: undefined,
	textarea: undefined,
	singletype: '1',
	multipletype: ['1', '2'],
	switchType: true,
	switchType2: false,
	radioType: '1',
	checkboxType: ['1', '2'],
	slider: 2,
	time: null,
	buttonGroup: undefined,
	buttonGroup2: [],
	transfer: [],
	zyinput: 1,
	name3: undefined,
});

provide('formInfo', {
	formState,
	PageEntity
});

const onChange = (v) => {
	console.log('🚀 ~ onChange ~ v:', v);
};

const submit = (formState) => {
	console.log("🚀 ~ submit ~ formState:", formState)
	Message.info({
		content: JSON.stringify(formState),
		duration: 10000,
		closable: true
	});
}
</script>

<style scoped lang="less">
.p {
	line-height: 18px !important;
}
.app-field-line {
	margin: 24px;
	border-bottom: 1px dashed rgb(159, 223, 159);
}
.app-field-box {
	padding: 24px;
	h3 {
		margin-bottom: 20px;
	}
}
</style>
```

```js
// entity.js
import { ks_valueType } from './config';
/**
 * 页面实体
 */
class Entity {
	name = {
		// form 的 key 属性 解析为 Entity.ITCode
		name: 'name',
		// label 字段描述
		label: '名称',
		rules: { required: true },
		valueType: ks_valueType.text, // 默认的，可以不用写
		messages: { required: '111选择' }
	};
	textarea = {
		name: 'textarea',
		// label 字段描述
		label: '文本',
		rules: { required: true },
		valueType: ks_valueType.textarea // 默认的，可以不用写
	};

	password = {
		// form 的 key 属性 解析为 Entity.ITCode
		name: 'password',
		// label 字段描述
		label: '密码'
		// valueType: WTM_ValueType.dateRange,
	};
	singletype = {
		// form 的 key 属性 解析为 Entity.ITCode
		name: 'singletype',
		// label 字段描述
		label: '下拉单选',
		valueType: ks_valueType.select,
		request: async () => this.getSalesList()
	};
	multipletype = {
		// form 的 key 属性 解析为 Entity.ITCode
		name: 'multipletype',
		// label 字段描述
		label: '下拉多选',
		valueType: ks_valueType.select,
		// fieldProps: {multiple: true},
		request: async () => {
			return [
				{ value: '1', label: '测试1' },
				{ value: '2', label: '测试2' },
				{ value: '3', label: '测试3' }
			];
		}
	};

  name2 = {
		// form 的 key 属性 解析为 Entity.ITCode
		name: 'name2',
		// label 字段描述
		label: '名称',
		rules: { required: true },
		valueType: ks_valueType.text, // 默认的，可以不用写
		messages: { required: '111选择' }
	};
	textarea2 = {
		name: 'textarea2',
		// label 字段描述
		label: '文本',
		rules: { required: true },
		valueType: ks_valueType.textarea // 默认的，可以不用写
	};

	password2 = {
		// form 的 key 属性 解析为 Entity.ITCode
		name: 'password2',
		// label 字段描述
		label: '密码'
		// valueType: WTM_ValueType.dateRange,
	};
	singletype2 = {
		// form 的 key 属性 解析为 Entity.ITCode
		name: 'singletype2',
		// label 字段描述
		label: '下拉单选',
		valueType: ks_valueType.select,
		request: async () => this.getSalesList()
	};
	multipletype2 = {
		// form 的 key 属性 解析为 Entity.ITCode
		name: 'multipletype2',
		// label 字段描述
		label: '下拉多选',
		valueType: ks_valueType.select,
		// fieldProps: {multiple: true},
		request: async () => {
			return [
				{ value: '1', label: '测试1' },
				{ value: '2', label: '测试2' },
				{ value: '3', label: '测试3' }
			];
		}
	};
  name3 = {
		// form 的 key 属性 解析为 Entity.ITCode
		name: 'name3',
		// label 字段描述
		label: '名称',
		rules: { required: true },
		valueType: ks_valueType.text, // 默认的，可以不用写
		messages: { required: '111选择' }
	};
	
	async getSalesList() {
		const res = await new Promise((resolve) => {
			// setTimeout(() => {
			resolve([
				{ label: '1', value: '1' },
				{ label: '2', value: '2' }
			]);
			// }, 100);
		});
		return res;
	}
}
export const PageEntity = new Entity();

```

```js
// config.js
 // Description: 用于配置字段的类型 自己项目全局配置下
export const ks_valueType = {
	/** 密码框 */
	password: 'password',
	/** 文本域 */
	textarea: 'textarea',
	/** 时间 */
	date: 'date',
	/** 按钮组 */
	buttonGroup: 'buttonGroup',
	/** 文本 */
	text: 'text',
	/** 选择框 */
	select: 'select',
	/** 滑动输入 */
	slider: 'slider',
	/** 多选框 */
	checkbox: 'checkbox',
	/** 评分 */
	rate: 'rate',
	/** 单选 */
	radio: 'radio',
	/** 开关 */
	switch: 'switch',
	// todo: 以下类型未实现
	/** 图片上传 */
	image: 'image',
	/** 穿梭框 */
	transfer: 'transfer',
	/** 树形控件 */
	tree: 'tree'
	/** 文件 */
	upload : "upload",
	/**	数字输入框 */
	spinner : "spinner",
};

```
</div>
