feat(form): add n-form-item-gi (grid-item) component

This commit is contained in:
07akioni 2021-04-08 00:09:32 +08:00
parent 371078a6a2
commit 606cb19429
19 changed files with 312 additions and 274 deletions

View File

@ -2,6 +2,10 @@
## 2.4.2
### Feats
- Add `n-form-item-gi` component.
### Fixes
- Fix `n-ellipsis` & `n-data-table` ellpisis cell mis-vertical-aligned.

View File

@ -2,6 +2,10 @@
## 2.4.2
### Feats
- 添加 `n-form-item-gi` 组件
### Fixes
- 修正 `n-ellipsis` & `n-data-table` ellpisis 单元格文本垂直排列错位

View File

@ -103,7 +103,7 @@
trigger="click"
>
<n-button size="small" class="nav-picker">
{{ configProviderLabels[configProviderName] }}
{{ cfgProviderLabelMap[configProviderName] }}
</n-button>
</n-popselect>
<n-popselect
@ -363,8 +363,8 @@ export default {
// locale
const localeNameRef = useLocaleName()
const localeLabelMap = {
'zh-CN': '中文',
'en-US': 'English'
'zh-CN': 'English',
'en-US': '中文'
}
const localeOptions = [
{
@ -396,7 +396,7 @@ export default {
// config provider
const configProviderNameRef = useConfigProviderName()
const configProviderLabelsRef = computed(() => ({
const cfgProviderLabelMapRef = computed(() => ({
tusimple: t('tusimpleTheme'),
default: t('defaultTheme')
}))
@ -476,7 +476,7 @@ export default {
// configProvider
configProviderName: configProviderNameRef,
configProviderOptions: configProviderOptionsRef,
configProviderLabels: configProviderLabelsRef,
cfgProviderLabelMap: cfgProviderLabelMapRef,
// search
searchPattern: searchPatternRef,
searchOptions: searchOptionsRef,

View File

@ -62,13 +62,9 @@ async
| size | `'small' \| 'medium' \| 'large'` | `'medium'` | |
| validation-status | `'error' \| 'success' \| 'warning'` | `undefined` | The validation status of the form item. If not set to `undefined`, it will take place of the result of rule-based validation. |
### Form Item Row Props
### FormItemGi Props
Accept all props from form-item & [Row](n-row#Row-Props)
### Form Item Col Props
Accept all props from form-item & [Col](n-row#Col-Props)
Accept all props from FormItem & [GridItem](grid#GridItem-Props)
## Methods
@ -86,7 +82,7 @@ Accept all props from form-item & [Col](n-row#Col-Props)
| validate | `(validateCallback?: (errors?: Array<ValidationError>) => void, shouldRuleBeApplied?: FormItemRule => boolean) => Promise<void>` | Validate the form. The rejection value type of returned promise is `Array<ValidationError>`. |
| clearValidationEffect | `() => void` | |
### Form Item, Form Item Row, Form Item Col Methods
### FormItem, FormItemGi Methods
| Name | Type | Description |
| --- | --- | --- |
@ -97,13 +93,13 @@ About AsyncValidatorOptions, see <n-a href="https://github.com/yiminghe/async-va
## Slots
### Form, Form Item, Form Item Row, Form Item Col Slots
### Form, FormItem, FormItemGi Slots
| Name | Parameters | Description |
| ------- | ---------- | ----------- |
| default | `()` | |
### Form Item, Form Item Row, Form Item Col Slots
### FormItem, FormItemGi Slots
| Name | Parameters | Description |
| ----- | ---------- | ----------- |

View File

@ -22,10 +22,10 @@
maxWidth: '640px'
}"
>
<n-form-item-row label="Input" path="inputValue">
<n-form-item label="Input" path="inputValue">
<n-input placeholder="Input" v-model:value="model.inputValue" />
</n-form-item-row>
<n-form-item-row label="Textarea" path="textareaValue">
</n-form-item>
<n-form-item label="Textarea" path="textareaValue">
<n-input
placeholder="Textarea"
v-model:value="model.textareaValue"
@ -35,29 +35,29 @@
maxRows: 5
}"
/>
</n-form-item-row>
<n-form-item-row label="Select" path="selectValue">
</n-form-item>
<n-form-item label="Select" path="selectValue">
<n-select
placeholder="Select"
:options="generalOptions"
v-model:value="model.selectValue"
/>
</n-form-item-row>
<n-form-item-row label="Multiple Select" path="multipleSelectValue">
</n-form-item>
<n-form-item label="Multiple Select" path="multipleSelectValue">
<n-select
placeholder="Select"
:options="generalOptions"
v-model:value="model.multipleSelectValue"
multiple
/>
</n-form-item-row>
<n-form-item-row label="Datetime" path="datetimeValue">
</n-form-item>
<n-form-item label="Datetime" path="datetimeValue">
<n-date-picker type="datetime" v-model:value="model.datetimeValue" />
</n-form-item-row>
<n-form-item-row label="Switch" path="switchValue">
</n-form-item>
<n-form-item label="Switch" path="switchValue">
<n-switch v-model:value="model.switchValue" />
</n-form-item-row>
<n-form-item-row label="Checkbox Group" path="checkboxGroupValue">
</n-form-item>
<n-form-item label="Checkbox Group" path="checkboxGroupValue">
<n-checkbox-group v-model:value="model.checkboxGroupValue">
<n-space>
<n-checkbox value="Option 1">Option 1</n-checkbox>
@ -65,8 +65,8 @@
<n-checkbox value="Option 3">Option 3</n-checkbox>
</n-space>
</n-checkbox-group>
</n-form-item-row>
<n-form-item-row label="Radio Group" path="radioGroupValue">
</n-form-item>
<n-form-item label="Radio Group" path="radioGroupValue">
<n-radio-group v-model:value="model.radioGroupValue" name="radiogroup1">
<n-space>
<n-radio value="Radio 1">Radio 1</n-radio>
@ -74,52 +74,48 @@
<n-radio value="Radio 3">Radio 3</n-radio>
</n-space>
</n-radio-group>
</n-form-item-row>
<n-form-item-row label="Radio Button Group" path="radioGroupValue">
</n-form-item>
<n-form-item label="Radio Button Group" path="radioGroupValue">
<n-radio-group v-model:value="model.radioGroupValue" name="radiogroup2">
<n-radio-button value="Radio 1">Radio 1</n-radio-button>
<n-radio-button value="Radio 2">Radio 2</n-radio-button>
<n-radio-button value="Radio 3">Radio 3</n-radio-button>
</n-radio-group>
</n-form-item-row>
<n-form-item-row label="Input Number" path="inputNumberValue">
</n-form-item>
<n-form-item label="Input Number" path="inputNumberValue">
<n-input-number v-model:value="model.inputNumberValue" />
</n-form-item-row>
<n-form-item-row label="Time Picker" path="timePickerValue">
</n-form-item>
<n-form-item label="Time Picker" path="timePickerValue">
<n-time-picker v-model:value="model.timePickerValue" />
</n-form-item-row>
<n-form-item-row label="Slider" path="sliderValue">
</n-form-item>
<n-form-item label="Slider" path="sliderValue">
<n-slider v-model:value="model.sliderValue" :step="5" />
</n-form-item-row>
<n-form-item-row label="Transfer" path="transferValue">
</n-form-item>
<n-form-item label="Transfer" path="transferValue">
<n-transfer v-model:value="model.transferValue" :options="generalOptions" />
</n-form-item-row>
<n-form-item-row :gutter="[28, 0]" label="Nested Path">
<n-row :gutter="[28, 0]">
<n-form-item-col :span="12" path="nestedValue.path1">
</n-form-item>
<n-form-item label="Nested Path" :show-feedback="false">
<n-grid :cols="2" :x-gap="24">
<n-form-item-gi path="nestedValue.path1">
<n-input
placeholder="Nested Path 1"
v-model:value="model.nestedValue.path1"
/>
</n-form-item-col>
<n-form-item-col :span="12" path="nestedValue.path2">
</n-form-item-gi>
<n-form-item-gi path="nestedValue.path2">
<n-select
placeholder="Nested Path 2"
:options="generalOptions"
v-model:value="model.nestedValue.path2"
/>
</n-form-item-col>
</n-row>
</n-form-item-row>
<n-row>
<n-col :span="24">
<div style="display: flex; justify-content: flex-end;">
<n-button @click="handleValidateButtonClick" round type="primary"
>Validate</n-button
>
</div>
</n-col>
</n-row>
</n-form-item-gi>
</n-grid>
</n-form-item>
<div style="display: flex; justify-content: flex-end;">
<n-button @click="handleValidateButtonClick" round type="primary"
>Validate</n-button
>
</div>
</n-form>
<pre>

View File

@ -1,5 +1,7 @@
# Label Placement Top
Use `n-grid` and `n-form-item-gi` (grid item) and make form easily.
```html
<n-radio-group
v-model:value="size"
@ -17,11 +19,11 @@
ref="formRef"
label-placement="top"
>
<n-row :gutter="24">
<n-form-item-col :span="12" label="Input" path="inputValue">
<n-grid :span="24" :x-gap="24">
<n-form-item-gi :span="12" label="Input" path="inputValue">
<n-input placeholder="Input" v-model:value="model.inputValue" />
</n-form-item-col>
<n-form-item-col :span="12" label="Textarea" path="textareaValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Textarea" path="textareaValue">
<n-input
placeholder="Textarea"
v-model:value="model.textareaValue"
@ -31,17 +33,15 @@
maxRows: 5
}"
/>
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col :span="12" label="Select" path="selectValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Select" path="selectValue">
<n-select
placeholder="Select"
:options="generalOptions"
v-model:value="model.selectValue"
/>
</n-form-item-col>
<n-form-item-col
</n-form-item-gi>
<n-form-item-gi
:span="12"
label="Multiple Select"
path="multipleSelectValue"
@ -52,22 +52,14 @@
v-model:value="model.multipleSelectValue"
multiple
/>
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col :span="12" label="Datetime" path="datetimeValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Datetime" path="datetimeValue">
<n-date-picker type="datetime" v-model:value="model.datetimeValue" />
</n-form-item-col>
<n-form-item-col :span="12" label="Switch" path="switchValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Switch" path="switchValue">
<n-switch v-model:value="model.switchValue" />
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col
:span="12"
label="Checkbox Group"
path="checkboxGroupValue"
>
</n-form-item-gi>
<n-form-item-gi :span="12" label="Checkbox Group" path="checkboxGroupValue">
<n-checkbox-group v-model:value="model.checkboxGroupValue">
<n-space>
<n-checkbox value="Option 1">Option 1</n-checkbox>
@ -75,8 +67,8 @@
<n-checkbox value="Option 3">Option 3</n-checkbox>
</n-space>
</n-checkbox-group>
</n-form-item-col>
<n-form-item-col :span="12" label="Radio Group" path="radioGroupValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Radio Group" path="radioGroupValue">
<n-radio-group v-model:value="model.radioGroupValue" name="radiogroup1">
<n-space>
<n-radio value="Radio 1">Radio 1</n-radio>
@ -84,10 +76,8 @@
<n-radio value="Radio 3">Radio 3</n-radio>
</n-space>
</n-radio-group>
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col
</n-form-item-gi>
<n-form-item-gi
:span="12"
label="Radio Button Group"
path="radioGroupValue"
@ -97,51 +87,45 @@
<n-radio-button value="Radio 2">Radio 2</n-radio-button>
<n-radio-button value="Radio 3">Radio 3</n-radio-button>
</n-radio-group>
</n-form-item-col>
<n-form-item-col :span="12" label="Input Number" path="inputNumberValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Input Number" path="inputNumberValue">
<n-input-number v-model:value="model.inputNumberValue" />
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col :span="12" label="Time Picker" path="timePickerValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Time Picker" path="timePickerValue">
<n-time-picker v-model:value="model.timePickerValue" />
</n-form-item-col>
<n-form-item-col :span="12" label="Slider" path="sliderValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Slider" path="sliderValue">
<n-slider v-model:value="model.sliderValue" :step="5" />
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col :span="14" label="Transfer" path="transferValue">
</n-form-item-gi>
<n-form-item-gi :span="14" label="Transfer" path="transferValue">
<n-transfer
style="width: 100%;"
v-model:value="model.transferValue"
:options="generalOptions"
/>
</n-form-item-col>
<n-form-item-col :span="5" label="Nested Path" path="nestedValue.path1">
</n-form-item-gi>
<n-form-item-gi :span="5" label="Nested Path" path="nestedValue.path1">
<n-cascader
placeholder="Nested Path 1"
v-model:value="model.nestedValue.path1"
:options="cascaderOptions"
/>
</n-form-item-col>
<n-form-item-col :span="5" path="nestedValue.path2">
</n-form-item-gi>
<n-form-item-gi :span="5" path="nestedValue.path2">
<n-select
placeholder="Nested Path 2"
:options="generalOptions"
v-model:value="model.nestedValue.path2"
/>
</n-form-item-col>
</n-row>
<n-row>
<n-col :span="24">
</n-form-item-gi>
<n-gi :span="24">
<div style="display: flex; justify-content: flex-end;">
<n-button @click="handleValidateButtonClick" round type="primary"
>Validate</n-button
>
</div>
</n-col>
</n-row>
</n-gi>
</n-grid>
</n-form>
<pre>

View File

@ -63,13 +63,9 @@ validator-debug
| size | `'small' \| 'medium' \| 'large'` | `'medium'` | |
| validation-status | `'error' \| 'success' \| 'warning'` | `undefined` | 表单的验证状态。不设为 `undefined`时,会覆盖规则验证的结果 |
### FormItemRow Props
### FormItemGi Props
接受 FormItem & [Row](n-row#Row-Props) 所有的 Props。
### FormItemCol Props
接受 FormItem & [Col](n-row#Col-Props) 所有的 Props。
接受 FormItem & [GridItem](grid#GridItem-Props) 所有的 Props。
## Methods
@ -87,7 +83,7 @@ validator-debug
| validate | `(validateCallback?: (errors?: Array<ValidationError>) => void, shouldRuleBeApplied?: FormItemRule => boolean) => Promise<void>` | 验证表单。Promise rejection 的返回值类型是 `Array<ValidationError>`。 |
| clearValidationEffect | `() => void` | |
### FormItem, FormItemRow, FormItemCol Methods
### FormItem, FormItemGi Methods
| 名称 | 类型 | 说明 |
| --- | --- | --- |
@ -98,13 +94,13 @@ validator-debug
## Slots
### Form, FormItem, FormItemRow, FormItemCol Slots
### Form, FormItem, FormItemGi Slots
| 名称 | 参数 | 说明 |
| ------- | ---- | ---- |
| default | `()` | |
### FormItem, FormItem Row, FormItemCol Slots
### FormItem, FormItemGi Slots
| 名称 | 参数 | 说明 |
| ----- | ---- | ---- |

View File

@ -22,10 +22,10 @@
maxWidth: '640px'
}"
>
<n-form-item-row label="Input" path="inputValue">
<n-form-item label="Input" path="inputValue">
<n-input placeholder="Input" v-model:value="model.inputValue" />
</n-form-item-row>
<n-form-item-row label="Textarea" path="textareaValue">
</n-form-item>
<n-form-item label="Textarea" path="textareaValue">
<n-input
placeholder="Textarea"
v-model:value="model.textareaValue"
@ -35,29 +35,29 @@
maxRows: 5
}"
/>
</n-form-item-row>
<n-form-item-row label="Select" path="selectValue">
</n-form-item>
<n-form-item label="Select" path="selectValue">
<n-select
placeholder="Select"
:options="generalOptions"
v-model:value="model.selectValue"
/>
</n-form-item-row>
<n-form-item-row label="Multiple Select" path="multipleSelectValue">
</n-form-item>
<n-form-item label="Multiple Select" path="multipleSelectValue">
<n-select
placeholder="Select"
:options="generalOptions"
v-model:value="model.multipleSelectValue"
multiple
/>
</n-form-item-row>
<n-form-item-row label="Datetime" path="datetimeValue">
</n-form-item>
<n-form-item label="Datetime" path="datetimeValue">
<n-date-picker type="datetime" v-model:value="model.datetimeValue" />
</n-form-item-row>
<n-form-item-row label="Switch" path="switchValue">
</n-form-item>
<n-form-item label="Switch" path="switchValue">
<n-switch v-model:value="model.switchValue" />
</n-form-item-row>
<n-form-item-row label="Checkbox Group" path="checkboxGroupValue">
</n-form-item>
<n-form-item label="Checkbox Group" path="checkboxGroupValue">
<n-checkbox-group v-model:value="model.checkboxGroupValue">
<n-space>
<n-checkbox value="Option 1">Option 1</n-checkbox>
@ -65,8 +65,8 @@
<n-checkbox value="Option 3">Option 3</n-checkbox>
</n-space>
</n-checkbox-group>
</n-form-item-row>
<n-form-item-row label="Radio Group" path="radioGroupValue">
</n-form-item>
<n-form-item label="Radio Group" path="radioGroupValue">
<n-radio-group v-model:value="model.radioGroupValue" name="radiogroup1">
<n-space>
<n-radio value="Radio 1">Radio 1</n-radio>
@ -74,52 +74,48 @@
<n-radio value="Radio 3">Radio 3</n-radio>
</n-space>
</n-radio-group>
</n-form-item-row>
<n-form-item-row label="Radio Button Group" path="radioGroupValue">
</n-form-item>
<n-form-item label="Radio Button Group" path="radioGroupValue">
<n-radio-group v-model:value="model.radioGroupValue" name="radiogroup2">
<n-radio-button value="Radio 1">Radio 1</n-radio-button>
<n-radio-button value="Radio 2">Radio 2</n-radio-button>
<n-radio-button value="Radio 3">Radio 3</n-radio-button>
</n-radio-group>
</n-form-item-row>
<n-form-item-row label="Input Number" path="inputNumberValue">
</n-form-item>
<n-form-item label="Input Number" path="inputNumberValue">
<n-input-number v-model:value="model.inputNumberValue" />
</n-form-item-row>
<n-form-item-row label="Time Picker" path="timePickerValue">
</n-form-item>
<n-form-item label="Time Picker" path="timePickerValue">
<n-time-picker v-model:value="model.timePickerValue" />
</n-form-item-row>
<n-form-item-row label="Slider" path="sliderValue">
</n-form-item>
<n-form-item label="Slider" path="sliderValue">
<n-slider v-model:value="model.sliderValue" :step="5" />
</n-form-item-row>
<n-form-item-row label="Transfer" path="transferValue">
</n-form-item>
<n-form-item label="Transfer" path="transferValue">
<n-transfer v-model:value="model.transferValue" :options="generalOptions" />
</n-form-item-row>
<n-form-item-row :gutter="[28, 0]" label="Nested Path">
<n-row :gutter="[28, 0]">
<n-form-item-col :span="12" path="nestedValue.path1">
</n-form-item>
<n-form-item label="Nested Path" :show-feedback="false">
<n-grid :cols="2" :x-gap="24">
<n-form-item-gi path="nestedValue.path1">
<n-input
placeholder="Nested Path 1"
v-model:value="model.nestedValue.path1"
/>
</n-form-item-col>
<n-form-item-col :span="12" path="nestedValue.path2">
</n-form-item-gi>
<n-form-item-gi path="nestedValue.path2">
<n-select
placeholder="Nested Path 2"
:options="generalOptions"
v-model:value="model.nestedValue.path2"
/>
</n-form-item-col>
</n-row>
</n-form-item-row>
<n-row>
<n-col :span="24">
<div style="display: flex; justify-content: flex-end;">
<n-button @click="handleValidateButtonClick" round type="primary"
>验证</n-button
>
</div>
</n-col>
</n-row>
</n-form-item-gi>
</n-grid>
</n-form-item>
<div style="display: flex; justify-content: flex-end;">
<n-button @click="handleValidateButtonClick" round type="primary"
>验证</n-button
>
</div>
</n-form>
<pre>

View File

@ -1,5 +1,7 @@
# 标签上置
 使用 `n-grid``n-form-item-gi`grid item轻松写表单。
```html
<n-radio-group
v-model:value="size"
@ -17,11 +19,11 @@
ref="formRef"
label-placement="top"
>
<n-row :gutter="24">
<n-form-item-col :span="12" label="Input" path="inputValue">
<n-grid :cols="24" :x-gap="24">
<n-form-item-gi :span="12" label="Input" path="inputValue">
<n-input placeholder="Input" v-model:value="model.inputValue" />
</n-form-item-col>
<n-form-item-col :span="12" label="Textarea" path="textareaValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Textarea" path="textareaValue">
<n-input
placeholder="Textarea"
v-model:value="model.textareaValue"
@ -31,17 +33,15 @@
maxRows: 5
}"
/>
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col :span="12" label="Select" path="selectValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Select" path="selectValue">
<n-select
placeholder="Select"
:options="generalOptions"
v-model:value="model.selectValue"
/>
</n-form-item-col>
<n-form-item-col
</n-form-item-gi>
<n-form-item-gi
:span="12"
label="Multiple Select"
path="multipleSelectValue"
@ -52,22 +52,14 @@
v-model:value="model.multipleSelectValue"
multiple
/>
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col :span="12" label="Datetime" path="datetimeValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Datetime" path="datetimeValue">
<n-date-picker type="datetime" v-model:value="model.datetimeValue" />
</n-form-item-col>
<n-form-item-col :span="12" label="Switch" path="switchValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Switch" path="switchValue">
<n-switch v-model:value="model.switchValue" />
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col
:span="12"
label="Checkbox Group"
path="checkboxGroupValue"
>
</n-form-item-gi>
<n-form-item-gi :span="12" label="Checkbox Group" path="checkboxGroupValue">
<n-checkbox-group v-model:value="model.checkboxGroupValue">
<n-space>
<n-checkbox value="Option 1">Option 1</n-checkbox>
@ -75,8 +67,8 @@
<n-checkbox value="Option 3">Option 3</n-checkbox>
</n-space>
</n-checkbox-group>
</n-form-item-col>
<n-form-item-col :span="12" label="Radio Group" path="radioGroupValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Radio Group" path="radioGroupValue">
<n-radio-group v-model:value="model.radioGroupValue" name="radiogroup1">
<n-space>
<n-radio value="Radio 1">Radio 1</n-radio>
@ -84,10 +76,8 @@
<n-radio value="Radio 3">Radio 3</n-radio>
</n-space>
</n-radio-group>
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col
</n-form-item-gi>
<n-form-item-gi
:span="12"
label="Radio Button Group"
path="radioGroupValue"
@ -97,51 +87,45 @@
<n-radio-button value="Radio 2">Radio 2</n-radio-button>
<n-radio-button value="Radio 3">Radio 3</n-radio-button>
</n-radio-group>
</n-form-item-col>
<n-form-item-col :span="12" label="Input Number" path="inputNumberValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Input Number" path="inputNumberValue">
<n-input-number v-model:value="model.inputNumberValue" />
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col :span="12" label="Time Picker" path="timePickerValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Time Picker" path="timePickerValue">
<n-time-picker v-model:value="model.timePickerValue" />
</n-form-item-col>
<n-form-item-col :span="12" label="Slider" path="sliderValue">
</n-form-item-gi>
<n-form-item-gi :span="12" label="Slider" path="sliderValue">
<n-slider v-model:value="model.sliderValue" :step="5" />
</n-form-item-col>
</n-row>
<n-row :gutter="24">
<n-form-item-col :span="14" label="Transfer" path="transferValue">
</n-form-item-gi>
<n-form-item-gi :span="14" label="Transfer" path="transferValue">
<n-transfer
style="width: 100%;"
v-model:value="model.transferValue"
:options="generalOptions"
/>
</n-form-item-col>
<n-form-item-col :span="5" label="Nested Path" path="nestedValue.path1">
</n-form-item-gi>
<n-form-item-gi :span="5" label="Nested Path" path="nestedValue.path1">
<n-cascader
placeholder="Nested Path 1"
v-model:value="model.nestedValue.path1"
:options="cascaderOptions"
/>
</n-form-item-col>
<n-form-item-col :span="5" path="nestedValue.path2">
</n-form-item-gi>
<n-form-item-gi :span="5" path="nestedValue.path2">
<n-select
placeholder="Nested Path 2"
:options="generalOptions"
v-model:value="model.nestedValue.path2"
/>
</n-form-item-col>
</n-row>
<n-row>
<n-col :span="24">
</n-form-item-gi>
<n-gi :span="24">
<div style="display: flex; justify-content: flex-end;">
<n-button @click="handleValidateButtonClick" round type="primary"
>验证</n-button
>
</div>
</n-col>
</n-row>
</n-gi>
</n-grid>
</n-form>
<pre>

View File

@ -1,6 +1,10 @@
/* istanbul ignore file */
export { default as NForm } from './src/Form'
export { default as NFormItem } from './src/FormItem'
export { default as NFormItemGridItem } from './src/FormItemGridItem'
export { default as NFormItemGi } from './src/FormItemGridItem'
export type { FormInst, FormItemInst } from './src/interface'
// deprecated
export { default as NFormItemCol } from './src/FormItemCol'
export { default as NFormItemRow } from './src/FormItemRow'
export type { FormInst, FormItemInst } from './src/interface'

View File

@ -0,0 +1,56 @@
import { h, ref, defineComponent } from 'vue'
import NGridItem, {
gridItemProps,
gridItemPropKeys
} from '../../grid/src/GridItem'
import { keep, keysOf } from '../../_utils'
import NFormItem, { formItemProps, formItemPropKeys } from './FormItem'
import { FormItemInst } from './interface'
export const formItemGiProps = {
...gridItemProps,
...formItemProps
} as const
export const formItemGiPropKeys = keysOf(formItemGiProps)
export default defineComponent({
__GRID_ITEM__: true,
name: 'FormItemGridItem',
alias: ['FormItemGi'],
props: formItemGiProps,
setup (props) {
const formItemInstRef = ref<FormItemInst | null>(null)
const validate: FormItemInst['validate'] = ((...args: any[]) => {
const { value } = formItemInstRef
if (value) {
return (value.validate as any)(...args)
}
}) as any
const restoreValidation: FormItemInst['restoreValidation'] = () => {
const { value } = formItemInstRef
if (value) {
return value.restoreValidation()
}
}
return {
validate,
restoreValidation
}
},
render () {
return h(NGridItem, keep(this.$props, gridItemPropKeys), {
default: () => {
const itemProps = keep(this.$props, formItemPropKeys)
return h(
NFormItem,
{
ref: 'formItemInstRef',
...itemProps
},
this.$slots
)
}
})
}
})

View File

@ -1,19 +1,21 @@
# Basic
`n-grid-item` has an alias called `n-gi`.
```html
<n-grid x-gap="12" :cols="4">
<n-grid-item>
<n-gi>
<div class="light-green"></div>
</n-grid-item>
<n-grid-item>
</n-gi>
<n-gi>
<div class="green"></div>
</n-grid-item>
<n-grid-item>
</n-gi>
<n-gi>
<div class="light-green"></div>
</n-grid-item>
<n-grid-item>
</n-gi>
<n-gi>
<div class="green"></div>
</n-grid-item>
</n-gi>
</n-grid>
```

View File

@ -5,20 +5,20 @@ You can controlled whether to collapse the items that overflows. At the same tim
Collapsing works in responsive layout.
```html
<n-row>
<n-form-item-col label="Item Count" span="12">
<n-grid :cols="2">
<n-form-item-gi label="Item Count">
<n-input-number v-model:value="gridItemCount" :min="1" />
</n-form-item-col>
<n-form-item-col label="Max Rows After Collapsed" span="12">
</n-form-item-gi>
<n-form-item-gi label="Max Rows After Collapsed">
<n-input-number v-model:value="gridCollapsedRows" :min="1" />
</n-form-item-col>
<n-form-item-col label="Show Suffix Node" span="12">
</n-form-item-gi>
<n-form-item-gi label="Show Suffix Node">
<n-switch v-model:value="showSuffix" />
</n-form-item-col>
<n-form-item-col label="Grid Collapsed" span="12">
</n-form-item-gi>
<n-form-item-gi label="Grid Collapsed">
<n-switch v-model:value="gridCollapsed" />
</n-form-item-col>
</n-row>
</n-form-item-gi>
</n-grid>
<n-grid
:cols="5"
:collapsed="gridCollapsed"

View File

@ -1,19 +1,21 @@
# 基础用法
`n-grid-item` 可以被简写为 `n-gi`
```html
<n-grid x-gap="12" :cols="4">
<n-grid-item>
<n-gi>
<div class="light-green"></div>
</n-grid-item>
<n-grid-item>
</n-gi>
<n-gi>
<div class="green"></div>
</n-grid-item>
<n-grid-item>
</n-gi>
<n-gi>
<div class="light-green"></div>
</n-grid-item>
<n-grid-item>
</n-gi>
<n-gi>
<div class="green"></div>
</n-grid-item>
</n-gi>
</n-grid>
```

View File

@ -5,20 +5,20 @@
折叠在响应式布局下依然生效。
```html
<n-row>
<n-form-item-col label="数量" span="12">
<n-grid :cols="2">
<n-form-item-gi label="数量">
<n-input-number v-model:value="gridItemCount" :min="1" />
</n-form-item-col>
<n-form-item-col label="折叠后行数" span="12">
</n-form-item-gi>
<n-form-item-gi label="折叠后行数">
<n-input-number v-model:value="gridCollapsedRows" :min="1" />
</n-form-item-col>
<n-form-item-col label="打开后缀节点" span="12">
</n-form-item-gi>
<n-form-item-gi label="打开后缀节点">
<n-switch v-model:value="showSuffix" />
</n-form-item-col>
<n-form-item-col label="折叠栅格" span="12">
</n-form-item-gi>
<n-form-item-gi label="折叠栅格">
<n-switch v-model:value="gridCollapsed" />
</n-form-item-col>
</n-row>
</n-form-item-gi>
</n-grid>
<n-grid
:cols="5"
:collapsed="gridCollapsed"

View File

@ -1,2 +1,3 @@
export { default as NGrid } from './src/Grid'
export { default as NGridItem } from './src/GridItem'
export { default as NGi } from './src/GridItem'

View File

@ -116,6 +116,7 @@ export default defineComponent({
return {
style: computed<CSSProperties>(() => {
return {
width: '100%',
display: 'grid',
gridTemplateColumns: `repeat(${responsiveColsRef.value}, minmax(0, 1fr))`,
columnGap: pxfy(responsiveXGapRef.value),

View File

@ -4,11 +4,13 @@ import {
CSSProperties,
inject,
renderSlot,
getCurrentInstance
getCurrentInstance,
PropType
} from 'vue'
import { pxfy } from 'seemly'
import { gridInjectionKey } from './Grid'
import type { NGridInjection } from './Grid'
import { keysOf } from '../../_utils'
export const defaultSpan = 1
@ -19,26 +21,33 @@ interface GridItemVNodeProps {
privateShow?: boolean
}
export const gridItemProps = {
span: {
type: [Number, String] as PropType<string | number>,
default: defaultSpan
},
offset: {
type: [Number, String] as PropType<string | number>,
default: 0
},
suffix: Boolean,
// private props
privateOffset: Number,
privateSpan: Number,
privateColStart: Number,
privateShow: {
type: Boolean,
default: true
}
} as const
export const gridItemPropKeys = keysOf(gridItemProps)
export default defineComponent({
__GRID_ITEM__: true,
name: 'GridItem',
alias: ['Gi'],
props: {
span: {
type: [Number, String],
default: defaultSpan
},
offset: {
type: [Number, String],
default: 0
},
suffix: Boolean,
// private props
privateOffset: Number,
privateSpan: Number,
privateColStart: Number,
privateShow: Boolean
},
props: gridItemProps,
setup (props) {
const NGrid = inject(gridInjectionKey, null) as NGridInjection
const self = getCurrentInstance()

17
vue3.md
View File

@ -433,10 +433,10 @@
- [x] build site
- [x] table fixed col
- [ ] prefixCls暂时不需要
- [ ] 更新一波文档 props
- [ ] 更新样式的文档
- [x] 更新一波文档 props
- [x] 更新样式的文档
- [ ] on update value api
- [ ] anchor in modal page, maybe a bug of vue...
- [x] anchor in modal page, maybe a bug of vue...
- [ ] menu + dropdown collapsed 时候 menu item 不更新selected 从使用 useMemo 切换成 computed性能下降, Vue 在这种时候一定存在 bug但是暂时没空找了...
- [ ] select menu multiple, when show=true, checkmark transiton not working推测是 vue 的 bug
- [ ] demo hmr (或许是 vite-plugin-vue 或 vite 的 bug修改内容不更新
@ -455,8 +455,8 @@
- [x] card 设定高度
- [x] dropdown 手动定位有 bugmousemoveoutside
- [x] select menu loading
- [ ] refactor layout to make position work on first shot
- [ ] mention mention pending option not correct, sometimes it is not the first option
- [x] refactor layout to make position work on first shot
- [x] <del>mention mention pending option not correct, sometimes it is not the first option</del> In fact it's caused by mouse hover on item...
- [x] code Deprecated as of 10.7.0. highlight(lang, code, ...args) has been deprecated.
- [x] vdirs zindexable https://github.com/vuejs/vue-next/issues/3497
- [x] collapse-item overflow
@ -464,9 +464,12 @@
- [x] popover click 移动端不生效
- [ ] menu path 对应的问题
- [x] debug anchor 删除无用 link
- [ ] popover inst methods
- [x] popover inst methods
- [x] ios 浏览器 demo code font size 不对
- [ ] <del>table overflow bordered</del>
- [x] <del>table overflow bordered</del>
- [x] table ellipisis vertical align
- [x] form item grid item
- [ ] select filter composite...
## Build