- {views}
- {!views.length &&
}
+
+
+
+ {views}
+ {!views.length && }
+
+ {hoveredOption?.[selectInfoKey] && (
+
+
{hoveredOption.label || hoveredOption.value}
+
{hoveredOption?.[selectInfoKey]}
+
+ )}
);
From ea348b1157b49d4fff489659e7a0cea0527a9522 Mon Sep 17 00:00:00 2001
From: "liyuan.meng" <13149260506@163.com>
Date: Mon, 30 Jun 2025 16:54:00 +0800
Subject: [PATCH 2/7] =?UTF-8?q?feat:=20[Select]=20=E9=BC=A0=E6=A0=87?=
=?UTF-8?q?=E6=82=AC=E6=B5=AE=E4=B8=8B=E6=8B=89=E9=80=89=E9=A1=B9=E6=97=B6?=
=?UTF-8?q?=EF=BC=8C=E5=8F=B3=E4=BE=A7=E4=B8=8B=E6=8B=89=E9=80=89=E9=A1=B9?=
=?UTF-8?q?=E9=87=8A=E4=B9=89=E9=9D=A2=E6=9D=BF=E4=B8=8D=E6=B6=88=E5=A4=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/select/index.js | 2 ++
src/components/select/views/select/multi-select.js | 13 +++++++------
src/components/select/views/select/single-select.js | 13 +++++++------
3 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/src/components/select/index.js b/src/components/select/index.js
index 6e111df0..646d30ac 100644
--- a/src/components/select/index.js
+++ b/src/components/select/index.js
@@ -529,6 +529,7 @@ class Select extends Component {
handleSelect={this.handleSelect}
searchValue={this.state.searchValue}
onHoverChange={this.onHoverChange}
+ open={this.state.open}
/>
);
}
@@ -555,6 +556,7 @@ class Select extends Component {
searchValue={this.state.searchValue}
onSearchValueChange={this.onSearchValueChange}
onHoverChange={this.onHoverChange}
+ open={this.state.open}
/>
);
}
diff --git a/src/components/select/views/select/multi-select.js b/src/components/select/views/select/multi-select.js
index 24bb30b7..5b72b08d 100644
--- a/src/components/select/views/select/multi-select.js
+++ b/src/components/select/views/select/multi-select.js
@@ -58,6 +58,7 @@ export default function MultiSelect(props) {
onHoverChange = noop,
dropdownConfig,
selectInfoKey,
+ open,
} = props;
const [ options, setOptions ] = useState(dataSource);
const [hoveredOption, setHoveredOption] = useState(null);
@@ -92,16 +93,16 @@ export default function MultiSelect(props) {
handleSelect();
};
+ useEffect(() => {
+ setHoveredOption(null);
+ onHoverChange(null);
+ }, [open]);
+
const handleOptionHover = (item) => {
setHoveredOption(item);
onHoverChange(item);
};
- const handleOptionLeave = () => {
- setHoveredOption(null);
- onHoverChange(null);
- };
-
const handleCheckAll = (checked) => {
const result = Children.map(dataSource, (child) => {
const { value: childValue, disabled } = child.props;
@@ -121,7 +122,7 @@ export default function MultiSelect(props) {
multiple: true,
isSelected: values.includes(child.props.value),
onChange: onOptionChange,
- onHover: (item) => item ? handleOptionHover(item, index) : handleOptionLeave(),
+ onHover: (item) => item && handleOptionHover(item, index),
onUnlimitedChange: () => onUnlimitedChange({
...child.props,
...(dataSource?.[index]?.props || {}),
diff --git a/src/components/select/views/select/single-select.js b/src/components/select/views/select/single-select.js
index 83be03cd..7677e56a 100644
--- a/src/components/select/views/select/single-select.js
+++ b/src/components/select/views/select/single-select.js
@@ -33,6 +33,7 @@ export default function SingleSelect(props) {
onHoverChange = noop,
dropdownConfig,
selectInfoKey,
+ open,
} = props;
const [ options, setOptions ] = useState(dataSource);
const [hoveredOption, setHoveredOption] = useState(null);
@@ -43,16 +44,16 @@ export default function SingleSelect(props) {
scrollIntoView(selectIndex);
}, []);
+ useEffect(() => {
+ setHoveredOption(null);
+ onHoverChange(null);
+ }, [open]);
+
const handleOptionHover = (item) => {
setHoveredOption(item);
onHoverChange(item);
};
- const handleOptionLeave = () => {
- setHoveredOption(null);
- onHoverChange(null);
- };
-
const views = useMemo(
() => Children.map(options, (child, index) => {
const childValue = child.props.value;
@@ -64,7 +65,7 @@ export default function SingleSelect(props) {
...child.props,
isSelected: value === childValue,
onChange,
- onHover: (item) => item ? handleOptionHover(item, index) : handleOptionLeave(),
+ onHover: (item) => item && handleOptionHover(item, index),
item: child.props.item,
});
}),
From 20c4567e0a05389a209721c177f2c12511116e22 Mon Sep 17 00:00:00 2001
From: "liyuan.meng" <13149260506@163.com>
Date: Mon, 30 Jun 2025 18:15:14 +0800
Subject: [PATCH 3/7] =?UTF-8?q?feat:=20[Select]=20=E8=A7=A3=E5=86=B3?=
=?UTF-8?q?=E6=8A=A5=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/select/index.js | 4 ++--
src/components/select/views/select/multi-select.js | 9 +++------
src/components/select/views/select/single-select.js | 7 ++-----
3 files changed, 7 insertions(+), 13 deletions(-)
diff --git a/src/components/select/index.js b/src/components/select/index.js
index 646d30ac..3b0567fe 100644
--- a/src/components/select/index.js
+++ b/src/components/select/index.js
@@ -594,8 +594,8 @@ class Select extends Component {
style={{
...popupStyle,
width: hoveredOption?.[this.props.selectInfoKey]
- ? dropdownConfig.width
- : dropdownConfig.leftWidth || dropdownStyle?.width || `${width}px`,
+ ? dropdownConfig?.width
+ : dropdownConfig?.leftWidth || dropdownStyle?.width || `${width}px`,
...dropdownStyle,
}}
>
diff --git a/src/components/select/views/select/multi-select.js b/src/components/select/views/select/multi-select.js
index 5b72b08d..43aeda55 100644
--- a/src/components/select/views/select/multi-select.js
+++ b/src/components/select/views/select/multi-select.js
@@ -163,7 +163,7 @@ export default function MultiSelect(props) {
@@ -172,7 +172,7 @@ export default function MultiSelect(props) {
className={`${selector}-multiple-options`}
style={
dropdownConfig?.width
- ? { width: dropdownConfig.leftWidth, minWidth: dropdownConfig.leftWidth }
+ ? { width: dropdownConfig?.leftWidth, minWidth: dropdownConfig?.leftWidth }
: {}
}
>
@@ -192,10 +192,7 @@ export default function MultiSelect(props) {
+
{hoveredOption.label || hoveredOption.value}
{hoveredOption?.[selectInfoKey]}
diff --git a/src/components/select/views/select/single-select.js b/src/components/select/views/select/single-select.js
index 7677e56a..aa0b1a69 100644
--- a/src/components/select/views/select/single-select.js
+++ b/src/components/select/views/select/single-select.js
@@ -87,7 +87,7 @@ export default function SingleSelect(props) {
className={`${selector}-single-options`}
style={
dropdownConfig?.width
- ? { width: dropdownConfig.leftWidth, minWidth: dropdownConfig.leftWidth }
+ ? { width: dropdownConfig?.leftWidth, minWidth: dropdownConfig?.leftWidth }
: {}
}
>
@@ -95,10 +95,7 @@ export default function SingleSelect(props) {
{!views.length &&
}
+
{hoveredOption.label || hoveredOption.value}
{hoveredOption?.[selectInfoKey]}
From 1c69765ee0bd9c9c55ddaa4121a8889afb09e2f4 Mon Sep 17 00:00:00 2001
From: "liyuan.meng" <13149260506@163.com>
Date: Mon, 30 Jun 2025 18:15:39 +0800
Subject: [PATCH 4/7] =?UTF-8?q?feat:=20[Cascader]=20=E7=BA=A7=E8=81=94?=
=?UTF-8?q?=E8=8F=9C=E5=8D=95=E6=94=AF=E6=8C=81=20tips=20=E6=8F=90?=
=?UTF-8?q?=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/c-cascader/demos/basic.md | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/src/components/c-cascader/demos/basic.md b/src/components/c-cascader/demos/basic.md
index d694189c..a0281b99 100644
--- a/src/components/c-cascader/demos/basic.md
+++ b/src/components/c-cascader/demos/basic.md
@@ -7,17 +7,19 @@ desc: 默认样式
```jsx
import React, { useState, useEffect } from 'react';
-import { CCascader } from 'cloud-react';
+import { CCascader, Tooltip, Icon } from 'cloud-react';
const addressOptions = [
{
value: 'zhejiang',
label: 'Zhejiang',
+ info: '说明',
children: [
{
value: 'hangzhou',
label: 'Hangzhou',
+ info: '说明',
children: [
{
value: 'xihu',
@@ -124,6 +126,18 @@ export default function Demo() {
onChange={onChange}
placeholder="Please select"
style={{ width: 328 }}
+ optionRender={option => {
+ return (
+
+ );
+ }}
/>
任意选项支持选择
Date: Mon, 30 Jun 2025 18:47:30 +0800
Subject: [PATCH 5/7] =?UTF-8?q?feat:=20[Select]=20=E5=B8=A6=E6=9C=89?=
=?UTF-8?q?=E4=B8=8B=E6=8B=89=E9=87=8A=E4=B9=89=E7=9A=84=E4=B8=8B=E6=8B=89?=
=?UTF-8?q?=E9=80=89=E9=A1=B9=EF=BC=8C=E9=80=89=E4=B8=AD=E5=90=8E=E5=B1=95?=
=?UTF-8?q?=E7=A4=BAtooltip?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/select/index.less | 3 ++-
.../select/views/search/single-search.js | 16 +++++++++++++++-
src/components/select/views/selected.js | 2 ++
3 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/src/components/select/index.less b/src/components/select/index.less
index 1f213cda..dc60e884 100644
--- a/src/components/select/index.less
+++ b/src/components/select/index.less
@@ -647,6 +647,7 @@
font-weight: 600;
font-size: 16px;
margin-bottom: 8px;
+ word-break: break-all;
}
&-content {
@@ -655,4 +656,4 @@
word-break: break-all;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/components/select/views/search/single-search.js b/src/components/select/views/search/single-search.js
index 5b0e5409..010457df 100644
--- a/src/components/select/views/search/single-search.js
+++ b/src/components/select/views/search/single-search.js
@@ -2,6 +2,8 @@
import React, { useEffect, useRef, useState } from 'react';
import { selector } from '../common';
import Input from '../../../input';
+import Icon from '../../../icon';
+import Tooltip from '../../../tooltip';
export default function SingleSearch({
selectedList,
@@ -18,6 +20,7 @@ export default function SingleSearch({
scrollSelected,
valueKey,
labelKey,
+ selectInfoKey,
}) {
const searchRef = useRef();
const [isFocusSearchInput, setIsFocusSearchInput] = useState(false);
@@ -84,15 +87,26 @@ export default function SingleSearch({
setSearchStatus(isFocusSearchInput);
}, [isFocusSearchInput]);
+ const currentSelectItem = dataSource?.find(item => item[valueKey] === selectedList?.[0]?.[valueKey]);
+
return (
{/* 有已选 && 未聚焦:展示黑色*/}
{getSelectedLabel()}
+ {currentSelectItem?.[selectInfoKey] && (
+
+
+
+ )}
{searchable ? (
From 358d42ea278f44bf41726ff98e0fda4d0080726b Mon Sep 17 00:00:00 2001
From: "liyuan.meng" <13149260506@163.com>
Date: Tue, 1 Jul 2025 10:36:53 +0800
Subject: [PATCH 6/7] =?UTF-8?q?feat:=20[Tooltip]=20=E6=B7=BB=E5=8A=A0=20de?=
=?UTF-8?q?faultPlacement=20=E5=B1=9E=E6=80=A7=EF=BC=8C=E5=9C=A8=20placeme?=
=?UTF-8?q?nt=E4=B8=BAauto=E6=97=B6=EF=BC=8C=E9=85=8D=E7=BD=AE=E9=BB=98?=
=?UTF-8?q?=E8=AE=A4=E4=BD=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/c-table/js/rowTooltip.js | 2 ++
.../select/views/search/single-search.js | 2 +-
src/components/tooltip/index.js | 15 ++++++++
src/components/tooltip/index.md | 35 ++++++++++---------
src/components/tooltip/toolView.js | 16 +++++----
5 files changed, 46 insertions(+), 24 deletions(-)
diff --git a/src/components/c-table/js/rowTooltip.js b/src/components/c-table/js/rowTooltip.js
index a3135022..80fc545d 100644
--- a/src/components/c-table/js/rowTooltip.js
+++ b/src/components/c-table/js/rowTooltip.js
@@ -60,6 +60,8 @@ class RowTooltip extends Component {
tooltipEle,
checkboxEle || radioEle,
'top-left',
+ undefined,
+ 'top',
);
const isInModal = document.querySelector(`.${prefixCls}-modal-mask`);
diff --git a/src/components/select/views/search/single-search.js b/src/components/select/views/search/single-search.js
index 010457df..35a45113 100644
--- a/src/components/select/views/search/single-search.js
+++ b/src/components/select/views/search/single-search.js
@@ -103,7 +103,7 @@ export default function SingleSearch({
{getSelectedLabel()}
{currentSelectItem?.[selectInfoKey] && (
-
+
)}
diff --git a/src/components/tooltip/index.js b/src/components/tooltip/index.js
index 56973a57..e7d41b58 100644
--- a/src/components/tooltip/index.js
+++ b/src/components/tooltip/index.js
@@ -214,6 +214,20 @@ Tooltip.propTypes = {
`${CONFIG_PLACE.right}-${CONFIG_PLACE.top}`,
`${CONFIG_PLACE.right}-${CONFIG_PLACE.bottom}`,
]),
+ defaultPlacement: PropTypes.oneOf([
+ CONFIG_PLACE.top,
+ `${CONFIG_PLACE.top}-${CONFIG_PLACE.left}`,
+ `${CONFIG_PLACE.top}-${CONFIG_PLACE.right}`,
+ CONFIG_PLACE.bottom,
+ `${CONFIG_PLACE.bottom}-${CONFIG_PLACE.left}`,
+ `${CONFIG_PLACE.bottom}-${CONFIG_PLACE.right}`,
+ CONFIG_PLACE.left,
+ `${CONFIG_PLACE.left}-${CONFIG_PLACE.top}`,
+ `${CONFIG_PLACE.left}-${CONFIG_PLACE.bottom}`,
+ CONFIG_PLACE.right,
+ `${CONFIG_PLACE.right}-${CONFIG_PLACE.top}`,
+ `${CONFIG_PLACE.right}-${CONFIG_PLACE.bottom}`,
+ ]),
theme: PropTypes.oneOf([
CONFIG_THEME.dark,
CONFIG_THEME.light,
@@ -237,6 +251,7 @@ Tooltip.defaultProps = {
trigger: 'hover',
visible: undefined,
placement: CONFIG_PLACE.auto,
+ defaultPlacement: CONFIG_PLACE.top,
theme: CONFIG_THEME.dark,
className: '',
overlayStyle: {},
diff --git a/src/components/tooltip/index.md b/src/components/tooltip/index.md
index c96e7690..93e3e798 100644
--- a/src/components/tooltip/index.md
+++ b/src/components/tooltip/index.md
@@ -17,23 +17,24 @@ group:
### API
-| 参数 | 说明 | 类型 | 默认值 |
-|-----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| -------- | ------------- |
-| content | 内容(可以为任意一段 html 内容) | string | |
-| theme | 主题, 可选 `dark` `light` `error` | string | dark |
-| trigger | 触发方式 `hover` `click` | string | hover |
-| visible | 用于手动控制浮层显隐 | boolean | undefined |
-| control | 配置成true,结合visible使用,实现手动控制浮层显隐 | boolean | false |
-| onVisibleChange | 显示隐藏的回调 | (visible: boolean) => void | () => {} |
-| container | 渲染节点,默认渲染到 body 上(如果指定容器,将会给指定容器添加 position:relative),已废弃 | function | document.body |
-| mouseEnterDelay | 鼠标移入后延时多少才显示 Tooltip,单位:毫秒 | number | 1 |
-| mouseLeaveDelay | 鼠标移出后延时多少才隐藏 Tooltip,单位:毫秒 | number | 1 |
-| placement | 气泡框位置,可选 `auto` `top` `left` `right` `bottom` `top-left` `top-right` `bottom-left` `bottom-right` `left-top` `left-bottom` `right-top` `right-bottom` | string | auto |
-| className | 设置类样式 | string | '' |
-| overlayStyle | 自定义卡片样式 | object | {} |
-| alwaysShow | 设置 visible 为 true 后,点击其他位置,tooltip 不消失 | bool | false |
-| showArrow | 配置箭头的显隐,默认为true | bool | false |
-| scrollContainer | 设置滚动根节点, 代码根据此根节点计算提示语的偏移量 | DOM | document.body |
+| 参数 | 说明 | 类型 | 默认值 |
+|------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -------- | ------------- |
+| content | 内容(可以为任意一段 html 内容) | string | |
+| theme | 主题, 可选 `dark` `light` `error` | string | dark |
+| trigger | 触发方式 `hover` `click` | string | hover |
+| visible | 用于手动控制浮层显隐 | boolean | undefined |
+| control | 配置成true,结合visible使用,实现手动控制浮层显隐 | boolean | false |
+| onVisibleChange | 显示隐藏的回调 | (visible: boolean) => void | () => {} |
+| container | 渲染节点,默认渲染到 body 上(如果指定容器,将会给指定容器添加 position:relative),已废弃 | function | document.body |
+| mouseEnterDelay | 鼠标移入后延时多少才显示 Tooltip,单位:毫秒 | number | 1 |
+| mouseLeaveDelay | 鼠标移出后延时多少才隐藏 Tooltip,单位:毫秒 | number | 1 |
+| placement | 气泡框位置,可选 `auto` `top` `left` `right` `bottom` `top-left` `top-right` `bottom-left` `bottom-right` `left-top` `left-bottom` `right-top` `right-bottom` | string | auto |
+| defaultPlacement | placement 设置为 `auto` 时候,气泡框默认位置,可选 `top` `left` `right` `bottom` `top-left` `top-right` `bottom-left` `bottom-right` `left-top` `left-bottom` `right-top` `right-bottom` | string | auto |
+| className | 设置类样式 | string | '' |
+| overlayStyle | 自定义卡片样式 | object | {} |
+| alwaysShow | 设置 visible 为 true 后,点击其他位置,tooltip 不消失 | bool | false |
+| showArrow | 配置箭头的显隐,默认为true | bool | false |
+| scrollContainer | 设置滚动根节点, 代码根据此根节点计算提示语的偏移量 | DOM | document.body |
### 代码演示
diff --git a/src/components/tooltip/toolView.js b/src/components/tooltip/toolView.js
index 1338005c..1db5c2c2 100644
--- a/src/components/tooltip/toolView.js
+++ b/src/components/tooltip/toolView.js
@@ -49,12 +49,14 @@ function getScrollOffset(ele, scrollContainer = document.body, type) {
}
// 获取方向
-function getDirection(tooltip, target, placement) {
+function getDirection(tooltip, target, placement, defaultPlacement = CONFIG_PLACE.top) {
const { top, left } = getAbsPosition(target);
const targetRect = target.getBoundingClientRect();
- let main = 'top';
- let vice = 'center';
+ const [p1, p2] = defaultPlacement?.split('-')
+
+ let main = p1 || 'top';
+ let vice = p2 || 'center';
if (placement === 'auto') {
if (top - tooltip.offsetHeight < top - targetRect.top) {
@@ -78,12 +80,13 @@ export function getTooltipPositionInBody(
target,
placement,
scrollContainer,
+ defaultPlacement = CONFIG_PLACE.top,
) {
const { offsetWidth, offsetHeight } = tooltip;
const { left, top, right, bottom, width, height } = getAbsPosition(target);
const style = {};
- const [main, vice] = getDirection(tooltip, target, placement);
+ const [main, vice] = getDirection(tooltip, target, placement, defaultPlacement);
switch (main) {
case CONFIG_PLACE.top:
@@ -144,7 +147,7 @@ export default class ToolView extends Component {
timer = null;
componentDidMount() {
- const { placement, target, scrollContainer } = this.props;
+ const { placement, defaultPlacement, target, scrollContainer } = this.props;
const tooltip = this.tipRef.current;
setTimeout(() => {
@@ -155,8 +158,9 @@ export default class ToolView extends Component {
target,
placement,
scrollContainer,
+ defaultPlacement,
),
- dir: getDirection(tooltip, target, placement).join('-'),
+ dir: getDirection(tooltip, target, placement, defaultPlacement).join('-'),
},
() => this.setState({ show: true }),
);
From 702d37b758261b4e3a81ba9339fc8af47b7d68c2 Mon Sep 17 00:00:00 2001
From: "liyuan.meng" <13149260506@163.com>
Date: Wed, 30 Jul 2025 23:03:45 +0800
Subject: [PATCH 7/7] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E6=8A=A5=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/c-cascader/demos/basic.md | 98 ++++++++++++------------
1 file changed, 51 insertions(+), 47 deletions(-)
diff --git a/src/components/c-cascader/demos/basic.md b/src/components/c-cascader/demos/basic.md
index c1cbfa9c..d362c4f1 100644
--- a/src/components/c-cascader/demos/basic.md
+++ b/src/components/c-cascader/demos/basic.md
@@ -5,21 +5,19 @@ desc: 默认样式
---
```jsx
-
-import React, { useState, useEffect } from 'react';
-import { CCascader, Tooltip, Icon } from 'cloud-react';
-const addressOptions = [
+import React, { useState, useEffect } from "react";
+import { CCascader, Tooltip, Icon } from "cloud-react";
+const addressOptions = [
{
- value: 'zhejiang',
- label: 'Zhejiang',
- info: '说明',
-
+ value: "zhejiang",
+ label: "Zhejiang",
+ info: "说明",
children: [
{
- value: 'hangzhou',
- label: 'Hangzhou',
- info: '说明',
+ value: "hangzhou",
+ label: "Hangzhou",
+ info: "说明",
children: [
{
value: "xihu",
@@ -124,42 +122,48 @@ export default function Demo() {
);
};
- return (
-
-
仅叶子选项支持选择
-
{
- return (
-
- );
- }}
- />
- 任意选项支持选择
-
- 用级联组件展示地址
- {
- !loading &&
+ 仅叶子选项支持选择
+ {
+ return (
+
+ );
+ }}
+ />
+ 任意选项支持选择
+
+ 用级联组件展示地址
+ {!loading && (
+