FormGrid
FormGrid 组件
Markup Schema 案例
:
:
:
:
:
:
:
vue
<template>
<FormProvider :form="form">
<SchemaField>
<SchemaVoidField
x-component="FormGrid"
:x-component-props="{
maxColumns: 3,
minColumns: 2,
}"
>
<SchemaStringField
name="aaa"
title="aaa"
x-decorator="FormItem"
:x-decorator-props="{ gridSpan: 2 }"
x-component="Input"
/>
<SchemaStringField
name="bbb"
title="bbb"
x-decorator="FormItem"
x-component="Input"
/>
<SchemaStringField
name="ccc"
title="ccc"
x-decorator="FormItem"
x-component="Input"
/>
<SchemaStringField
name="ddd"
title="ddd"
x-decorator="FormItem"
x-component="Input"
/>
<SchemaStringField
name="eee"
title="eee"
x-decorator="FormItem"
x-component="Input"
/>
<SchemaStringField
name="fff"
title="fff"
x-decorator="FormItem"
x-component="Input"
/>
<SchemaStringField
name="ggg"
title="ggg"
x-decorator="FormItem"
x-component="Input"
/>
</SchemaVoidField>
</SchemaField>
<Submit @submit="onSubmit">提交</Submit>
</FormProvider>
</template>
<script>
import { createForm } from '@formily/core'
import { FormProvider, createSchemaField } from '@formily/vue'
import { Formily } from 'element-plus-x'
const { FormItem, Input, Submit, FormGrid } = Formily
const form = createForm()
const fields = createSchemaField({
components: {
FormItem,
Input,
FormGrid,
},
})
export default {
components: { FormProvider, ...fields, Submit },
data() {
return {
form,
}
},
methods: {
onSubmit(value) {
console.log(value)
},
},
}
</script>
隐藏源代码
JSON Schema 案例
:
:
:
:
:
:
:
vue
<template>
<FormProvider :form="form">
<SchemaField :schema="schema" />
<Submit @submit="onSubmit">提交</Submit>
</FormProvider>
</template>
<script>
import { createForm } from '@formily/core'
import { FormProvider, createSchemaField } from '@formily/vue'
import { Formily } from 'element-plus-x'
const { FormItem, Input, Submit, FormGrid } = Formily
const schema = {
type: 'object',
properties: {
grid: {
type: 'void',
'x-component': 'FormGrid',
'x-component-props': {
minColumns: [4, 6, 10],
},
properties: {
aaa: {
type: 'string',
title: 'AAA',
'x-decorator': 'FormItem',
'x-component': 'Input',
},
bbb: {
type: 'string',
title: 'BBB',
'x-decorator': 'FormItem',
'x-component': 'Input',
},
ccc: {
type: 'string',
title: 'CCC',
'x-decorator': 'FormItem',
'x-component': 'Input',
},
ddd: {
type: 'string',
title: 'DDD',
'x-decorator': 'FormItem',
'x-component': 'Input',
},
eee: {
type: 'string',
title: 'EEE',
'x-decorator': 'FormItem',
'x-component': 'Input',
},
fff: {
type: 'string',
title: 'FFF',
'x-decorator': 'FormItem',
'x-component': 'Input',
},
ggg: {
type: 'string',
title: 'GGG',
'x-decorator': 'FormItem',
'x-component': 'Input',
},
},
},
},
}
const form = createForm()
const { SchemaField } = createSchemaField({
components: {
FormItem,
Input,
FormGrid,
},
})
export default {
components: { FormProvider, SchemaField, Submit },
data() {
return {
form,
schema,
}
},
methods: {
onSubmit(value) {
console.log(value)
},
},
}
</script>
隐藏源代码
原生案例
maxColumns 3 + minColumns 2
1
2
3
4
5
6
maxColumns 3
1
2
3
4
5
6
minColumns 2
1
2
3
4
5
6
Null
1
2
3
4
5
6
minWidth 150 +maxColumns 3
1
2
3
4
5
6
maxWidth 120+minColumns 2
1
2
3
4
5
6
maxWidth 120 + gridSpan -1
1
2
3
vue
<template>
<div>
<p>maxColumns 3 + minColumns 2</p>
<FormGrid :max-columns="3" :min-columns="2" :column-gap="4">
<FormGridColumn :grid-span="4">
<Cell>1</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>2</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>3</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>4</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>5</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>6</Cell>
</FormGridColumn>
</FormGrid>
<p>maxColumns 3</p>
<FormGrid :max-columns="3" :column-gap="4">
<FormGridColumn :grid-span="2">
<Cell>1</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>2</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>3</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>4</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>5</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>6</Cell>
</FormGridColumn>
</FormGrid>
<p>minColumns 2</p>
<FormGrid :min-columns="2" :column-gap="4">
<FormGridColumn :grid-span="2">
<Cell>1</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>2</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>3</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>4</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>5</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>6</Cell>
</FormGridColumn>
</FormGrid>
<p>Null</p>
<FormGrid :column-gap="4">
<FormGridColumn :grid-span="2">
<Cell>1</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>2</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>3</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>4</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>5</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>6</Cell>
</FormGridColumn>
</FormGrid>
<p>minWidth 150 +maxColumns 3</p>
<FormGrid :min-width="150" :max-columns="3" :column-gap="4">
<FormGridColumn :grid-span="2">
<Cell>1</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>2</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>3</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>4</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>5</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>6</Cell>
</FormGridColumn>
</FormGrid>
<p>maxWidth 120+minColumns 2</p>
<FormGrid :max-width="120" :min-columns="2" :column-gap="4">
<FormGridColumn :grid-span="2">
<Cell>1</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>2</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>3</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>4</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>5</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>6</Cell>
</FormGridColumn>
</FormGrid>
<p>maxWidth 120 + gridSpan -1</p>
<FormGrid :max-width="120" :column-gap="4">
<FormGridColumn :grid-span="2">
<Cell>1</Cell>
</FormGridColumn>
<FormGridColumn>
<Cell>2</Cell>
</FormGridColumn>
<FormGridColumn :grid-span="-1">
<Cell>3</Cell>
</FormGridColumn>
</FormGrid>
</div>
</template>
<script>
import { h } from 'vue'
import { Formily } from 'element-plus-x'
const { FormGrid } = Formily
const Cell = {
setup(props, { slots }) {
return () =>
h(
'div',
{
style: {
backgroundColor: '#AAA',
color: '#FFF',
height: '30px',
display: 'flex',
alignItems: 'center',
padding: '0 10px',
},
},
slots
)
},
}
export default {
components: { FormGrid, FormGridColumn: FormGrid.GridColumn, Cell },
}
</script>
隐藏源代码
API
FormGrid
属性名 | 类型 | 描述 | 默认值 |
---|---|---|---|
minWidth | number / number[] | 元素最小宽度 | 100 |
maxWidth | number / number[] | 元素最大宽度 | - |
minColumns | number / number[] | 最小列数 | 0 |
maxColumns | number / number[] | 最大列数 | - |
breakpoints | number[] | 容器尺寸断点 | [720,1280,1920] |
columnGap | number | 列间距 | 8 |
rowGap | number | 行间距 | 4 |
colWrap | boolean | 自动换行 | true |
strictAutoFit | boolean | GridItem 宽度是否严格受限于 maxWidth,不受限的话会自动占满容器 | false |
shouldVisible | (node,grid)=>boolean | 是否需要显示当前节点 | ()=>true |
grid | Grid | 外部传入 Grid 实例,用于实现更复杂的布局逻辑 | - |
注意:
- minWidth 生效优先级高于 minColumn
- maxWidth 优先级高于 maxColumn
- minWidth/maxWidth/minColumns/maxColumns 的数组格式代表与断点数组映射
FormGrid.GridColumn
属性名 | 类型 | 描述 | 默认值 |
---|---|---|---|
gridSpan | number | 元素所跨列数,如果为-1,那么会自动反向跨列填补单元格 | 1 |
FormGrid.createFormGrid
从上下文中读取 Grid 实例
ts
interface createFormGrid {
(props: IGridProps): Grid
}
- IGridProps 参考 FormGrid 属性
- Grid 实例属性方法参考 https://github.com/alibaba/formily/tree/formily_next/packages/grid
FormGrid.useFormGrid
从上下文中读取 Grid 实例
ts
interface useFormGrid {
(): Grid
}