diff --git a/components/cascader/demo/index.vue b/components/cascader/demo/index.vue index e69de29bb..962744e3c 100644 --- a/components/cascader/demo/index.vue +++ b/components/cascader/demo/index.vue @@ -0,0 +1,59 @@ + + diff --git a/components/cascader/index.en-US.md b/components/cascader/index.en-US.md new file mode 100644 index 000000000..1779952ac --- /dev/null +++ b/components/cascader/index.en-US.md @@ -0,0 +1,51 @@ + +## API + +````html + +```` + +| Property | Description | Type | Default | +| -------- | ----------- | ---- | ------- | +| allowClear | whether allow clear | boolean | true | +| autoFocus | get focus when component mounted | boolean | false | +| changeOnSelect | change value on each selection if set to true, see above demo for details | boolean | false | +| defaultValue | initial selected value | string\[] | \[] | +| disabled | whether disabled select | boolean | false | +| displayRender | render function of displaying selected options, you can use slot="displayRender" and slot-scope="props" | `({labels, selectedOptions}) => vNode` | `labels => labels.join(' / ')` | +| expandTrigger | expand current item when click or hover, one of 'click' 'hover' | string | 'click' | +| getPopupContainer | Parent Node which the selector should be rendered to. Default to `body`. When position issues happen, try to modify it into scrollable content and position it relative. | Function(triggerNode) | () => document.body | +| loadData | To load option lazily, and it cannot work with `showSearch` | `(selectedOptions) => void` | - | +| notFoundContent | Specify content to show when no result matches. | string | 'Not Found' | +| options | data options of cascade | object | - | +| placeholder | input placeholder | string | 'Please select' | +| popupClassName | additional className of popup overlay | string | - | +| popupStyle | additional style of popup overlay | object | {} | +| popupPlacement | use preset popup align config from builtinPlacements:`bottomLeft` `bottomRight` `topLeft` `topRight` | string | `bottomLeft` | +| popupVisible | set visible of cascader popup | boolean | - | +| showSearch | Whether show search input in single mode. | boolean\|object | false | +| size | input size, one of `large` `default` `small` | string | `default` | +| value(v-model) | selected value | string\[] | - | + +Fields in `showSearch`: + +| Property | Description | Type | Default | +| -------- | ----------- | ---- | ------- | +| filter | The function will receive two arguments, inputValue and option, if the function returns true, the option will be included in the filtered set; Otherwise, it will be excluded. | `function(inputValue, path): boolean` | | +| matchInputWidth | Whether the width of result list equals to input's | boolean | | +| render | Used to render filtered options, you can use slot="showSearchRender" and slot-scope="props" | `function({inputValue, path}): vNode` | | +| sort | Used to sort filtered options. | `function(a, b, inputValue)` | | + +### events +| Events Name | Description | Arguments | +| --- | --- | --- | +| change | callback when finishing cascader select | `(value, selectedOptions) => void` | - | +| popupVisibleChange | callback when popup shown or hidden | `(value) => void` | - | + +## Methods + +| Name | Description | +| ---- | ----------- | +| blur() | remove focus | +| focus() | get focus | + diff --git a/components/cascader/index.vue b/components/cascader/index.vue index 9c19cb61a..ba7f3d8d6 100644 --- a/components/cascader/index.vue +++ b/components/cascader/index.vue @@ -122,7 +122,7 @@ export default { ]) }, - defaultRenderFilteredOption (inputValue, path, prefixCls) { + defaultRenderFilteredOption ({ inputValue, path, prefixCls }) { return path.map(({ label }, index) => { const node = label.indexOf(inputValue) > -1 ? this.highlightKeyword(label, inputValue, prefixCls) : label @@ -222,12 +222,13 @@ export default { }, generateFilteredOptions (prefixCls) { - const { showSearch, notFoundContent, flattenOptions, inputValue } = this + const { showSearch, notFoundContent, flattenOptions, inputValue, $scopedSlots } = this const { filter = defaultFilterOption, - render = this.defaultRenderFilteredOption, + // render = this.defaultRenderFilteredOption, sort = defaultSortFilteredOption, } = showSearch + const render = showSearch.render || $scopedSlots.showSearchRender || this.defaultRenderFilteredOption const filtered = flattenOptions.filter((path) => filter(inputValue, path)) .sort((a, b) => sort(a, b, inputValue)) @@ -236,7 +237,7 @@ export default { return { __IS_FILTERED_OPTION: true, path, - label: render(inputValue, path, prefixCls), + label: render({ inputValue, path, prefixCls }), value: path.map((o) => o.value), disabled: path.some((o) => o.disabled), } diff --git a/components/cascader/index.zh-CN.md b/components/cascader/index.zh-CN.md new file mode 100644 index 000000000..56ee384ee --- /dev/null +++ b/components/cascader/index.zh-CN.md @@ -0,0 +1,52 @@ + +## API + +````html + +```` + +| 参数 | 说明 | 类型 | 默认值 | +| --- | --- | --- | --- | +| allowClear | 是否支持清除 | boolean | true | +| autoFocus | 自动获取焦点 | boolean | false | +| changeOnSelect | 当此项为 true 时,点选每级菜单选项值都会发生变化,具体见上面的演示 | boolean | false | +| defaultValue | 默认的选中项 | string\[] | \[] | +| disabled | 禁用 | boolean | false | +| displayRender | 选择后展示的渲染函数,可使用slot="displayRender" 和 slot-scope="props" | `({labels, selectedOptions}) => vNode` | `labels => labels.join(' / ')` | +| expandTrigger | 次级菜单的展开方式,可选 'click' 和 'hover' | string | 'click' | +| getPopupContainer | 菜单渲染父节点。默认渲染到 body 上,如果你遇到菜单滚动定位问题,试试修改为滚动的区域,并相对其定位。 | Function(triggerNode) | () => document.body | +| loadData | 用于动态加载选项,无法与 `showSearch` 一起使用 | `(selectedOptions) => void` | - | +| notFoundContent | 当下拉列表为空时显示的内容 | string | 'Not Found' | +| options | 可选项数据源 | object | - | +| placeholder | 输入框占位文本 | string | '请选择' | +| popupClassName | 自定义浮层类名 | string | - | +| popupStyle | 自定义浮层样式 | object | {} | +| popupPlacement | 浮层预设位置:`bottomLeft` `bottomRight` `topLeft` `topRight` | Enum | `bottomLeft` | +| popupVisible | 控制浮层显隐 | boolean | - | +| showSearch | 在选择框中显示搜索框 | boolean | false | +| size | 输入框大小,可选 `large` `default` `small` | string | `default` | +| value(v-model) | 指定选中项 | string\[] | - | + +`showSearch` 为对象时,其中的字段: + +| 参数 | 说明 | 类型 | 默认值 | +| --- | --- | --- | --- | +| filter | 接收 `inputValue` `path` 两个参数,当 `path` 符合筛选条件时,应返回 true,反之则返回 false。 | `function(inputValue, path): boolean` | | +| matchInputWidth | 搜索结果列表是否与输入框同宽 | boolean | | +| render | 用于渲染 filter 后的选项,可使用slot="showSearchRender" 和 slot-scope="props" | `function({inputValue, path}): vNode` | | +| sort | 用于排序 filter 后的选项 | `function(a, b, inputValue)` | | + +### 事件 +| 事件名称 | 说明 | 回调参数 | +| --- | --- | --- | +| change | 选择完成后的回调 | `(value, selectedOptions) => void` | - | +| popupVisibleChange | 显示/隐藏浮层的回调 | `(value) => void` | - | + +## 方法 + +| 名称 | 描述 | +| --- | --- | +| blur() | 移除焦点 | +| focus() | 获取焦点 | + +> 注意,如果需要获得中国省市区数据,可以参考react组件的实现 [china-division](https://gist.github.com/afc163/7582f35654fd03d5be7009444345ea17)。 diff --git a/examples/demo.js b/examples/demo.js index 00f3ce5e2..827f1e981 100644 --- a/examples/demo.js +++ b/examples/demo.js @@ -26,4 +26,5 @@ export { default as spin } from 'antd/spin/demo/index.vue' export { default as switch } from 'antd/switch/demo/index.vue' export { default as autoComplete } from 'antd/auto-complete/demo/index.vue' export { default as affix } from 'antd/Affix/demo/index.vue' +export { default as cascader } from 'antd/cascader/demo/index.vue'