docs: update docs

Change-Id: I76d0f72679cd75085f5ffd42f641daa198cafe11

docs: update docs for alert/autocomplete/carousel, etc.

Change-Id: Ib7507f4979024f53c127e4b64b88560b93999db7

fix: update for autocomplete filter

Change-Id: Ie54556715fa52838aeb6caaa19b4f9a9f14b490f

docs: add docs for calendar/transfer/cascader

Change-Id: I655b3cb3d25dd0649de9ae7e224e7063a40dd079

fix: add more demos for input/textarea

Change-Id: Iada527ca82643a435a4775110b332155512d62a7

docs: add docs for uploader,select,table, etc.

Change-Id: Ib034fd5cc9d9a420d4e002956ae925175783c5f3

docs: adjust formatting and punc.

docs: adjust docs for uploader, etc.

Change-Id: If06c8c1102eafce43f5802a333676fc9e62cd474

docs: add docs for nav

Change-Id: If56a653ec53f19239606128fd30cae80f8e10025

docs: improve anchor demos

Change-Id: I6ac1c08cc8905924d0062def1f8921fe1f302f15

docs: refine wording and format

docs: update docs for check-button-group desc

Change-Id: Ica7d6d0692250f0be6bd330b1ad4cc41938afd46
This commit is contained in:
Justineo 2021-09-16 19:23:58 +08:00 committed by GU Yiling
parent 4a257c3680
commit 32632e796e
75 changed files with 3360 additions and 411 deletions

View File

@ -14,6 +14,18 @@
[[ demo src="/demo/alert/multiple.vue" ]] [[ demo src="/demo/alert/multiple.vue" ]]
### 标题
设置 `title` 属性来指定消息标题。
[[ demo src="/demo/alert/title.vue" ]]
### 额外内容
通过 `extra` 插槽来指定消息之后的额外内容区域。
[[ demo src="/demo/alert/extra.vue" ]]
## API ## API
### 属性 ### 属性

View File

@ -2,9 +2,15 @@
## 示例 ## 示例
### 容器与吸附 ### 普通锚点
使用 [`container`](#props-container) 属性设置 `Anchor` 的容器,使用 [`sticky`](#props-sticky) 属性来控制是否在滚动出容器时进行吸附。 使用 [`container`](#props-container) 属性设置发生滚动的容器,当 `Anchor` 组件不在容器中(也就不随容器滚动),此时可以不用设置 `sticky` 属性。
[[ demo src="/demo/anchor/normal.vue" ]]
### 吸附锚点
`Anchor` 组件在容器中(随容器滚动),此时可设置 `sticky` 属性来控制组件在滚动出容器时进行吸附。
[[ demo src="/demo/anchor/sticky.vue" ]] [[ demo src="/demo/anchor/sticky.vue" ]]

View File

@ -2,8 +2,30 @@
## 示例 ## 示例
### 触发建议的时机
设置 `suggest-trigger` 来指定触发建议的时机。
[[ demo src="/demo/autocomplete/normal.vue" ]] [[ demo src="/demo/autocomplete/normal.vue" ]]
### 严格模式
设置 `strict` 属性来指定严格模式,若输入值没有完全匹配建议值,那么在失焦时会清空输入值。
[[ demo src="/demo/autocomplete/strict.vue" ]]
### 自定义搜索逻辑
设置 `match` 属性来自定义自定义高亮逻辑。
设置 `filter` 属性来自定义搜索命中逻辑。
:::tip
`match` 用于高亮显示匹配文本的逻辑;而 `filter` 是控制是否命中。默认情况下 `filter` 会过滤掉未被 `match` 匹配的节点,且将包含非叶子节点。如希望搜索结果中都是叶子节点,可通过重写 `filter` 过滤掉非叶子节点。
:::
[[ demo src="/demo/autocomplete/custom.vue" ]]
## API ## API
### 属性 ### 属性
@ -12,7 +34,8 @@
| -- | -- | -- | -- | | -- | -- | -- | -- |
| ``datasource`` | `Array<string | Object>=` | `[]` | [^datasource] | | ``datasource`` | `Array<string | Object>=` | `[]` | [^datasource] |
| ``value`` | `*` | - | [^prop-value] | | ``value`` | `*` | - | [^prop-value] |
| ``match`` | `function(string | Object, string): boolean=` | - | 自定义搜索逻辑。 | | ``match`` | `(item, keyword, { ancestors }) => boolean | [number, number] | Array<[number, number]>` | - | 支持自定义高亮逻辑,默认进行大小写不敏感的子串匹配。 |
| ``filter`` | `(item, keyword, { ancestors, offsets }) => boolean` | - | 支持自定义搜索命中逻辑。 |
| ``strict`` | `boolean=` | `false` | 建议下拉面板关闭时,若输入值没有完全匹配建议值,那么会清空输入值。 | | ``strict`` | `boolean=` | `false` | 建议下拉面板关闭时,若输入值没有完全匹配建议值,那么会清空输入值。 |
| ``suggest-trigger`` | `string | Array<string>=` | `'input'` | 触发建议下拉面板的时机,可用值有:`'input'`、`'focus'`。 | | ``suggest-trigger`` | `string | Array<string>=` | `'input'` | 触发建议下拉面板的时机,可用值有:`'input'`、`'focus'`。 |
| ``placeholder`` | `string=` | | 输入占位符。 | | ``placeholder`` | `string=` | | 输入占位符。 |

View File

@ -14,6 +14,12 @@
[[ demo src="/demo/badge/number.vue" ]] [[ demo src="/demo/badge/number.vue" ]]
### 右上角圆点徽标
不提供徽标内容时,徽标将以圆点样式显示在右上角。
[[ demo src="/demo/badge/corner-dot.vue" ]]
### 圆点徽标 ### 圆点徽标
不提供插槽内容时,徽标将以圆点样式显示。 不提供插槽内容时,徽标将以圆点样式显示。

View File

@ -20,6 +20,30 @@
[[ demo src="/demo/calendar/multiple-ranges.vue" ]] [[ demo src="/demo/calendar/multiple-ranges.vue" ]]
### 日历类型
设置 `type` 来指定日历的类型:年、月、日。
[[ demo src="/demo/calendar/type.vue" ]]
### 显示非本月日期
设置 `fill-month` 来控制是否显示非本月日期。
[[ demo src="/demo/calendar/fill-month.vue" ]]
### 禁用日期
设置 `disabled-date` 来自定义指定日期是否禁用。
[[ demo src="/demo/calendar/disabled-date.vue" ]]
### 自定义日期的样式
设置 `date-class` 来自定义指定日期的 `class`
[[ demo src="/demo/calendar/date-class.vue" ]]
## API ## API
### 属性 ### 属性

View File

@ -42,6 +42,13 @@
[[ demo src="/demo/carousel/slides.vue" ]] [[ demo src="/demo/carousel/slides.vue" ]]
### 轮播项纵横比
设置 `slide-aspect-ratio` 属性来指定每个轮播项的纵横比。
[[ demo src="/demo/carousel/ratio.vue" ]]
## API ## API
### 属性 ### 属性

View File

@ -27,6 +27,24 @@
[[ demo src="/demo/cascader/multiple.vue" ]] [[ demo src="/demo/cascader/multiple.vue" ]]
### 选择模式
使用 `select-mode` 属性来控制在单选模式下哪些项目可以被选中。
[[ demo src="/demo/cascader/select-mode.vue" ]]
### 子项展开时机
使用 `column-trigger` 属性来控制下拉面板中下级的展开时机。
[[ demo src="/demo/cascader/column-trigger.vue" ]]
### 渲染选中值
使用 `value-display` 属性来控制选中值如何展示。
[[ demo src="/demo/cascader/value-display.vue" ]]
## API ## API
### 属性 ### 属性
@ -52,6 +70,8 @@
| ``readonly`` | `boolean=` | `false` | 是否为只读状态。 | | ``readonly`` | `boolean=` | `false` | 是否为只读状态。 |
| ``overlay-class`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-class`](./overlay#props-overlay-class) 属性。 | | ``overlay-class`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-class`](./overlay#props-overlay-class) 属性。 |
| ``overlay-style`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-style`](./overlay#props-overlay-style) 属性。 | | ``overlay-style`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-style`](./overlay#props-overlay-style) 属性。 |
| ``match`` | `(item, keyword, { ancestors }) => boolean | Array<[number, number]>` | - | 支持自定义高亮逻辑, 默认大小写不敏感,参考 [`Autocomplete`](./Autocomplete#自定义搜索逻辑)。 |
| ``filter`` | `(item, keyword, { ancestors, offsets }) => boolean` | - | 支持自定义搜索命中逻辑,参考 [`Autocomplete`](./Autocomplete#自定义搜索逻辑)。 |
^^^ui ^^^ui
预设样式。 预设样式。

View File

@ -8,12 +8,30 @@
[[ demo src="/demo/check-button-group/default.vue" ]] [[ demo src="/demo/check-button-group/default.vue" ]]
### 简单样式
设置 `ui` 属性值:`simple` 来指定简单样式。
[[ demo src="/demo/check-button-group/simple.vue" ]]
### 单复选共存 ### 单复选共存
可以使用 `exclusive` 选项与 `empty-value` 实现一些单复选共存的场景。 可以使用 `exclusive` 选项与 `empty-value` 实现一些单复选共存的场景。
[[ demo src="/demo/check-button-group/exclusive.vue" ]] [[ demo src="/demo/check-button-group/exclusive.vue" ]]
### 额外描述
在数据源的项目中设置 `desc` 字段或者通过 `desc` 插槽来指定额外描述。额外描述会在悬浮时显示。
[[ demo src="/demo/check-button-group/desc.vue" ]]
### 最小宽度
通过设置 `ui` 属性值 `stable` 来开启项目的最小宽度。
[[ demo src="/demo/check-button-group/stable.vue" ]]
## API ## API
### 属性 ### 属性
@ -38,7 +56,7 @@
^^^ ^^^
^^^items ^^^items
复选按钮组数据源,项目类型为 `{label, value, disabled, exclusive, ...}`。 复选按钮组数据源,项目类型为 `{ label, value, disabled, exclusive, desc, ... }`。
+++字段详情 +++字段详情
| 名称 | 类型 | 描述 | | 名称 | 类型 | 描述 |
@ -47,6 +65,7 @@
| `value` | `*` | 选项对应的值。 | | `value` | `*` | 选项对应的值。 |
| `disabled` | `boolean=` | 选项是否为禁用。 | | `disabled` | `boolean=` | 选项是否为禁用。 |
| `exclusive` | `boolean=` | 选项是否为排它项。当选项为排它项时,选中该项将取消选中其它所有选项。 | | `exclusive` | `boolean=` | 选项是否为排它项。当选项为排它项时,选中该项将取消选中其它所有选项。 |
| `desc` | `string` | 选项的额外描述信息。 |
+++ +++
^^^ ^^^
@ -63,6 +82,7 @@
| 名称 | 描述 | | 名称 | 描述 |
| -- | -- | | -- | -- |
| ``item`` | [^slot-item] | | ``item`` | [^slot-item] |
| ``desc`` | 按钮的额外描述信息,作用域参数同 `item` 插槽。 |
^^^slot-item ^^^slot-item
按钮内文本区域。 按钮内文本区域。

View File

@ -14,6 +14,12 @@
[[ demo src="/demo/checkbox-group/exclusive.vue" ]] [[ demo src="/demo/checkbox-group/exclusive.vue" ]]
### 额外描述
在数据源的项目中设置 `desc` 字段或者通过 `desc` 插槽来指定额外描述。额外描述会在悬浮时显示。
[[ demo src="/demo/checkbox-group/desc.vue" ]]
## API ## API
### 属性 ### 属性
@ -38,7 +44,7 @@
^^^ ^^^
^^^items ^^^items
复选框组数据源,项目类型为 `{label, value, disabled, exclusive, ...}`。 复选框组数据源,项目类型为 `{ label, value, disabled, exclusive, desc, ... }`。
+++字段详情 +++字段详情
| 名称 | 类型 | 描述 | | 名称 | 类型 | 描述 |
@ -47,6 +53,7 @@
| `value` | `*` | 选项对应的值。 | | `value` | `*` | 选项对应的值。 |
| `disabled` | `boolean=` | 选项是否为禁用。 | | `disabled` | `boolean=` | 选项是否为禁用。 |
| `exclusive` | `boolean=` | 选项是否为排它项。 | | `exclusive` | `boolean=` | 选项是否为排它项。 |
| `desc` | `string` | 选项的额外描述信息。 |
+++ +++
^^^ ^^^
@ -63,6 +70,7 @@
| 名称 | 描述 | | 名称 | 描述 |
| -- | -- | | -- | -- |
| ``item`` | [^slot-item] | | ``item`` | [^slot-item] |
| ``desc`` | 按钮的额外描述信息,作用域参数同 `item` 插槽。 |
^^^slot-item ^^^slot-item
选项描述文本区域。 选项描述文本区域。

View File

@ -20,6 +20,14 @@
[[ demo src="/demo/date-picker/shortcuts.vue" ]] [[ demo src="/demo/date-picker/shortcuts.vue" ]]
### 禁用和只读
设置 `disabled` 属性可使组件处于禁用状态。
设置 `readonly` 属性可使组件处于只读状态。
[[ demo src="/demo/date-picker/disabled.vue" ]]
## API ## API
### 属性 ### 属性

View File

@ -57,6 +57,8 @@
| ``disabled`` | `boolean=` | `false` | 是否为禁用状态。 | | ``disabled`` | `boolean=` | `false` | 是否为禁用状态。 |
| ``overlay-class`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-class`](./overlay#props-overlay-class) 属性。 | | ``overlay-class`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-class`](./overlay#props-overlay-class) 属性。 |
| ``overlay-style`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-style`](./overlay#props-overlay-style) 属性。 | | ``overlay-style`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-style`](./overlay#props-overlay-style) 属性。 |
| ``match`` | `(item, keyword, { ancestors }) => boolean | Array<[number, number]>` | - | 支持自定义高亮逻辑, 默认大小写不敏感,参考 [`Autocomplete`](./Autocomplete#自定义搜索逻辑)。 |
| ``filter`` | `(item, keyword, { ancestors, offsets }) => boolean` | - | 支持自定义搜索命中逻辑,参考 [`Autocomplete`](./Autocomplete#自定义搜索逻辑)。 |
^^^ui ^^^ui
预设样式。 预设样式。

View File

@ -20,6 +20,18 @@
[[ demo src="/demo/input/disabled.vue" ]] [[ demo src="/demo/input/disabled.vue" ]]
### 感知输入法
设置 `composition` 来感知输入法输入过程中的值。
[[ demo src="/demo/input/composition.vue" ]]
### 过滤首尾空白字符
设置 `trim` 来自动过滤用户输入的首尾空白字符。
[[ demo src="/demo/input/trim.vue" ]]
## API ## API
### 属性 ### 属性

119
one/docs/components/nav.md Normal file
View File

@ -0,0 +1,119 @@
# Nav <small>导航菜单</small>
## 示例
### 尺寸
可选的尺寸 `ui` 属性值:`s`/`m`。
[[ demo src="/demo/nav/size.vue" ]]
### 大卡样式
设置首层数据项属性 `position``card` 可使该数据项下拉展示成大卡样式。
[[ demo src="/demo/nav/card.vue" ]]
### 自定义插槽
[[ demo src="/demo/nav/slot.vue" ]]
### 自适应宽度
自动根据实际渲染宽度来决定是否将多余的导航项目折叠起来。
[[ demo src="/demo/nav/more.vue" ]]
## API
### 属性
| 名称 | 类型 | 默认值 | 描述 |
| -- | -- | -- | -- |
| `ui` | `string=` | - | [^ui] |
| `items` | `Array<Object>=` | `[]` | [^items] |
| `active` | `string` | - | [^active] |
| `matches` | `function(Object, string): boolean` | - | [^matches] |
^^^ui
预设样式。
+++枚举值
| 值 | 描述 |
| -- | -- |
| `s` | 小尺寸样式。 |
| `m` | 中尺寸样式。 |
+++
^^^
^^^active
当前激活节点,若该节点定义了 `name` 则就是该 `name` 值,否则该值是由 `to` 生成的路由路径([route.path](https://router.vuejs.org/zh/api/#%E8%B7%AF%E7%94%B1%E5%AF%B9%E8%B1%A1%E5%B1%9E%E6%80%A7))。
^^^
^^^items
数据源数组,每个节点类型为 `{label, to, name, icon, disabled, children, ...}`
+++字段详情
| 名称 | 类型 | 描述 |
| -- | -- | -- |
| `label` | `string` | 节点的文字描述。 |
| `to` | `string | Object` | 节点的导航目的地。参考 [`Link`](./link) 组件的 [`to`](./link#props) 属性。 |
| `name` | `string` | 节点的唯一标识,`name` 和 `to` 二者至少有一个存在。 |
| `disabled` | `boolean=` | 节点是否被禁用。 |
| `position` | `string=` | 首层节点的下拉面板样式,设置成 `card` 则展示成大卡样式。 |
| `children` | `Array<Object>=` | 节点的子节点数组,数组项类型同 `items` 数组项。 |
+++
^^^
^^^matches
当路由发生切换时,用来从 `items` 中找到激活的项目。
默认实现:项目路由路径和当前路由的路径相等 (===) 则认为该项目是激活的。
^^^
### 插槽
| 名称 | 描述 |
| -- | -- |
| `item` | [^item] |
| `item-label` | [^item-label] |
^^^item
每个节点的渲染插槽。
默认内容:渲染了 `icon` 插槽和 `item-label` 插槽。
+++作用域参数
| 名称 | 类型 | 描述 |
| -- | -- | -- |
| `label` | `string` | 图标名称。 |
| `to` | `string | Object` | 节点的导航目的地。参考 [`Link`](./link) 组件的 [`to`](./link#props) 属性。 |
| `name` | `string` | 节点的唯一标识,`name` 和 `to` 二者至少有一个存在。 |
| `disabled` | `boolean=` | 节点是否被禁用。 |
| `children` | `Array<Object>=` | 节点的子节点数组,数组项类型同 `items` 数组项。 |
+++
^^^
^^^item-label
节点的 `label` 插槽。
默认内容:渲染节点对应的 `Link`
作用域参数参考 `item` 插槽。
^^^
### 事件
| 名称 | 描述 |
| -- | -- |
| `activate` | 用户点击有 `to` 的节点触发,参数是激活节点的整个 `item` 数据。 |
| `click` | 用户点击节点时触发,参数是激活节点整个 `item` 数据。 |
### 图标
| 名称 | 描述 |
| -- | -- |
| `expand` | 展开。 |
| `more` | 更多。 |

View File

@ -20,6 +20,14 @@
[[ demo src="/demo/number-input/disabled.vue" ]] [[ demo src="/demo/number-input/disabled.vue" ]]
### 精度位数和递增/递减
设置 `decimal-place` 来指定数值的小数精度位数。
设置 `step` 来指定每次递增/减的数值。
[[ demo src="/demo/number-input/decimal.vue" ]]
## API ## API
### 属性 ### 属性
@ -35,6 +43,7 @@
| ``max`` | `number` | - | 允许的最大值。 | | ``max`` | `number` | - | 允许的最大值。 |
| ``min`` | `number` | - | 允许的最小值。 | | ``min`` | `number` | - | 允许的最小值。 |
| ``decimal-place`` | `number` | 0 | 数值的小数精度位数,默认精确到整数位,`-1` 表示不处理精度。 | | ``decimal-place`` | `number` | 0 | 数值的小数精度位数,默认精确到整数位,`-1` 表示不处理精度。 |
| ``step`` | `number` | 1 | 每次递增/递减的数值。 |
^^^ui ^^^ui
预设样式。 预设样式。

View File

@ -12,6 +12,15 @@
[[ demo src="/demo/pagination/goto.vue" ]] [[ demo src="/demo/pagination/goto.vue" ]]
### 每页个数
使用 `page-size` 属性来指定当前每页的个数。
使用 `page-sizes` 属性来指定每页个数候选项。
[[ demo src="/demo/pagination/pages.vue" ]]
## API ## API
### 属性 ### 属性

View File

@ -8,6 +8,24 @@
[[ demo src="/demo/radio-button-group/default.vue" ]] [[ demo src="/demo/radio-button-group/default.vue" ]]
### 简单样式
设置 `ui` 属性值:`simple` 来指定简单样式。
[[ demo src="/demo/radio-button-group/simple.vue" ]]
### 额外描述
在数据源的项目中设置 `desc` 字段或者通过 `desc` 插槽来指定额外描述。额外描述会在悬浮时显示。
[[ demo src="/demo/radio-button-group/desc.vue" ]]
### 最小宽度
设置 `ui` 属性值:`simple` 来指定简单样式。
[[ demo src="/demo/radio-button-group/stable.vue" ]]
## API ## API
### 属性 ### 属性
@ -31,7 +49,7 @@
^^^ ^^^
^^^items ^^^items
单选按钮组数据源,项目类型为 `{label, value, disabled, ...}`。 单选按钮组数据源,项目类型为 `{ label, value, disabled, desc, ... }`。
+++字段详情 +++字段详情
| 名称 | 类型 | 描述 | | 名称 | 类型 | 描述 |
@ -39,6 +57,7 @@
| `label` | `string` | 选项的文字说明。 | | `label` | `string` | 选项的文字说明。 |
| `value` | `*` | 选项对应的值。 | | `value` | `*` | 选项对应的值。 |
| `disabled` | `boolean=` | 选项是否为禁用。 | | `disabled` | `boolean=` | 选项是否为禁用。 |
| `desc` | `string` | 选项的额外描述信息。 |
+++ +++
^^^ ^^^
@ -55,6 +74,7 @@
| 名称 | 描述 | | 名称 | 描述 |
| -- | -- | | -- | -- |
| ``item`` | [^slot-item] | | ``item`` | [^slot-item] |
| ``desc`` | 按钮的额外描述信息,作用域参数同 `item` 插槽。 |
^^^slot-item ^^^slot-item
按钮内文本区域。 按钮内文本区域。
@ -68,6 +88,7 @@
| `value` | `string` | 选项值。 | | `value` | `string` | 选项值。 |
| `index` | `number` | 选项在 `items` 中的序号。 | | `index` | `number` | 选项在 `items` 中的序号。 |
| `disabled` | `boolean=` | 选项是否禁用。 | | `disabled` | `boolean=` | 选项是否禁用。 |
| `desc` | `string` | 选项的额外描述信息。 |
+++ +++
另外,`items` 内数据项中除了上面描述的字段之外的其它字段也会自动通过 `v-bind` 进行绑定到作用域参数上。 另外,`items` 内数据项中除了上面描述的字段之外的其它字段也会自动通过 `v-bind` 进行绑定到作用域参数上。

View File

@ -8,6 +8,12 @@
[[ demo src="/demo/radio-group/default.vue" ]] [[ demo src="/demo/radio-group/default.vue" ]]
### 额外描述
在数据源的项目中设置 `desc` 字段或者通过 `desc` 插槽来指定额外描述。额外描述会在悬浮时显示。
[[ demo src="/demo/radio-group/desc.vue" ]]
## API ## API
### 属性 ### 属性
@ -31,7 +37,7 @@
^^^ ^^^
^^^items ^^^items
单选框组数据源,项目类型为 `{label, value, disabled, ...}`。 单选框组数据源,项目类型为 `{ label, value, disabled, desc, ... }`。
+++字段详情 +++字段详情
| 名称 | 类型 | 描述 | | 名称 | 类型 | 描述 |
@ -39,6 +45,7 @@
| `label` | `string` | 选项的文字说明。 | | `label` | `string` | 选项的文字说明。 |
| `value` | `*` | 选项对应的值。 | | `value` | `*` | 选项对应的值。 |
| `disabled` | `boolean=` | 选项是否为禁用。 | | `disabled` | `boolean=` | 选项是否为禁用。 |
| `desc` | `string` | 选项的额外描述信息。 |
+++ +++
^^^ ^^^
@ -55,6 +62,7 @@
| 名称 | 描述 | | 名称 | 描述 |
| -- | -- | | -- | -- |
| ``item`` | [^slot-item] | | ``item`` | [^slot-item] |
| ``desc`` | 按钮的额外描述信息,作用域参数同 `item` 插槽。 |
^^^slot-item ^^^slot-item
选项描述文本区域。 选项描述文本区域。

View File

@ -41,6 +41,8 @@
| ``expanded`` | `boolean=` | `false` | [^expanded] | | ``expanded`` | `boolean=` | `false` | [^expanded] |
| ``disabled`` | `boolean=` | `false` | 是否为禁用状态。 | | ``disabled`` | `boolean=` | `false` | 是否为禁用状态。 |
| ``readonly`` | `boolean=` | `false` | 是否为只读状态。 | | ``readonly`` | `boolean=` | `false` | 是否为只读状态。 |
| ``match`` | `(item, keyword, { ancestors }) => boolean | Array<[number, number]>` | - | 支持自定义高亮逻辑, 默认大小写不敏感,参考 [`Autocomplete`](./Autocomplete#自定义搜索逻辑)。 |
| ``filter`` | `(item, keyword, { ancestors, offsets }) => boolean` | - | 支持自定义搜索命中逻辑,参考 [`Autocomplete`](./Autocomplete#自定义搜索逻辑)。 |
^^^ui ^^^ui
按钮预设样式。 按钮预设样式。

View File

@ -30,6 +30,15 @@
[[ demo src="/demo/select/multiple.vue" ]] [[ demo src="/demo/select/multiple.vue" ]]
### 自定义已选项展示
使用 `label` 插槽来自定义**下拉关闭时**已选项如何展示。
使用 `select` 插槽来自定义已选项如何展示,和下拉是否关闭无关。
[[ demo src="/demo/select/selected.vue" ]]
## API ## API
### 属性 ### 属性
@ -50,6 +59,8 @@
| ``readonly`` | `boolean=` | `false` | 是否为只读状态。 | | ``readonly`` | `boolean=` | `false` | 是否为只读状态。 |
| ``overlay-class`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-class`](./overlay#props-overlay-class) 属性。 | | ``overlay-class`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-class`](./overlay#props-overlay-class) 属性。 |
| ``overlay-style`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-style`](./overlay#props-overlay-style) 属性。 | | ``overlay-style`` | `string | Array | Object=` | - | 参考 [`Overlay`](./overlay) 组件的 [`overlay-style`](./overlay#props-overlay-style) 属性。 |
| ``match`` | `(item, keyword, { ancestors }) => boolean | Array<[number, number]>` | - | 支持自定义高亮逻辑, 默认大小写不敏感,参考 [`Autocomplete`](./Autocomplete#自定义搜索逻辑)。 |
| ``filter`` | `(item, keyword, { ancestors, offsets }) => boolean` | - | 支持自定义搜索命中逻辑,参考 [`Autocomplete`](./Autocomplete#自定义搜索逻辑)。 |
^^^ui ^^^ui
预设样式。 预设样式。

View File

@ -48,6 +48,22 @@
[[ demo src="/demo/table/desc.vue" ]] [[ demo src="/demo/table/desc.vue" ]]
### 排序
使用 `order` 属性和 `order-by` 属性来指定表头上的排序状态。
监听 `sort` 事件来处理排序状态的变化。
设置 `allowed-orders` 属性来自定义允许的排序状态。
[[ demo src="/demo/table/order.vue" ]]
### 加载状态
使用 `loading` 属性来指定表格处于加载状态。
[[ demo src="/demo/table/loading.vue" ]]
## API ## API
### 属性 ### 属性

View File

@ -20,6 +20,12 @@
[[ demo src="/demo/textarea/disabled.vue" ]] [[ demo src="/demo/textarea/disabled.vue" ]]
### 自动扩展
设置 `autoresize` 来使文本域处于自动扩展状态。
[[ demo src="/demo/textarea/autoresize.vue" ]]
## API ## API
### 属性 ### 属性

View File

@ -20,6 +20,12 @@
[[ demo src="/demo/transfer/flat.vue" ]] [[ demo src="/demo/transfer/flat.vue" ]]
### 选中值的合并模式
设置 `merge-checked` 来指定选中值的合并模式。
[[ demo src="/demo/transfer/merge-checked.vue" ]]
## API ## API
### 属性 ### 属性

View File

@ -32,6 +32,25 @@
[[ demo src="/demo/uploader/custom.vue" ]] [[ demo src="/demo/uploader/custom.vue" ]]
### 拖拽排序
设置 `sortable` 属性来指定上传项目之间可以拖拽排序。
[[ demo src="/demo/uploader/sortable.vue" ]]
### 已上传项自定义操作
设置 `controls` 属性来指定悬浮到每个上传项时的操作选项。
[[ demo src="/demo/uploader/controls.vue" ]]
### 上传入口自定义操作
设置 `entries` 属性来指定悬浮到继续上传项目时的操作选项。
[[ demo src="/demo/uploader/entries.vue" ]]
## API ## API
### 属性 ### 属性

View File

@ -0,0 +1,33 @@
<template>
<article>
<veui-alert
type="success"
ui="strong"
message="恭喜你,你的请求已成功处理"
closable
>
<template slot="title">恭喜你</template>
<template slot="extra">
<veui-button ui="text">查看详情</veui-button>
</template>
恭喜你你的请求已成功处理
</veui-alert>
</article>
</template>
<script>
import { Alert, Button } from 'veui'
export default {
components: {
'veui-alert': Alert,
'veui-button': Button
}
}
</script>
<style lang="less" scoped>
.veui-alert {
margin-bottom: 20px;
}
</style>

View File

@ -0,0 +1,36 @@
<template>
<article>
<veui-alert
type="success"
title="消息标题"
>
Your profile has been updated.
</veui-alert>
<veui-alert
type="success"
>
Your profile has been updated.
<template slot="title">消息标题</template>
</veui-alert>
</article>
</template>
<script>
import { Alert } from 'veui'
export default {
components: {
'veui-alert': Alert
}
}
</script>
<style lang="less" scoped docs>
.veui-alert {
margin-bottom: 20px;
}
</style>
<docs>
可将消息标题写在 `title` 插槽中也可以通过 `title` 属性进行指定
</docs>

View File

@ -0,0 +1,109 @@
<template>
<article class="anchor-offset-demo">
<div
ref="container"
class="anchor-wrapper"
>
<div
v-for="i in coffees"
:id="i.value.indexOf('#') >= 0 ? i.value.slice(1) : i.value"
:key="i.value"
class="block"
>
{{ i.label }}
</div>
</div>
<section class="anchor-two">
<veui-anchor
:items="coffees"
container="container"
/>
</section>
</article>
</template>
<script>
import { Anchor } from 'veui'
export default {
components: {
'veui-anchor': Anchor
},
data () {
return {
coffees: [
{
label: 'Infused',
value: '#infused',
children: [
{
label: 'Breadcrumb',
value: '/components/breadcrumb'
}
]
},
{
label: 'Boiled',
value: '#boiled',
children: [
{
label: 'Button',
value: '/components/button'
}
]
},
{
label: 'Espresso',
value: '#espresso'
},
{
label: 'Milk coffee',
value: '#milk-coffee'
}
]
}
}
}
</script>
<style lang="less" scoped>
.anchor-offset-demo {
position: relative;
.anchor-wrapper {
position: relative;
display: flex;
flex-direction: column;
height: 300px;
overflow: auto;
border: 1px dashed;
& > section {
position: absolute;
}
}
.block {
white-space: nowrap;
border-top: 1px solid #000;
width: 100px;
height: 150px;
flex: none;
& + .block {
margin-top: 20px;
}
}
.anchor-two {
position: absolute;
left: 250px;
top: 10px;
}
}
</style>
<docs>
虚线框标记容器实线标记锚点项顶部当二者重合触发激活
</docs>

View File

@ -39,7 +39,7 @@ export default {
coffees: [ coffees: [
{ {
label: 'Infused', label: 'Infused',
value: '#infused2', value: '#infused1',
children: [ children: [
{ {
label: 'Breadcrumb', label: 'Breadcrumb',
@ -49,7 +49,7 @@ export default {
}, },
{ {
label: 'Boiled', label: 'Boiled',
value: '#boiled2', value: '#boiled1',
children: [ children: [
{ {
label: 'Button', label: 'Button',
@ -59,11 +59,11 @@ export default {
}, },
{ {
label: 'Espresso', label: 'Espresso',
value: '#espresso2' value: '#espresso1'
}, },
{ {
label: 'Milk coffee', label: 'Milk coffee',
value: '#milk-coffee2' value: '#milk-coffee1'
} }
] ]
} }
@ -83,7 +83,7 @@ export default {
border-top: 1px solid red; border-top: 1px solid red;
&::after { &::after {
content: "targetOffset: 20px"; content: "targetOffset(切换于此)";
position: absolute; position: absolute;
right: 0; right: 0;
bottom: 0; bottom: 0;
@ -97,7 +97,7 @@ export default {
left: 250px; left: 250px;
&::after { &::after {
content: "stickyOffset: 30px"; content: "stickyOffset(吸附于此)";
} }
} }
@ -116,7 +116,7 @@ export default {
.block { .block {
white-space: nowrap; white-space: nowrap;
border-top: 1px solid #ccc; border-top: 1px solid #000;
width: 100px; width: 100px;
height: 150px; height: 150px;
flex: none; flex: none;
@ -136,5 +136,9 @@ export default {
</style> </style>
<docs> <docs>
虚线框标记容器 虚线框标记容器黑实线标记锚点项顶部
当黑实线和 `tagetOffset` 线重合触发激活
`Anchor` 吸附在 `stickyOffset` 线处
</docs> </docs>

View File

@ -13,17 +13,7 @@
> >
{{ i.label }} {{ i.label }}
</div> </div>
<section class="anchor-one">
<h3>普通锚点</h3>
<veui-anchor
:items="coffees"
:sticky="false"
container="container"
/>
</section>
<section class="anchor-two"> <section class="anchor-two">
<h3>吸附锚点</h3>
<veui-anchor <veui-anchor
:items="coffees" :items="coffees"
container="container" container="container"
@ -45,7 +35,7 @@ export default {
coffees: [ coffees: [
{ {
label: 'Infused', label: 'Infused',
value: '#infused', value: '#infused2',
children: [ children: [
{ {
label: 'Breadcrumb', label: 'Breadcrumb',
@ -55,7 +45,7 @@ export default {
}, },
{ {
label: 'Boiled', label: 'Boiled',
value: '#boiled', value: '#boiled2',
children: [ children: [
{ {
label: 'Button', label: 'Button',
@ -65,11 +55,11 @@ export default {
}, },
{ {
label: 'Espresso', label: 'Espresso',
value: '#espresso' value: '#espresso2'
}, },
{ {
label: 'Milk coffee', label: 'Milk coffee',
value: '#milk-coffee' value: '#milk-coffee2'
} }
] ]
} }
@ -81,22 +71,6 @@ export default {
.anchor-demo { .anchor-demo {
position: relative; position: relative;
.line {
position: absolute;
top: 0;
width: 180px;
border-top: 1px solid red;;
&::after {
content: "0";
position: absolute;
right: 0;
bottom: 0;
color: red;
font-size: 12px;
}
}
.anchor-wrapper { .anchor-wrapper {
position: relative; position: relative;
display: flex; display: flex;
@ -112,7 +86,7 @@ export default {
.block { .block {
white-space: nowrap; white-space: nowrap;
border-top: 1px solid #ccc; border-top: 1px solid #000;
width: 100px; width: 100px;
height: 150px; height: 150px;
flex: none; flex: none;
@ -130,7 +104,7 @@ export default {
.anchor-two { .anchor-two {
position: absolute; position: absolute;
left: 450px; left: 250px;
top: 50px; top: 50px;
} }
} }
@ -138,5 +112,5 @@ export default {
</style> </style>
<docs> <docs>
虚线框标记容器 虚线框标记容器实线标记锚点项顶部当二者重合触发激活
</docs> </docs>

View File

@ -0,0 +1,72 @@
<template>
<article class="autocomplete-normal-demo">
<section>
<h3>大小写敏感搜索叶子节点</h3>
<veui-autocomplete
:datasource="suggestions"
placeholder="请输入"
suggest-trigger="focus"
:match="match"
:filter="filter"
/>
</section>
</article>
</template>
<script>
import { Autocomplete } from 'veui'
export default {
components: {
'veui-autocomplete': Autocomplete
},
data () {
return {
suggestions: [
{
label: 'Milk coffee',
value: 'milk-coffee',
options: [
{
value: 'Moka'
}
]
},
{
value: 'Turkish'
},
{
value: 'latte'
},
{
value: 'cappuccino'
}
]
}
},
methods: {
match ({ label }, keyword) {
const index = label.indexOf(keyword)
return index >= 0
? [[index, index + keyword.length]]
: false
},
filter ({ options }, _, { offsets }) {
//
return options && options.length
? false
: offsets === true || (!!offsets && !!offsets.length)
}
}
}
</script>
<style lang="less" scoped>
.autocomplete-normal-demo {
display: flex;
section + section {
margin-left: 60px;
}
}
</style>

View File

@ -106,6 +106,7 @@ export default {
<style lang="less" scoped> <style lang="less" scoped>
.autocomplete-normal-demo { .autocomplete-normal-demo {
display: flex; display: flex;
section + section { section + section {
margin-left: 60px; margin-left: 60px;
} }

View File

@ -0,0 +1,50 @@
<template>
<article class="autocomplete-normal-demo">
<section>
<veui-autocomplete
:datasource="suggestions"
placeholder="请输入"
suggest-trigger="focus"
strict
/>
</section>
</article>
</template>
<script>
import { Autocomplete } from 'veui'
export default {
components: {
'veui-autocomplete': Autocomplete
},
data () {
return {
suggestions: [
{
value: 'Moka'
},
{
value: 'Turkish'
},
{
value: 'latte'
},
{
value: 'cappuccino'
}
]
}
}
}
</script>
<style lang="less" scoped>
.autocomplete-normal-demo {
display: flex;
section + section {
margin-left: 60px;
}
}
</style>

View File

@ -0,0 +1,43 @@
<template>
<article>
<section>
<veui-badge type="success">
Running
</veui-badge>
<veui-badge type="info">
New
</veui-badge>
<veui-badge>
Rejected
</veui-badge>
<veui-badge type="warning">
Auditing
</veui-badge>
<veui-badge type="aux">
Expired
</veui-badge>
</section>
</article>
</template>
<script>
import { Badge } from 'veui'
export default {
components: {
'veui-badge': Badge
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 1em;
}
.veui-badge {
& + & {
margin-left: 30px;
}
}
</style>

View File

@ -0,0 +1,25 @@
<template>
<article>
<section>
<veui-calendar
date-class="custom-date"
/>
</section>
</article>
</template>
<script>
import { Calendar } from 'veui'
export default {
components: {
'veui-calendar': Calendar
}
}
</script>
<style lang="less">
.custom-date {
font-style: italic;
}
</style>

View File

@ -0,0 +1,27 @@
<template>
<article>
<section>
<h4>只允许选未来的日期</h4>
<veui-calendar :disabled-date="disabledDate"/>
</section>
</article>
</template>
<script>
import { Calendar } from 'veui'
export default {
components: {
'veui-calendar': Calendar
},
created () {
this.now = new Date()
this.now.setHours(0, 0, 0, 0)
},
methods: {
disabledDate (date) {
return this.now.getTime() > date.getTime()
}
}
}
</script>

View File

@ -0,0 +1,31 @@
<template>
<article>
<p>
fill-month: <veui-switch v-model="isFill"/>
</p>
<veui-calendar :fill-month="isFill"/>
</article>
</template>
<script>
import { Calendar, Switch } from 'veui'
export default {
components: {
'veui-calendar': Calendar,
'veui-switch': Switch
},
data () {
return {
date: new Date(),
isFill: true
}
}
}
</script>
<style lang="less" scoped>
.veui-radio-group {
margin-bottom: 20px;
}
</style>

View File

@ -0,0 +1,37 @@
<template>
<article>
<veui-radio-group
v-model="type"
:items="types"
/>
<veui-calendar :type="type"/>
</article>
</template>
<script>
import { Calendar, RadioGroup } from 'veui'
export default {
components: {
'veui-calendar': Calendar,
'veui-radio-group': RadioGroup
},
data () {
return {
date: new Date(),
type: 'date',
types: [
{ label: 'date', value: 'date' },
{ label: 'month', value: 'month' },
{ label: 'year', value: 'year' }
]
}
}
}
</script>
<style lang="less" scoped>
.veui-radio-group {
margin-bottom: 20px;
}
</style>

View File

@ -11,7 +11,7 @@
v-model="indicatorPosition" v-model="indicatorPosition"
:items="positions" :items="positions"
/> />
<h4>Indicator alignment</h4> <h4>Indicator align</h4>
<veui-radio-group <veui-radio-group
v-model="align" v-model="align"
:items="alignments" :items="alignments"
@ -31,8 +31,6 @@
<script> <script>
import { Carousel, RadioGroup } from 'veui' import { Carousel, RadioGroup } from 'veui'
// TODO update alignment
export default { export default {
components: { components: {
'veui-carousel': Carousel, 'veui-carousel': Carousel,

View File

@ -0,0 +1,57 @@
<template>
<article>
<section>
<h4> `2/1` 比例展示轮播项</h4>
<veui-carousel
:datasource="items"
effect="slide"
indicator-align="end"
slide-aspect-ratio="2/1"
/>
</section>
</article>
</template>
<script>
import { Carousel } from 'veui'
export default {
components: {
'veui-carousel': Carousel
},
data () {
return {
items: [
{
src:
'https://ecmb.bdimg.com/public01/one-design/2b77cc4a4c5c906993c0e512f3ddaf03.jpg',
alt: 'A cute kitty looking at you with its greenish eyes.',
label: 'Cat'
},
{
src:
'https://ecmb.bdimg.com/public01/one-design/6fedc62b9221846ce5114c7447622e47.jpeg',
alt: 'A common kingfisher flying above river.',
label: 'Kingfisher'
},
{
src:
'https://ecmb.bdimg.com/public01/one-design/e1b6473c898d9e456452ee79d7533a86.jpeg',
alt: 'A white and gray dolphin in blue water.',
label: 'Dolphin'
}
]
}
}
}
</script>
<style lang="less" scoped docs>
h4 {
margin: 0 0 10px;
}
section {
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,144 @@
<template>
<article>
<section>
<veui-radio-group
v-model="trigger"
:items="triggers"
/>
<veui-cascader
:column-trigger="trigger"
:options="options"
/>
</section>
</article>
</template>
<script>
import { Cascader, RadioGroup } from 'veui'
const options = [
{
label: '浙江',
value: '浙江',
options: [
{
label: '威海',
value: '威海'
},
{
label: '滨州',
value: '滨州'
},
{
label: '临沂',
value: '临沂'
},
{
label: '东营',
value: '东营'
},
{
label: '济南',
value: '济南'
}
]
},
{
label: '山东',
value: '山东',
options: [
{
label: '菏泽',
value: '菏泽',
options: [
{
label: '菏泽1',
value: '菏泽1'
}
]
},
{
label: '潍坊',
value: '潍坊',
options: [
{
label: '潍坊1',
value: '潍坊1'
}
]
},
{
label: '泰山',
value: '泰山'
},
{
label: '烟台',
value: '烟台'
},
{
label: '华山',
value: '华山'
},
{
label: '衡山',
value: '衡山'
},
{
label: '嵩山',
value: '嵩山'
},
{
label: '恒山',
value: '恒山'
},
{
label: '大雪山',
value: '大雪山'
}
]
},
{
label: '上海',
value: '上海',
disabled: true
},
{
label: '北京',
value: '北京'
},
{
label: '海外',
value: '海外',
disabled: true,
options: [
{
label: '日本',
value: '日本'
}
]
}
]
export default {
components: {
'veui-cascader': Cascader,
'veui-radio-group': RadioGroup
},
data () {
return {
trigger: 'click',
triggers: [
{ label: 'click', value: 'click' },
{ label: 'hover', value: 'hover' }
],
options
}
}
}
</script>
<style lang="less" scoped>
.veui-radio-group {
margin-bottom: 20px;
}
</style>

View File

@ -0,0 +1,144 @@
<template>
<article>
<section>
<veui-radio-group
v-model="selectMode"
:items="selectModes"
/>
<veui-cascader
:select-mode="selectMode"
:options="options"
/>
</section>
</article>
</template>
<script>
import { Cascader, RadioGroup } from 'veui'
const options = [
{
label: '浙江',
value: '浙江',
options: [
{
label: '威海',
value: '威海'
},
{
label: '滨州',
value: '滨州'
},
{
label: '临沂',
value: '临沂'
},
{
label: '东营',
value: '东营'
},
{
label: '济南',
value: '济南'
}
]
},
{
label: '山东',
value: '山东',
options: [
{
label: '菏泽',
value: '菏泽',
options: [
{
label: '菏泽1',
value: '菏泽1'
}
]
},
{
label: '潍坊',
value: '潍坊',
options: [
{
label: '潍坊1',
value: '潍坊1'
}
]
},
{
label: '泰山',
value: '泰山'
},
{
label: '烟台',
value: '烟台'
},
{
label: '华山',
value: '华山'
},
{
label: '衡山',
value: '衡山'
},
{
label: '嵩山',
value: '嵩山'
},
{
label: '恒山',
value: '恒山'
},
{
label: '大雪山',
value: '大雪山'
}
]
},
{
label: '上海',
value: '上海',
disabled: true
},
{
label: '北京',
value: '北京'
},
{
label: '海外',
value: '海外',
disabled: true,
options: [
{
label: '日本',
value: '日本'
}
]
}
]
export default {
components: {
'veui-cascader': Cascader,
'veui-radio-group': RadioGroup
},
data () {
return {
selectMode: 'any',
selectModes: [
{ label: 'any', value: 'any' },
{ label: 'leaf-only', value: 'leaf-only' }
],
options
}
}
}
</script>
<style lang="less" scoped>
.veui-radio-group {
margin-bottom: 20px;
}
</style>

View File

@ -0,0 +1,144 @@
<template>
<article>
<section>
<veui-radio-group
v-model="valueDisplay"
:items="valueDisplays"
/>
<veui-cascader
:value-display="valueDisplay"
:options="options"
/>
</section>
</article>
</template>
<script>
import { Cascader, RadioGroup } from 'veui'
const options = [
{
label: '浙江',
value: '浙江',
options: [
{
label: '威海',
value: '威海'
},
{
label: '滨州',
value: '滨州'
},
{
label: '临沂',
value: '临沂'
},
{
label: '东营',
value: '东营'
},
{
label: '济南',
value: '济南'
}
]
},
{
label: '山东',
value: '山东',
options: [
{
label: '菏泽',
value: '菏泽',
options: [
{
label: '菏泽1',
value: '菏泽1'
}
]
},
{
label: '潍坊',
value: '潍坊',
options: [
{
label: '潍坊1',
value: '潍坊1'
}
]
},
{
label: '泰山',
value: '泰山'
},
{
label: '烟台',
value: '烟台'
},
{
label: '华山',
value: '华山'
},
{
label: '衡山',
value: '衡山'
},
{
label: '嵩山',
value: '嵩山'
},
{
label: '恒山',
value: '恒山'
},
{
label: '大雪山',
value: '大雪山'
}
]
},
{
label: '上海',
value: '上海',
disabled: true
},
{
label: '北京',
value: '北京'
},
{
label: '海外',
value: '海外',
disabled: true,
options: [
{
label: '日本',
value: '日本'
}
]
}
]
export default {
components: {
'veui-cascader': Cascader,
'veui-radio-group': RadioGroup
},
data () {
return {
valueDisplay: 'simple',
valueDisplays: [
{ label: 'simple', value: 'simple' },
{ label: 'complete', value: 'complete' }
],
options
}
}
}
</script>
<style lang="less" scoped>
.veui-radio-group {
margin-bottom: 20px;
}
</style>

View File

@ -0,0 +1,50 @@
<template>
<article>
<section>
<veui-check-button-group
v-model="flavor"
:items="flavors"
/>
</section>
<section>
<veui-check-button-group
v-model="flavor"
:items="flavors"
>
<template #desc="{ desc, label }">
{{ desc || `a description for ${label}` }}
</template>
</veui-check-button-group>
</section>
</article>
</template>
<script>
import { CheckButtonGroup } from 'veui'
export default {
components: {
'veui-check-button-group': CheckButtonGroup
},
data () {
return {
flavor: null,
flavors: [
{ value: 'LATTE', label: 'Latte', desc: 'a description for latte.' },
{ value: 'MOCHA', label: 'Mocha', desc: 'a description for mocha.' },
{ value: 'AMERICANO', label: 'Americano' }
]
}
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 20px;
}
h4 {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,60 @@
<template>
<article>
<section>
<veui-check-button-group
v-model="selected"
ui="simple"
:items="sizes"
/>
<p>Checked: {{ readable }}</p>
</section>
</article>
</template>
<script>
import { CheckButtonGroup } from 'veui'
export default {
components: {
'veui-check-button-group': CheckButtonGroup
},
data () {
return {
selected: ['any'],
sizes: [
{
label: 'Any',
value: 'any'
},
{
label: 'Small',
value: 'sm'
},
{
label: 'Medium',
value: 'md'
},
{
label: 'Large',
value: 'lg'
}
]
}
},
computed: {
readable () {
return (this.selected || []).join(', ') || '-'
}
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 20px;
}
h4 {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,46 @@
<template>
<article>
<section>
<p>
最小宽度<veui-switch v-model="isStable"/>
</p>
<veui-check-button-group
v-model="flavor"
:items="flavors"
:ui="isStable ? 'stable' : ''"
/>
</section>
</article>
</template>
<script>
import { CheckButtonGroup, Switch } from 'veui'
export default {
components: {
'veui-check-button-group': CheckButtonGroup,
'veui-switch': Switch
},
data () {
return {
isStable: true,
flavor: null,
flavors: [
{ value: 'LATTE', label: 'Latte' },
{ value: 'MOCHA', label: 'Mocha' },
{ value: 'AMERICANO', label: 'Americano' }
]
}
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 20px;
}
h4 {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,50 @@
<template>
<article>
<section>
<veui-checkbox-group
v-model="flavor"
:items="flavors"
/>
</section>
<section>
<veui-checkbox-group
v-model="flavor"
:items="flavors"
>
<template #desc="{ desc, label }">
{{ desc || `a description for ${label}` }}
</template>
</veui-checkbox-group>
</section>
</article>
</template>
<script>
import { CheckboxGroup } from 'veui'
export default {
components: {
'veui-checkbox-group': CheckboxGroup
},
data () {
return {
flavor: null,
flavors: [
{ value: 'LATTE', label: 'Latte', desc: 'a description for latte.' },
{ value: 'MOCHA', label: 'Mocha', desc: 'a description for mocha.' },
{ value: 'AMERICANO', label: 'Americano' }
]
}
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 20px;
}
h4 {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,45 @@
<template>
<article>
<section>
<h4>Disabled</h4>
<veui-date-picker
v-model="date"
disabled
placeholder="disabled"
/>
</section>
<section>
<h4>Readonly</h4>
<veui-date-picker
v-model="date"
readonly
placeholder="readonly"
/>
</section>
</article>
</template>
<script>
import { DatePicker } from 'veui'
export default {
components: {
'veui-date-picker': DatePicker
},
data () {
return {
date: new Date()
}
}
}
</script>
<style lang="less" scoped>
section:not(:last-child) {
margin-bottom: 20px;
}
h4 {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,31 @@
<template>
<article>
<section>
<p>
composition: <veui-switch v-model="composition"/>
</p>
<p>Input value: {{ value }}</p>
<veui-input
v-model="value"
:composition="composition"
/>
</section>
</article>
</template>
<script>
import { Input, Switch } from 'veui'
export default {
components: {
'veui-input': Input,
'veui-switch': Switch
},
data () {
return {
composition: true,
value: ''
}
}
}
</script>

View File

@ -0,0 +1,33 @@
<template>
<article>
<section>
<p class="respect-whitespace">Input value: `{{ value }}`</p>
<veui-input
v-model="value"
trim
/>
</section>
</article>
</template>
<script>
import { Input } from 'veui'
export default {
components: {
'veui-input': Input
},
data () {
return {
composition: true,
value: ''
}
}
}
</script>
<style scoped>
.respect-whitespace {
white-space: pre;
}
</style>

View File

@ -0,0 +1,87 @@
<template>
<article>
<section>
<veui-nav :items="items"/>
</section>
</article>
</template>
<script>
import { Nav } from 'veui'
export default {
name: 'veui-nav-demo',
components: {
'veui-nav': Nav
},
data () {
let items = [
{
label: 'Group One',
name: 'group-one',
position: 'card',
children: [
{
label: 'Sub One',
name: 'sub-one',
children: [
{
label: 'Input',
to: '/components/input'
}
]
},
{
label: 'Loading',
name: 'Loading',
to: '/components/loading',
children: [
{
label: 'Switch',
to: '/components/switch'
}
]
}
]
},
{
label: 'Button',
name: 'Button',
to: '/components/button',
children: [
{
label: 'Disabled',
name: 'Disabled',
disabled: true,
children: [
{
label: 'Link',
name: 'Link',
to: '/components/link'
}
]
}
]
},
{
label: 'Navigation Three',
name: 'nav-three',
disabled: true
},
{
label: 'Navigation Four',
name: 'nav-four',
children: [
{
label: 'Progress',
to: '/components/progress'
}
]
}
]
return {
items
}
}
}
</script>

View File

@ -0,0 +1,95 @@
<template>
<article>
<section>
<veui-nav
class="more-nav-items"
:items="items"
/>
</section>
</article>
</template>
<script>
import { Nav } from 'veui'
export default {
name: 'veui-nav-demo',
components: {
'veui-nav': Nav
},
data () {
let items = [
{
label: 'Group One',
name: 'group-one',
children: [
{
label: 'Sub One',
name: 'sub-one',
children: [
{
label: 'Input',
to: '/components/input'
}
]
},
{
label: 'Loading',
name: 'Loading',
to: '/components/loading',
children: [
{
label: 'Switch',
to: '/components/switch'
}
]
}
]
},
{
label: 'Button',
name: 'Button',
to: '/components/button',
children: [
{
label: 'Disabled',
name: 'Disabled',
disabled: true,
children: [
{
label: 'Link',
name: 'Link',
to: '/components/link'
}
]
}
]
},
{
label: 'Navigation Three',
name: 'nav-three',
disabled: true
},
{
label: 'Navigation Four',
name: 'nav-four',
children: [
{
label: 'Progress',
to: '/components/progress'
}
]
}
]
return {
items
}
}
}
</script>
<style lang="less" scoped>
.more-nav-items {
max-width: 300px;
}
</style>

View File

@ -0,0 +1,95 @@
<template>
<article>
<section>
<veui-nav
ui="s"
:items="items"
/>
</section>
<section>
<veui-nav
ui="m"
:items="items"
/>
</section>
</article>
</template>
<script>
import { Nav } from 'veui'
export default {
name: 'veui-nav-demo',
components: {
'veui-nav': Nav
},
data () {
let items = [
{
label: 'Group One',
name: 'group-one',
children: [
{
label: 'Sub One',
name: 'sub-one',
children: [
{
label: 'Input',
to: '/components/input'
}
]
},
{
label: 'Loading',
name: 'Loading',
to: '/components/loading',
children: [
{
label: 'Switch',
to: '/components/switch'
}
]
}
]
},
{
label: 'Button',
name: 'Button',
to: '/components/button',
children: [
{
label: 'Disabled',
name: 'Disabled',
disabled: true,
children: [
{
label: 'Link',
name: 'Link',
to: '/components/link'
}
]
}
]
},
{
label: 'Navigation Three',
name: 'nav-three',
disabled: true
},
{
label: 'Navigation Four',
name: 'nav-four',
children: [
{
label: 'Progress',
to: '/components/progress'
}
]
}
]
return {
items
}
}
}
</script>

View File

@ -0,0 +1,92 @@
<template>
<article>
<section>
<veui-nav
:items="items"
>
<template #item-label="{ label }">
<i>{{ label }}</i>
</template>
</veui-nav>
</section>
</article>
</template>
<script>
import { Nav } from 'veui'
export default {
name: 'veui-nav-demo',
components: {
'veui-nav': Nav
},
data () {
let items = [
{
label: 'Group One',
name: 'group-one',
children: [
{
label: 'Sub One',
name: 'sub-one',
children: [
{
label: 'Input',
to: '/components/input'
}
]
},
{
label: 'Loading',
name: 'Loading',
to: '/components/loading',
children: [
{
label: 'Switch',
to: '/switch'
}
]
}
]
},
{
label: 'Button',
name: 'Button',
to: '/components/button',
children: [
{
label: 'Disabled',
name: 'Disabled',
disabled: true,
children: [
{
label: 'Link',
name: 'Link',
to: '/link'
}
]
}
]
},
{
label: 'Navigation Three',
name: 'nav-three',
disabled: true
},
{
label: 'Navigation Four',
name: 'nav-four',
children: [
{
label: 'Progress',
to: '/components/progress'
}
]
}
]
return {
items
}
}
}
</script>

View File

@ -0,0 +1,28 @@
<template>
<article>
<section>
<h4>精确2位小数,递增0.01</h4>
<veui-number-input
:decimal-place="2"
:step="0.01"
/>
</section>
<section>
<h4>精确2位小数,递增0.1</h4>
<veui-number-input
:decimal-place="2"
:step="0.1"
/>
</section>
</article>
</template>
<script>
import { NumberInput } from 'veui'
export default {
components: {
'veui-number-input': NumberInput
}
}
</script>

View File

@ -0,0 +1,55 @@
<template>
<article>
<veui-pagination
:page="page"
:page-size="pageSize"
:page-sizes="pageSizes"
:total="total"
:to="to"
@pagesizechange="handlePageSizeChange"
/>
</article>
</template>
<script>
import { Pagination } from 'veui'
export default {
components: {
'veui-pagination': Pagination
},
data () {
return {
to: './pagination?page=:page',
total: 10101,
pageSize: 20,
pageSizes: [20, 30, 50, 100]
}
},
computed: {
page () {
return Number(this.$route.query.page) || 1
}
},
methods: {
handlePageSizeChange (size) {
this.pageSize = size
if (this.page !== 1) {
this.$router.push({
path: './pagination?page=1'
})
}
}
}
}
</script>
<style lang="less" scoped>
article {
text-align: right;
}
.veui-pagination {
margin: 1.2em 0;
}
</style>

View File

@ -4,6 +4,7 @@
<veui-number-input <veui-number-input
v-model="value" v-model="value"
:min="0" :min="0"
:decimal-place="1"
:max="100" :max="100"
/> />
</section> </section>
@ -59,7 +60,7 @@ export default {
type: 'bar', type: 'bar',
value: 66.6, value: 66.6,
desc: true, desc: true,
autoSucceed: true, autoSucceed: 200,
indeterminate: false indeterminate: false
} }
} }

View File

@ -0,0 +1,50 @@
<template>
<article>
<section>
<veui-radio-button-group
v-model="flavor"
:items="flavors"
/>
</section>
<section>
<veui-radio-button-group
v-model="flavor"
:items="flavors"
>
<template #desc="{ desc, label }">
{{ desc || `a description for ${label}` }}
</template>
</veui-radio-button-group>
</section>
</article>
</template>
<script>
import { RadioButtonGroup } from 'veui'
export default {
components: {
'veui-radio-button-group': RadioButtonGroup
},
data () {
return {
flavor: null,
flavors: [
{ value: 'LATTE', label: 'Latte', desc: 'a description for latte.' },
{ value: 'MOCHA', label: 'Mocha', desc: 'a description for mocha.' },
{ value: 'AMERICANO', label: 'Americano' }
]
}
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 20px;
}
h4 {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,53 @@
<template>
<article>
<section>
<veui-radio-button-group
v-model="flavor"
ui="simple"
:items="flavors"
/>
<p>Selected: {{ readable }}</p>
</section>
</article>
</template>
<script>
import { RadioButtonGroup } from 'veui'
export default {
components: {
'veui-radio-button-group': RadioButtonGroup
},
data () {
return {
flavor: null,
flavors: [
{ value: 'LATTE', label: 'Latte' },
{ value: 'MOCHA', label: 'Mocha' },
{ value: 'AMERICANO', label: 'Americano' }
]
}
},
computed: {
flavorLabelMap () {
return this.flavors.reduce((map, { value, label }) => {
map[value] = label
return map
}, {})
},
readable () {
return this.flavorLabelMap[this.flavor] || '-'
}
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 20px;
}
h4 {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,46 @@
<template>
<article>
<section>
<p>
最小宽度<veui-switch v-model="isStable"/>
</p>
<veui-radio-button-group
v-model="flavor"
:items="flavors"
:ui="isStable ? 'stable' : ''"
/>
</section>
</article>
</template>
<script>
import { RadioButtonGroup, Switch } from 'veui'
export default {
components: {
'veui-radio-button-group': RadioButtonGroup,
'veui-switch': Switch
},
data () {
return {
isStable: true,
flavor: null,
flavors: [
{ value: 'LATTE', label: 'Latte' },
{ value: 'MOCHA', label: 'Mocha' },
{ value: 'AMERICANO', label: 'Americano' }
]
}
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 20px;
}
h4 {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,50 @@
<template>
<article>
<section>
<veui-radio-group
v-model="flavor"
:items="flavors"
/>
</section>
<section>
<veui-radio-group
v-model="flavor"
:items="flavors"
>
<template #desc="{ desc, label }">
{{ desc || `a description for ${label}` }}
</template>
</veui-radio-group>
</section>
</article>
</template>
<script>
import { RadioGroup } from 'veui'
export default {
components: {
'veui-radio-group': RadioGroup
},
data () {
return {
flavor: null,
flavors: [
{ value: 'LATTE', label: 'Latte', desc: 'a description for latte.' },
{ value: 'MOCHA', label: 'Mocha', desc: 'a description for mocha.' },
{ value: 'AMERICANO', label: 'Americano' }
]
}
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 20px;
}
h4 {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,81 @@
<template>
<article>
<section>
<h4>下拉关闭时省略显示已选项</h4>
<veui-select
v-model="license"
multiple
:options="options"
>
<template
#label="{ selected }"
>{{ selected[0].label }}{{ selected.length }}{{ ' ' }}</template>
</veui-select>
</section>
<section>
<h4>始终省略显示已选项</h4>
<veui-select
v-model="license"
multiple
:options="options"
>
<template
#selected="{ selected }"
>{{ selected[0].label
}}{{ selected.length > 1 ? `${selected.length}` : '' }}</template>
</veui-select>
</section>
</article>
</template>
<script>
import { Select } from 'veui'
export default {
components: {
'veui-select': Select
},
data () {
return {
searchable: false,
license: null,
options: [
{
label: 'MIT',
value: 'mit'
},
{
label: 'BSD',
value: 'bsd'
},
{
label: 'Apache 2.0',
value: 'apache2'
},
{
label: 'GPL 3.0',
value: 'gpl3'
},
{
label: 'AGPL 3.0',
value: 'agpl3'
},
{
label: 'LGPL 2.1',
value: 'lgpl2'
},
{
label: 'MPL 2.0',
value: 'mpl2'
}
]
}
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 1em;
}
</style>

View File

@ -25,7 +25,7 @@
title="Bid" title="Bid"
width="160" width="160"
align="right" align="right"
:filter-value="filtered" :filter-value="filtered || null"
> >
<template #default="{ bid }"> <template #default="{ bid }">
{{ bid | currency }} {{ bid | currency }}
@ -111,7 +111,7 @@ export default {
} }
], ],
crowded: false, crowded: false,
filtered: false filtered: null
} }
}, },
computed: { computed: {

View File

@ -0,0 +1,93 @@
<template>
<article>
<section>
<p>loading<veui-switch v-model="loading"/></p>
<veui-table
:data="data"
:loading="loading"
key-field="id"
>
<veui-table-column
field="id"
title="ID"
sortable
/>
<veui-table-column
field="name"
title="Name"
/>
<veui-table-column
field="bid"
title="Bid"
width="160"
align="right"
sortable
>
<template slot-scope="{ bid }">
{{ bid | currency }}
</template>
</veui-table-column>
</veui-table>
</section>
</article>
</template>
<script>
import { Table, Column, Switch } from 'veui'
let data = [
{
id: '31552',
name: 'Thor Odinson',
bid: 598,
updateDate: '20140214'
},
{
id: '31541',
name: 'Steve Rogers',
bid: 1024,
updateDate: '20131117'
},
{
id: '31563',
name: 'Tony Stark',
bid: 820,
updateDate: '20170610'
},
{
id: '31574',
name: 'Stephen Strange',
bid: 736,
updateDate: '20180109'
}
]
export default {
components: {
'veui-table': Table,
'veui-table-column': Column,
'veui-switch': Switch
},
filters: {
currency (value) {
return '¥' + value.toFixed(2)
}
},
data () {
return {
data,
loading: true
}
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 20px;
}
h4 {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,132 @@
<template>
<article>
<section>
<p>
允许不排序<veui-switch
v-model="allowFalse"
@change="handleChange"
/>
</p>
<veui-table
:data="sorted"
key-field="id"
:order="order"
:order-by="orderBy"
:allowed-orders="allowedOrders"
@sort="handleSort"
>
<veui-table-column
field="id"
title="ID"
sortable
/>
<veui-table-column
field="name"
title="Name"
/>
<veui-table-column
field="bid"
title="Bid"
width="160"
align="right"
sortable
>
<template slot-scope="{ bid }">
{{ bid | currency }}
</template>
</veui-table-column>
</veui-table>
</section>
</article>
</template>
<script>
import { Table, Column, Switch } from 'veui'
let data = [
{
id: '31552',
name: 'Thor Odinson',
bid: 598,
updateDate: '20140214'
},
{
id: '31541',
name: 'Steve Rogers',
bid: 1024,
updateDate: '20131117'
},
{
id: '31563',
name: 'Tony Stark',
bid: 820,
updateDate: '20170610'
},
{
id: '31574',
name: 'Stephen Strange',
bid: 736,
updateDate: '20180109'
}
]
let allowedOrders = [false, 'desc', 'asc']
export default {
components: {
'veui-table': Table,
'veui-table-column': Column,
'veui-switch': Switch
},
filters: {
currency (value) {
return '¥' + value.toFixed(2)
}
},
data () {
return {
order: 'asc',
orderBy: 'id',
allowFalse: true
}
},
computed: {
sorted () {
let result = data.slice(0)
if (this.order) {
const sign = this.order === 'desc' ? -1 : 1
result.sort((a, b) => {
return sign * (+a[this.orderBy] - +b[this.orderBy])
})
}
return result
},
allowedOrders () {
let result = allowedOrders.slice(0)
return this.allowFalse ? result : result.filter(item => item)
}
},
methods: {
handleSort (field, order) {
this.order = order
this.orderBy = field
},
handleChange (val) {
// 便
if (!val && !this.order) {
this.order = 'desc'
}
}
}
}
</script>
<style lang="less" scoped>
section {
margin-bottom: 20px;
}
h4 {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,26 @@
<template>
<article>
<div>
<veui-textarea
v-model="value"
autoresize
line-number
/>
</div>
</article>
</template>
<script>
import { Textarea } from 'veui'
export default {
components: {
'veui-textarea': Textarea
},
data () {
return {
value: 'Autoresize'
}
}
}
</script>

View File

@ -0,0 +1,200 @@
<template>
<article>
<section>
<veui-radio-group
v-model="mergeChecked"
:items="items"
/>
<veui-transfer
v-model="selected"
:datasource="coffees"
:merge-checked="mergeChecked"
/>
<p>Selected: {{ selected }}</p>
</section>
</article>
</template>
<script>
import { Transfer, RadioGroup } from 'veui'
export default {
components: {
'veui-transfer': Transfer,
'veui-radio-group': RadioGroup
},
data () {
return {
coffees: [
{
label: 'Infused',
value: 'infused',
id: '100',
children: [
{
label: 'Brewed',
value: 'brewed',
id: '100-01',
children: [
{
label: 'Drip brewed',
value: 'drip-brewed',
id: '100-01-01'
},
{
label: 'Filtered',
value: 'filtered',
id: '100-01-02'
},
{
label: 'Pour-over',
value: 'pour-over',
id: '100-01-03'
},
{
label: 'Immersion brewed',
value: 'immersion-brewed',
id: '100-01-04'
}
]
},
{
label: 'French press',
value: 'french-press',
id: '100-02'
},
{
label: 'Cold brew',
value: 'cold-brew',
id: '100-03'
}
]
},
{
label: 'Boiled',
value: 'boiled',
id: '200',
children: [
{
label: 'Percolated',
value: 'percolated',
id: '200-01'
},
{
label: 'Turkish',
value: 'turkish',
id: '200-02'
},
{
label: 'Moka',
value: 'moka',
id: '200-03'
}
]
},
{
label: 'Espresso',
value: 'espresso',
id: '300',
children: [
{
label: 'Caffè Americano',
value: 'caffe-americano',
id: '300-01'
},
{
label: 'Cafe Lungo',
value: 'cafe-lungo',
id: '300-02'
},
{
label: 'Café Cubano',
value: 'cafe-cubano',
id: '300-03'
},
{
label: 'Caffè crema',
value: 'caffe-crema',
id: '300-04'
},
{
label: 'Cafe Zorro',
value: 'cafe-zorro',
id: '300-05'
},
{
label: 'Doppio',
value: 'doppio',
id: '300-06'
},
{
label: 'Espresso Romano',
value: 'espresso-romano',
id: '300-07'
},
{
label: 'Guillermo',
value: 'guillermo',
id: '300-08'
},
{
label: 'Ristretto',
value: 'ristretto',
id: '300-09'
}
]
},
{
label: 'Milk coffee',
value: 'milk-coffee',
id: '400',
children: [
{
label: 'Flat white',
value: 'flat-white',
id: '400-01'
},
{
label: 'Latte',
value: 'latte',
id: '400-02'
},
{
label: 'Macchiato',
value: 'macchiato',
id: '400-03'
},
{
label: 'Cappuccino',
value: 'cappuccino',
id: '400-04'
},
{
label: 'White coffee',
value: 'white-coffee',
id: '400-05'
}
]
}
],
mergeChecked: 'keep-all',
selected: []
}
},
computed: {
items () {
return [
{ label: 'keep-all', value: 'keep-all' },
{ label: 'downwards', value: 'downwards' },
{ label: 'upwards', value: 'upwards' }
]
}
}
}
</script>
<style lang="less" scoped>
.veui-radio-group {
margin-bottom: 20px;
}
</style>

View File

@ -0,0 +1,57 @@
<template>
<article>
<section>
<veui-uploader
v-model="images"
:controls="controls"
type="image"
action="https://app.fakejson.com/q/ELymQ7xh?token=AWFkjMICPSAB_bO_z-Lnog"
@star="handleStar"
/>
</section>
</article>
</template>
<script>
import { Uploader, toast } from 'veui'
import 'veui-theme-dls-icons/star'
export default {
components: {
'veui-uploader': Uploader
},
data () {
return {
images: [
{
key: 0,
src: '/images/development/uploader/demo-image1.jpg'
},
{
key: 1,
src: '/images/development/uploader/demo-image2.jpg'
}
],
controls (item, defaultControls) {
return [
...defaultControls,
{
name: 'star',
icon: 'star',
label: 'star'
}
]
}
}
},
methods: {
handleStar () {
toast.info('You click star!')
}
}
}
</script>
<docs>
`controls` 自定义的操作点击会触发同名事件事件参数为该上传项数据和 `status` 字段, 即通常是 `{src, key, type, status, ...}`
</docs>

View File

@ -30,9 +30,11 @@ export default {
action: 'https://app.fakejson.com/q/ELymQ7xh?token=AWFkjMICPSAB_bO_z-Lnog', action: 'https://app.fakejson.com/q/ELymQ7xh?token=AWFkjMICPSAB_bO_z-Lnog',
images: [ images: [
{ {
key: 0,
src: '/images/development/uploader/demo-image1.jpg' src: '/images/development/uploader/demo-image1.jpg'
}, },
{ {
key: 1,
src: '/images/development/uploader/demo-image2.jpg' src: '/images/development/uploader/demo-image2.jpg'
} }
], ],

View File

@ -0,0 +1,57 @@
<template>
<article>
<section>
<veui-uploader
v-model="images"
:entries="entries"
type="image"
action="https://app.fakejson.com/q/ELymQ7xh?token=AWFkjMICPSAB_bO_z-Lnog"
@star="handleStar"
/>
</section>
</article>
</template>
<script>
import { Uploader, toast } from 'veui'
import 'veui-theme-dls-icons/star'
export default {
components: {
'veui-uploader': Uploader
},
data () {
return {
images: [
{
key: 0,
src: '/images/development/uploader/demo-image1.jpg'
},
{
key: 1,
src: '/images/development/uploader/demo-image2.jpg'
}
],
entries (defaultEntries) {
return [
...defaultEntries,
{
name: 'star',
icon: 'star',
label: 'star'
}
]
}
}
},
methods: {
handleStar () {
toast.info('You clicked star!')
}
}
}
</script>
<docs>
`entries` 自定义的操作点击会触发同名事件事件参数为空
</docs>

View File

@ -30,11 +30,13 @@ export default {
let files = [ let files = [
{ {
name: 'demo-file1.txt', name: 'demo-file1.txt',
src: '/file/demo-file1.txt' src: '/file/demo-file1.txt',
key: 0
}, },
{ {
name: 'demo-file2.txt', name: 'demo-file2.txt',
src: '/file/demo-file2.txt' src: '/file/demo-file2.txt',
key: 1
} }
] ]
return { return {

View File

@ -39,10 +39,12 @@ export default {
data () { data () {
let images = [ let images = [
{ {
src: '/images/development/uploader/demo-image1.jpg' src: '/images/development/uploader/demo-image1.jpg',
key: 0
}, },
{ {
src: '/images/development/uploader/demo-image2.jpg' src: '/images/development/uploader/demo-image2.jpg',
key: 1
} }
] ]
return { return {

View File

@ -40,12 +40,14 @@ export default {
let media = [ let media = [
{ {
type: 'image', type: 'image',
src: '/images/development/uploader/demo-image1.jpg' src: '/images/development/uploader/demo-image1.jpg',
key: 0
}, },
{ {
type: 'video', type: 'video',
src: 'https://nadvideo2.baidu.com/5dafd8544f4f53b27a5f59b0ab780403_1920_1080.mp4', src: 'https://nadvideo2.baidu.com/5dafd8544f4f53b27a5f59b0ab780403_1920_1080.mp4',
poster: 'https://feed-image.baidu.com/0/pic/4dced79d185a16e228652b136f653dcc.jpg' poster: 'https://feed-image.baidu.com/0/pic/4dced79d185a16e228652b136f653dcc.jpg',
key: 1
} }
] ]
return { return {

View File

@ -0,0 +1,36 @@
<template>
<article>
<section>
<veui-uploader
v-model="images"
sortable
type="image"
action="https://app.fakejson.com/q/ELymQ7xh?token=AWFkjMICPSAB_bO_z-Lnog"
/>
</section>
</article>
</template>
<script>
import { Uploader } from 'veui'
export default {
components: {
'veui-uploader': Uploader
},
data () {
return {
images: [
{
key: 0,
src: '/images/development/uploader/demo-image1.jpg'
},
{
key: 1,
src: '/images/development/uploader/demo-image2.jpg'
}
]
}
}
}
</script>

View File

@ -29,10 +29,12 @@ export default {
return { return {
images: [ images: [
{ {
src: '/images/development/uploader/demo-image1.jpg' src: '/images/development/uploader/demo-image1.jpg',
key: 0
}, },
{ {
src: '/images/development/uploader/demo-image2.jpg' src: '/images/development/uploader/demo-image2.jpg',
key: 1
} }
], ],
validator (file) { validator (file) {

View File

@ -195,10 +195,6 @@
"title": "Transfer - 穿梭框", "title": "Transfer - 穿梭框",
"slug": "transfer" "slug": "transfer"
}, },
{
"title": "FilterPanel - 过滤面板",
"slug": "filter-panel"
},
{ {
"title": "Tree - 树形控件", "title": "Tree - 树形控件",
"slug": "tree" "slug": "tree"
@ -288,12 +284,12 @@
"slug": "drawer" "slug": "drawer"
}, },
{ {
"title": "Embedded - 嵌入式面板", "title": "Menu - 边栏菜单",
"slug": "embedded" "slug": "menu"
}, },
{ {
"title": "Menu - 导航菜单", "title": "Nav - 导航菜单",
"slug": "menu" "slug": "nav"
}, },
{ {
"title": "Collapse - 折叠式面板", "title": "Collapse - 折叠式面板",
@ -589,10 +585,6 @@
"title": "Transfer", "title": "Transfer",
"slug": "transfer" "slug": "transfer"
}, },
{
"title": "FilterPanel",
"slug": "filter-panel"
},
{ {
"title": "Tree", "title": "Tree",
"slug": "tree" "slug": "tree"
@ -693,11 +685,6 @@
"slug": "drawer", "slug": "drawer",
"disabled": true "disabled": true
}, },
{
"title": "Embedded",
"slug": "embedded",
"disabled": true
},
{ {
"title": "Menu", "title": "Menu",
"slug": "menu", "slug": "menu",

664
package-lock.json generated

File diff suppressed because it is too large Load Diff