@fjyueke/arco-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +244 -0
- package/metaData/components/action-sheet/doc.md +102 -0
- package/metaData/components/action-sheet/example/index.tsx +199 -0
- package/metaData/components/action-sheet/example/methods.tsx +6 -0
- package/metaData/components/avatar/doc.md +57 -0
- package/metaData/components/avatar/example/group.tsx +69 -0
- package/metaData/components/avatar/example/index.tsx +196 -0
- package/metaData/components/badge/doc.md +28 -0
- package/metaData/components/badge/example/index.tsx +128 -0
- package/metaData/components/button/doc.md +45 -0
- package/metaData/components/button/example/index.tsx +264 -0
- package/metaData/components/carousel/doc.md +89 -0
- package/metaData/components/carousel/example/index.tsx +1481 -0
- package/metaData/components/cell/doc.md +68 -0
- package/metaData/components/cell/example/arrow.tsx +13 -0
- package/metaData/components/cell/example/cell.tsx +71 -0
- package/metaData/components/cell/example/group.tsx +63 -0
- package/metaData/components/cell/example/index.tsx +19 -0
- package/metaData/components/checkbox/doc.md +91 -0
- package/metaData/components/checkbox/example/checkbox.tsx +158 -0
- package/metaData/components/checkbox/example/group.tsx +103 -0
- package/metaData/components/checkbox/example/index.tsx +25 -0
- package/metaData/components/circle-progress/doc.md +40 -0
- package/metaData/components/circle-progress/example/index.tsx +323 -0
- package/metaData/components/collapse/doc.md +74 -0
- package/metaData/components/collapse/example/collapse.tsx +183 -0
- package/metaData/components/collapse/example/group.tsx +136 -0
- package/metaData/components/collapse/example/index.tsx +16 -0
- package/metaData/components/collapse/example/utils.tsx +20 -0
- package/metaData/components/context-provider/doc.md +44 -0
- package/metaData/components/context-provider/example/index.tsx +208 -0
- package/metaData/components/count-down/doc.md +40 -0
- package/metaData/components/count-down/example/hooks.tsx +118 -0
- package/metaData/components/count-down/example/index.tsx +63 -0
- package/metaData/components/date-picker/doc.md +102 -0
- package/metaData/components/date-picker/example/index.tsx +545 -0
- package/metaData/components/dialog/doc.md +200 -0
- package/metaData/components/dialog/example/index.tsx +328 -0
- package/metaData/components/dialog/example/methods.tsx +56 -0
- package/metaData/components/divider/doc.md +25 -0
- package/metaData/components/divider/example/index.tsx +87 -0
- package/metaData/components/dropdown/doc.md +80 -0
- package/metaData/components/dropdown/example/dropdown.tsx +308 -0
- package/metaData/components/dropdown/example/index.tsx +19 -0
- package/metaData/components/dropdown/example/options.tsx +103 -0
- package/metaData/components/dropdown-menu/doc.md +91 -0
- package/metaData/components/dropdown-menu/example/dropdown-menu.tsx +270 -0
- package/metaData/components/dropdown-menu/example/index.tsx +16 -0
- package/metaData/components/ellipsis/doc.md +33 -0
- package/metaData/components/ellipsis/example/index.tsx +93 -0
- package/metaData/components/ellipsis/example/js-ellipsis.tsx +229 -0
- package/metaData/components/ellipsis/example/native-ellipsis.tsx +48 -0
- package/metaData/components/form/doc.md +90 -0
- package/metaData/components/form/example/form-item-context.tsx +8 -0
- package/metaData/components/form/example/form-item.tsx +378 -0
- package/metaData/components/form/example/index.tsx +87 -0
- package/metaData/components/form/example/linked-container.tsx +66 -0
- package/metaData/components/grid/doc.md +39 -0
- package/metaData/components/grid/example/index.tsx +252 -0
- package/metaData/components/icon/doc.md +15 -0
- package/metaData/components/icon/example/index.tsx +32 -0
- package/metaData/components/image/doc.md +62 -0
- package/metaData/components/image/example/index.tsx +528 -0
- package/metaData/components/image-picker/doc.md +116 -0
- package/metaData/components/image-picker/example/add-icon.tsx +14 -0
- package/metaData/components/image-picker/example/index.tsx +175 -0
- package/metaData/components/image-preview/doc.md +119 -0
- package/metaData/components/image-preview/example/index.tsx +1290 -0
- package/metaData/components/image-preview/example/methods.tsx +72 -0
- package/metaData/components/index-bar/doc.md +83 -0
- package/metaData/components/index-bar/example/group.tsx +93 -0
- package/metaData/components/index-bar/example/index.tsx +271 -0
- package/metaData/components/index-bar/example/side-bar.tsx +82 -0
- package/metaData/components/input/doc.md +60 -0
- package/metaData/components/input/example/hooks.tsx +259 -0
- package/metaData/components/input/example/index.tsx +134 -0
- package/metaData/components/input/example/props.tsx +183 -0
- package/metaData/components/keyboard/doc.md +73 -0
- package/metaData/components/keyboard/example/index.tsx +238 -0
- package/metaData/components/load-more/doc.md +48 -0
- package/metaData/components/load-more/example/index.tsx +395 -0
- package/metaData/components/loading/doc.md +34 -0
- package/metaData/components/loading/example/index.tsx +312 -0
- package/metaData/components/masking/doc.md +93 -0
- package/metaData/components/masking/example/index.tsx +410 -0
- package/metaData/components/masking/example/methods.tsx +88 -0
- package/metaData/components/nav-bar/doc.md +40 -0
- package/metaData/components/nav-bar/example/back-icon.tsx +28 -0
- package/metaData/components/nav-bar/example/index.tsx +305 -0
- package/metaData/components/notice-bar/doc.md +34 -0
- package/metaData/components/notice-bar/example/index.tsx +294 -0
- package/metaData/components/notify/doc.md +81 -0
- package/metaData/components/notify/example/index.tsx +171 -0
- package/metaData/components/notify/example/methods.tsx +83 -0
- package/metaData/components/pagination/doc.md +41 -0
- package/metaData/components/pagination/example/arrow.tsx +14 -0
- package/metaData/components/pagination/example/index.tsx +292 -0
- package/metaData/components/picker/doc.md +89 -0
- package/metaData/components/picker/example/index.tsx +217 -0
- package/metaData/components/picker-view/doc.md +57 -0
- package/metaData/components/picker-view/example/cascader.tsx +141 -0
- package/metaData/components/picker-view/example/index.tsx +297 -0
- package/metaData/components/picker-view/example/multi-picker.tsx +66 -0
- package/metaData/components/picker-view/example/picker-cell.tsx +416 -0
- package/metaData/components/popover/doc.md +144 -0
- package/metaData/components/popover/example/index.tsx +23 -0
- package/metaData/components/popover/example/menu.tsx +145 -0
- package/metaData/components/popover/example/popover-inner.tsx +147 -0
- package/metaData/components/popover/example/popover.tsx +268 -0
- package/metaData/components/popup/doc.md +101 -0
- package/metaData/components/popup/example/index.tsx +125 -0
- package/metaData/components/popup/example/methods.tsx +6 -0
- package/metaData/components/popup-swiper/doc.md +108 -0
- package/metaData/components/popup-swiper/example/index.tsx +332 -0
- package/metaData/components/popup-swiper/example/methods.tsx +6 -0
- package/metaData/components/portal/doc.md +14 -0
- package/metaData/components/portal/example/index.tsx +35 -0
- package/metaData/components/progress/doc.md +42 -0
- package/metaData/components/progress/example/index.tsx +256 -0
- package/metaData/components/pull-refresh/doc.md +37 -0
- package/metaData/components/pull-refresh/example/android-pull-refresh.tsx +260 -0
- package/metaData/components/pull-refresh/example/index.tsx +44 -0
- package/metaData/components/pull-refresh/example/ios-pull-refresh.tsx +216 -0
- package/metaData/components/radio/doc.md +89 -0
- package/metaData/components/radio/example/group.tsx +92 -0
- package/metaData/components/radio/example/index.tsx +25 -0
- package/metaData/components/radio/example/radio.tsx +22 -0
- package/metaData/components/rate/doc.md +33 -0
- package/metaData/components/rate/example/index.tsx +281 -0
- package/metaData/components/search-bar/doc.md +97 -0
- package/metaData/components/search-bar/example/association.tsx +89 -0
- package/metaData/components/search-bar/example/cancel-button.tsx +34 -0
- package/metaData/components/search-bar/example/highlight.tsx +66 -0
- package/metaData/components/search-bar/example/index.tsx +251 -0
- package/metaData/components/show-monitor/doc.md +34 -0
- package/metaData/components/show-monitor/example/index.tsx +646 -0
- package/metaData/components/skeleton/doc.md +101 -0
- package/metaData/components/skeleton/example/elements.tsx +290 -0
- package/metaData/components/skeleton/example/index.tsx +96 -0
- package/metaData/components/skeleton/example/skeleton-context.tsx +7 -0
- package/metaData/components/slider/doc.md +42 -0
- package/metaData/components/slider/example/index.tsx +326 -0
- package/metaData/components/slider/example/marks.tsx +50 -0
- package/metaData/components/slider/example/popover.tsx +38 -0
- package/metaData/components/slider/example/thumb.tsx +48 -0
- package/metaData/components/slider/example/useSliderIcon.tsx +38 -0
- package/metaData/components/slider/example/useSliderInit.tsx +170 -0
- package/metaData/components/stepper/doc.md +46 -0
- package/metaData/components/stepper/example/index.tsx +166 -0
- package/metaData/components/stepper/example/useButtonClick.tsx +74 -0
- package/metaData/components/stepper/example/useInputEvent.tsx +65 -0
- package/metaData/components/stepper/example/useValue.tsx +43 -0
- package/metaData/components/steps/doc.md +57 -0
- package/metaData/components/steps/example/index.tsx +123 -0
- package/metaData/components/steps/example/step.tsx +126 -0
- package/metaData/components/sticky/doc.md +45 -0
- package/metaData/components/sticky/example/index.tsx +430 -0
- package/metaData/components/swipe-action/doc.md +44 -0
- package/metaData/components/swipe-action/example/index.tsx +338 -0
- package/metaData/components/swipe-action/example/item.tsx +40 -0
- package/metaData/components/swipe-load/doc.md +43 -0
- package/metaData/components/swipe-load/example/index.tsx +339 -0
- package/metaData/components/swipe-load/example/type.tsx +153 -0
- package/metaData/components/switch/doc.md +38 -0
- package/metaData/components/switch/example/index.tsx +237 -0
- package/metaData/components/tab-bar/doc.md +57 -0
- package/metaData/components/tab-bar/example/index.tsx +18 -0
- package/metaData/components/tab-bar/example/item.tsx +74 -0
- package/metaData/components/tab-bar/example/tab-bar.tsx +105 -0
- package/metaData/components/tabs/doc.md +187 -0
- package/metaData/components/tabs/example/index.tsx +514 -0
- package/metaData/components/tabs/example/tab-cell-underline.tsx +320 -0
- package/metaData/components/tabs/example/tab-cell.tsx +433 -0
- package/metaData/components/tabs/example/tab-pane.tsx +349 -0
- package/metaData/components/tag/doc.md +80 -0
- package/metaData/components/tag/example/index.tsx +23 -0
- package/metaData/components/tag/example/list.tsx +97 -0
- package/metaData/components/tag/example/tag.tsx +85 -0
- package/metaData/components/textarea/doc.md +67 -0
- package/metaData/components/textarea/example/index.tsx +258 -0
- package/metaData/components/toast/doc.md +90 -0
- package/metaData/components/toast/example/index.tsx +335 -0
- package/metaData/components/toast/example/methods.tsx +87 -0
- package/metaData/components/transition/doc.md +19 -0
- package/metaData/components/transition/example/index.tsx +113 -0
- package/metaData/components/uploader/doc.md +82 -0
- package/metaData/components/uploader/example/index.tsx +208 -0
- package/metaData/components-index.json +242 -0
- package/package.json +56 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
### 数据录入
|
|
2
|
+
|
|
3
|
+
# 多行文本框 Textarea
|
|
4
|
+
|
|
5
|
+
多行文本输入框组件,支持自适应内容高度。
|
|
6
|
+
|
|
7
|
+
======
|
|
8
|
+
|
|
9
|
+
> 属性/Props
|
|
10
|
+
|
|
11
|
+
|参数|描述|类型|默认值|
|
|
12
|
+
|----------|-------------|------|------|
|
|
13
|
+
|rows|文本域默认行数|number|-|
|
|
14
|
+
|autosize|自适应内容高度|boolean|-|
|
|
15
|
+
|textareaClass|文本域dom自定义类名|string|-|
|
|
16
|
+
|textareaStyle|文本域dom自定义样式|CSSProperties|-|
|
|
17
|
+
|cloneNodeWhenAutosize|autosize=true 时,是否通过 cloneNode 计算新高度|boolean|false|
|
|
18
|
+
|showStatistics|是否展示字数统计|boolean|true|
|
|
19
|
+
|statisticsMaxlength|字数统计时的最大输入长度|number|-|
|
|
20
|
+
|statisticsLengthCaculator|自定义统计字数方法|(value: string) =\> number|-|
|
|
21
|
+
|onErrStatusChange|字数统计错误状态切换回调,仅当状态发生改变时触发|(hasError: boolean) =\> void|-|
|
|
22
|
+
|onErrValueChange|字数统计错误状态回调,当值有改变时就会触发|(hasError: boolean, currentLength: number, maxLength?: number) =\> void|-|
|
|
23
|
+
|renderStatistics|自定义字数统计内容|(currentLength: number, maxLength: number) =\> ReactNode|-|
|
|
24
|
+
|nativeProps|其他未列出的原生属性,优先级低于已列出的组件属性|TextareaHTMLAttributes\<HTMLTextAreaElement\>|-|
|
|
25
|
+
|id|输入框的id|string|-|
|
|
26
|
+
|name|输入框的name|string|-|
|
|
27
|
+
|className|自定义类名|string|-|
|
|
28
|
+
|style|自定义样式|CSSProperties|-|
|
|
29
|
+
|value|绑定值,传入即受控|string|-|
|
|
30
|
+
|defaultValue|默认值|string|-|
|
|
31
|
+
|maxLength|最大输入长度|number|-|
|
|
32
|
+
|border|边框展示类型|"all" \| "half" \| "bottom" \| "none"|"half"|
|
|
33
|
+
|placeholder|占位文本|string|-|
|
|
34
|
+
|disabled|输入框是否禁用|boolean|-|
|
|
35
|
+
|readOnly|是否只读|boolean|-|
|
|
36
|
+
|autoFocus|是否自动获取焦点,开启后会触发一次onClick事件|boolean|-|
|
|
37
|
+
|blockChangeWhenCompositing|当 ios 输入中文时,输拼音的过程不触发onChange,仅确认选择后触发|boolean|false|
|
|
38
|
+
|label|输入框左侧文本|ReactNode|-|
|
|
39
|
+
|required|是否必填项|boolean|-|
|
|
40
|
+
|validator|正则验证,不符合验证的不允许输入|RegExp \| ((value: string) =\> boolean)|-|
|
|
41
|
+
|prepend|输入框头部内容,在输入框外部|ReactNode \| ((focusing: boolean, inputValue: string) =\> ReactNode)|-|
|
|
42
|
+
|append|输入框尾部内容,在输入框外部|ReactNode \| ((focusing: boolean, inputValue: string) =\> ReactNode)|-|
|
|
43
|
+
|blurBeforeFocus|在聚焦之前blur掉,即切换不同input时会重新弹起键盘,常用于input type切换时重新加载键盘,安卓上有效|boolean|-|
|
|
44
|
+
|clearable|是否有清除按钮|boolean|-|
|
|
45
|
+
|clearShowType|清除按钮展示时机:focus \- 聚焦时展示 value \- 有值则展示 always \- 始终展示|"focus" \| "value" \| "always"|"focus"|
|
|
46
|
+
|preventEventWhenClearing|在聚焦模式下点击清除按钮时,是否要屏蔽对应产生的onBlur和onFocus事件|boolean|true|
|
|
47
|
+
|clearIcon|清除按钮类型,也可自定义|ReactNode|\<IconClear className="clear-icon" /\>|
|
|
48
|
+
|onClear|按下清除按钮回调|(e: TouchEvent\<HTMLElement\>) =\> void|-|
|
|
49
|
+
|prefix|输入框前置内容,在输入框内部,也可自定义|ReactNode|-|
|
|
50
|
+
|suffix|输入框后置内容,在输入框内部,也可自定义|ReactNode|-|
|
|
51
|
+
|onChange|数据改变时触发(失去焦点时)|(e: ChangeEvent\<HTMLTextAreaElement\>, value: string) =\> void|-|
|
|
52
|
+
|onInput|数据改变时触发|(e: ChangeEvent\<HTMLTextAreaElement\>, value: string) =\> void|-|
|
|
53
|
+
|onFocus|输入框聚焦时触发|(e: FocusEvent\<HTMLTextAreaElement, Element\>) =\> void|-|
|
|
54
|
+
|onBlur|输入框失去焦点时触发|(e: FocusEvent\<HTMLTextAreaElement, Element\>) =\> void|-|
|
|
55
|
+
|onClick|点击输入框事件|(e: MouseEvent\<HTMLTextAreaElement, MouseEvent\>) =\> void|-|
|
|
56
|
+
|onKeyUp|原生的keyup事件|(e: KeyboardEvent\<HTMLTextAreaElement\>) =\> void|-|
|
|
57
|
+
|onKeyDown|原生的keydown事件|(e: KeyboardEvent\<HTMLTextAreaElement\>) =\> void|-|
|
|
58
|
+
|onKeyPress|原生的keypress事件|(e: KeyboardEvent\<HTMLTextAreaElement\>) =\> void|-|
|
|
59
|
+
|onPressEnter|按下回车键时触发|(e: KeyboardEvent\<HTMLTextAreaElement\>) =\> void|-|
|
|
60
|
+
|
|
61
|
+
> 引用/Refs
|
|
62
|
+
|
|
63
|
+
|参数|描述|类型|
|
|
64
|
+
|----------|-------------|------|
|
|
65
|
+
|dom|最外层元素 DOM|HTMLDivElement|
|
|
66
|
+
|textarea|原生文本框 DOM|HTMLTextAreaElement|
|
|
67
|
+
|resize|手动 resize 输入框,autosize=true 时生效|() =\> void|
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import React, {
|
|
2
|
+
forwardRef,
|
|
3
|
+
Ref,
|
|
4
|
+
useImperativeHandle,
|
|
5
|
+
useRef,
|
|
6
|
+
useEffect,
|
|
7
|
+
useMemo,
|
|
8
|
+
ReactNode,
|
|
9
|
+
} from 'react';
|
|
10
|
+
import { cls, componentWrapper } from '@arco-design/mobile-utils';
|
|
11
|
+
import { ContextLayout } from '../context-provider';
|
|
12
|
+
import { BasicInputProps } from '../input/props';
|
|
13
|
+
import { useInputLogic } from '../input/hooks';
|
|
14
|
+
|
|
15
|
+
export interface TextareaProps extends BasicInputProps<HTMLTextAreaElement> {
|
|
16
|
+
/**
|
|
17
|
+
* 文本域默认行数
|
|
18
|
+
* @en Default number of lines in the text field
|
|
19
|
+
*/
|
|
20
|
+
rows?: number;
|
|
21
|
+
/**
|
|
22
|
+
* 自适应内容高度
|
|
23
|
+
* @en Adaptive content height
|
|
24
|
+
*/
|
|
25
|
+
autosize?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* 文本域dom自定义类名
|
|
28
|
+
* @en Custom classname of text field dom
|
|
29
|
+
*/
|
|
30
|
+
textareaClass?: string;
|
|
31
|
+
/**
|
|
32
|
+
* 文本域dom自定义样式
|
|
33
|
+
* @en Custom stylesheet of text field dom
|
|
34
|
+
*/
|
|
35
|
+
textareaStyle?: React.CSSProperties;
|
|
36
|
+
/**
|
|
37
|
+
* autosize=true 时,是否通过 cloneNode 计算新高度
|
|
38
|
+
* @en When autosize=true, whether to calculate the new height through cloneNode
|
|
39
|
+
* @default false
|
|
40
|
+
*/
|
|
41
|
+
cloneNodeWhenAutosize?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* 是否展示字数统计
|
|
44
|
+
* @en Whether to display word count
|
|
45
|
+
* @default true
|
|
46
|
+
*/
|
|
47
|
+
showStatistics?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* 字数统计时的最大输入长度
|
|
50
|
+
* @en Maximum input length for word count
|
|
51
|
+
*/
|
|
52
|
+
statisticsMaxlength?: number;
|
|
53
|
+
/**
|
|
54
|
+
* 自定义统计字数方法
|
|
55
|
+
* @en Customize word count method
|
|
56
|
+
*/
|
|
57
|
+
statisticsLengthCaculator?: (value: string) => number;
|
|
58
|
+
/**
|
|
59
|
+
* 字数统计错误状态切换回调,仅当状态发生改变时触发
|
|
60
|
+
* @en Callback when the error state of word count switches, triggered only when the state changes
|
|
61
|
+
*/
|
|
62
|
+
onErrStatusChange?: (hasError: boolean) => void;
|
|
63
|
+
/**
|
|
64
|
+
* 字数统计错误状态回调,当值有改变时就会触发
|
|
65
|
+
* @en Callback when word count is in error status, triggered when the value changes
|
|
66
|
+
*/
|
|
67
|
+
onErrValueChange?: (hasError: boolean, currentLength: number, maxLength?: number) => void;
|
|
68
|
+
/**
|
|
69
|
+
* 自定义字数统计内容
|
|
70
|
+
* @en Custom word count content
|
|
71
|
+
*/
|
|
72
|
+
renderStatistics?: (currentLength: number, maxLength: number) => ReactNode;
|
|
73
|
+
/**
|
|
74
|
+
* 其他未列出的原生属性,优先级低于已列出的组件属性
|
|
75
|
+
* @en Other unlisted native properties, lower priority than listed component properties
|
|
76
|
+
*/
|
|
77
|
+
nativeProps?: React.TextareaHTMLAttributes<HTMLTextAreaElement>;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface TextareaRef {
|
|
81
|
+
/**
|
|
82
|
+
* 最外层元素 DOM
|
|
83
|
+
* @en The outermost element DOM
|
|
84
|
+
*/
|
|
85
|
+
dom: HTMLDivElement | null;
|
|
86
|
+
/**
|
|
87
|
+
* 原生文本框 DOM
|
|
88
|
+
* @en Native textarea DOM
|
|
89
|
+
*/
|
|
90
|
+
textarea: HTMLTextAreaElement | null;
|
|
91
|
+
/**
|
|
92
|
+
* 手动 resize 输入框,autosize=true 时生效
|
|
93
|
+
* @en Manually resize the input box, it takes effect when autosize=true
|
|
94
|
+
*/
|
|
95
|
+
resize: () => void;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const Textarea = forwardRef((props: TextareaProps, ref: Ref<TextareaRef>) => {
|
|
99
|
+
const {
|
|
100
|
+
id,
|
|
101
|
+
name,
|
|
102
|
+
rows,
|
|
103
|
+
placeholder,
|
|
104
|
+
readOnly,
|
|
105
|
+
onKeyUp,
|
|
106
|
+
onKeyPress,
|
|
107
|
+
disabled,
|
|
108
|
+
autosize,
|
|
109
|
+
cloneNodeWhenAutosize,
|
|
110
|
+
showStatistics = true,
|
|
111
|
+
statisticsMaxlength,
|
|
112
|
+
statisticsLengthCaculator,
|
|
113
|
+
onErrStatusChange,
|
|
114
|
+
onErrValueChange,
|
|
115
|
+
renderStatistics,
|
|
116
|
+
maxLength,
|
|
117
|
+
textareaClass,
|
|
118
|
+
textareaStyle,
|
|
119
|
+
nativeProps = {},
|
|
120
|
+
} = props;
|
|
121
|
+
const textareaRef = useRef<HTMLTextAreaElement>(null);
|
|
122
|
+
const cloneNodeRef = useRef<HTMLTextAreaElement | null>(null);
|
|
123
|
+
const {
|
|
124
|
+
inputValue,
|
|
125
|
+
handleClick,
|
|
126
|
+
handleChange,
|
|
127
|
+
handleInput,
|
|
128
|
+
handleKeyDown,
|
|
129
|
+
handleFocus,
|
|
130
|
+
handleBlur,
|
|
131
|
+
renderWrapper,
|
|
132
|
+
wrapRef,
|
|
133
|
+
} = useInputLogic(props, textareaRef);
|
|
134
|
+
const maxValueLength = statisticsMaxlength || maxLength;
|
|
135
|
+
const currentValueLength = useMemo(() => {
|
|
136
|
+
if (statisticsLengthCaculator) {
|
|
137
|
+
return statisticsLengthCaculator(inputValue);
|
|
138
|
+
}
|
|
139
|
+
// 默认为过滤换行后的字符长度
|
|
140
|
+
// @en The default is the character length after filtering newlines
|
|
141
|
+
const validValue = (inputValue || '').replace(/\n/g, '');
|
|
142
|
+
return validValue ? String(validValue).length : 0;
|
|
143
|
+
}, [inputValue, statisticsLengthCaculator]);
|
|
144
|
+
const exceed = maxValueLength ? currentValueLength > maxValueLength : false;
|
|
145
|
+
|
|
146
|
+
useImperativeHandle(
|
|
147
|
+
ref,
|
|
148
|
+
() => ({
|
|
149
|
+
dom: wrapRef.current,
|
|
150
|
+
textarea: textareaRef.current,
|
|
151
|
+
resize: resizeTextarea,
|
|
152
|
+
}),
|
|
153
|
+
[resizeTextarea],
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
useEffect(() => {
|
|
157
|
+
return () => {
|
|
158
|
+
cloneNodeRef.current && document.body.removeChild(cloneNodeRef.current);
|
|
159
|
+
};
|
|
160
|
+
}, []);
|
|
161
|
+
|
|
162
|
+
useEffect(() => {
|
|
163
|
+
resizeTextarea();
|
|
164
|
+
}, [inputValue, placeholder]);
|
|
165
|
+
|
|
166
|
+
useEffect(() => {
|
|
167
|
+
onErrStatusChange && onErrStatusChange(exceed);
|
|
168
|
+
}, [exceed]);
|
|
169
|
+
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
onErrValueChange && onErrValueChange(exceed, currentValueLength, maxValueLength);
|
|
172
|
+
}, [maxValueLength, currentValueLength]);
|
|
173
|
+
|
|
174
|
+
function resizeTextarea() {
|
|
175
|
+
if (!autosize || !textareaRef.current) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
let currentRef = textareaRef.current;
|
|
179
|
+
if (cloneNodeWhenAutosize) {
|
|
180
|
+
const cloneNode = textareaRef.current.cloneNode(true) as HTMLTextAreaElement;
|
|
181
|
+
if (cloneNodeRef.current) {
|
|
182
|
+
document.body.replaceChild(cloneNode, cloneNodeRef.current);
|
|
183
|
+
} else {
|
|
184
|
+
document.body.appendChild(cloneNode);
|
|
185
|
+
}
|
|
186
|
+
const computedStyle = window.getComputedStyle(textareaRef.current);
|
|
187
|
+
// 影响布局的css属性复制
|
|
188
|
+
// @en Copy css properties which affect layout
|
|
189
|
+
['width', 'fontSize', 'lineHeight', 'letterSpacing', 'wordSpacing'].forEach(
|
|
190
|
+
styleKey => {
|
|
191
|
+
cloneNode.style[styleKey] = computedStyle[styleKey];
|
|
192
|
+
},
|
|
193
|
+
);
|
|
194
|
+
cloneNode.classList.add('fake-textarea');
|
|
195
|
+
cloneNodeRef.current = cloneNode;
|
|
196
|
+
currentRef = cloneNode;
|
|
197
|
+
}
|
|
198
|
+
currentRef.style.height = 'auto';
|
|
199
|
+
const maxHeight = Math.max(currentRef.clientHeight, currentRef.scrollHeight);
|
|
200
|
+
textareaRef.current.style.height = `${maxHeight}px`;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function renderTextarea({ prefixCls }) {
|
|
204
|
+
const prefix = `${prefixCls}-input`;
|
|
205
|
+
return renderWrapper(
|
|
206
|
+
prefix,
|
|
207
|
+
`textarea ${showStatistics ? 'has-stat' : ''}`,
|
|
208
|
+
<>
|
|
209
|
+
<textarea
|
|
210
|
+
{...nativeProps}
|
|
211
|
+
id={id}
|
|
212
|
+
name={name}
|
|
213
|
+
rows={rows}
|
|
214
|
+
placeholder={placeholder}
|
|
215
|
+
readOnly={readOnly}
|
|
216
|
+
onFocus={handleFocus}
|
|
217
|
+
onBlur={handleBlur}
|
|
218
|
+
onKeyUp={onKeyUp}
|
|
219
|
+
onKeyPress={onKeyPress}
|
|
220
|
+
ref={textareaRef}
|
|
221
|
+
className={cls(`${prefixCls}-textarea`, textareaClass)}
|
|
222
|
+
style={textareaStyle}
|
|
223
|
+
value={inputValue}
|
|
224
|
+
maxLength={maxLength}
|
|
225
|
+
disabled={disabled}
|
|
226
|
+
onChange={handleChange}
|
|
227
|
+
onInput={handleInput}
|
|
228
|
+
onKeyDown={handleKeyDown}
|
|
229
|
+
onClick={handleClick}
|
|
230
|
+
/>
|
|
231
|
+
{showStatistics && maxValueLength ? (
|
|
232
|
+
<span
|
|
233
|
+
className={cls('statistic-text', {
|
|
234
|
+
exceed,
|
|
235
|
+
})}
|
|
236
|
+
>
|
|
237
|
+
{renderStatistics
|
|
238
|
+
? renderStatistics(currentValueLength, maxValueLength)
|
|
239
|
+
: `${currentValueLength}/${maxValueLength}`}
|
|
240
|
+
</span>
|
|
241
|
+
) : null}
|
|
242
|
+
</>,
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return <ContextLayout>{renderTextarea}</ContextLayout>;
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* 多行文本输入框组件,支持自适应内容高度。
|
|
251
|
+
* @en A multi-line textarea, supports adaptive content height.
|
|
252
|
+
* @type 数据录入
|
|
253
|
+
* @type_en Data Entry
|
|
254
|
+
* @name 多行文本框
|
|
255
|
+
* @name_en Textarea
|
|
256
|
+
* @displayName Textarea
|
|
257
|
+
*/
|
|
258
|
+
export default componentWrapper(Textarea, 'Textarea');
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
### 反馈
|
|
2
|
+
|
|
3
|
+
# 轻提示 Toast
|
|
4
|
+
|
|
5
|
+
轻提示组件,支持各个场景下调用方法。
|
|
6
|
+
|
|
7
|
+
======
|
|
8
|
+
|
|
9
|
+
> 属性/Props
|
|
10
|
+
|
|
11
|
+
|参数|描述|类型|默认值|
|
|
12
|
+
|----------|-------------|------|------|
|
|
13
|
+
|className|自定义类名|string|-|
|
|
14
|
+
|content|提示内容|ReactNode|-|
|
|
15
|
+
|duration|自动关闭的延时(单位: ms),设置为0则不会自动关闭|number|3000|
|
|
16
|
+
|icon|自定义图标|ReactNode|-|
|
|
17
|
+
|layout|内容排列布局|"vertical" \| "horizontal"|"vertical"|
|
|
18
|
+
|transitionDuration|打开关闭动画执行时长(单位: ms)|number|300|
|
|
19
|
+
|close|关闭函数|() =\> void|-|
|
|
20
|
+
|onClose|关闭后的回调函数|() =\> void|-|
|
|
21
|
+
|loading|是否为加载态|boolean|-|
|
|
22
|
+
|loadingIcon|加载图标,传入Icon组件type属性或node|ReactNode|-|
|
|
23
|
+
|loadingInner|加载图标内部元素,仅在 loading 为 true 时生效|string|-|
|
|
24
|
+
|disableBodyTouch|是否禁止toast以外区域的交互|boolean|false|
|
|
25
|
+
|visible|是否显示toast|boolean|false|
|
|
26
|
+
|getContainer|获取挂载容器|() =\> HTMLElement|-|
|
|
27
|
+
|type|toast展示信息类型,不同类型对应不同图标,info表示纯文字信息无图标|"info" \| "success" \| "error" \| "warn"|"info"|
|
|
28
|
+
|direction|toast出现位置|"center" \| "top" \| "bottom"|"center"|
|
|
29
|
+
|typeIconMap|自定义不同类型对应的不同图标|Partial\<Record\<ToastType, ReactNode\>\>|-|
|
|
30
|
+
|initialBodyOverflow|页面初始 overflow 状态,即关闭toast时 overflow 应该还原的状态|string|第一个全屏组件(弹窗、toast等)打开时页面overflow值|
|
|
31
|
+
|
|
32
|
+
> 引用/Refs
|
|
33
|
+
|
|
34
|
+
|参数|描述|类型|
|
|
35
|
+
|----------|-------------|------|
|
|
36
|
+
|dom|最外层元素 DOM|HTMLDivElement|
|
|
37
|
+
|
|
38
|
+
> 方法/Methods
|
|
39
|
+
|
|
40
|
+
|方法名|描述|类型|
|
|
41
|
+
|----------|-------------|------|
|
|
42
|
+
|toast|展示常规提示框|(config: string \| ToastProps) =\> \{ update: (config: ToastProps) =\> void; close: () =\> void \}|
|
|
43
|
+
|info|展示常规提示框,同 Toast\.toast|(config: string \| ToastProps) =\> \{ update: (config: ToastProps) =\> void; close: () =\> void \}|
|
|
44
|
+
|success|展示成功提示框(含成功icon)|(config: string \| ToastProps) =\> \{ update: (config: ToastProps) =\> void; close: () =\> void \}|
|
|
45
|
+
|error|展示错误提示框(含错误icon)|(config: string \| ToastProps) =\> \{ update: (config: ToastProps) =\> void; close: () =\> void \}|
|
|
46
|
+
|loading|展示加载中提示框(含加载中icon)|(config: string \| ToastProps) =\> \{ update: (config: ToastProps) =\> void; close: () =\> void \}|
|
|
47
|
+
|warn|展示警告提示框(含警告icon)|(config: string \| ToastProps) =\> \{ update: (config: ToastProps) =\> void; close: () =\> void \}|
|
|
48
|
+
|
|
49
|
+
> ToastType
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
"success" | "error" | "warn"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
> GlobalContextParams
|
|
56
|
+
|
|
57
|
+
|参数|描述|类型|默认值|
|
|
58
|
+
|----------|-------------|------|------|
|
|
59
|
+
|prefixCls|组件类名前缀|string|"arco"|
|
|
60
|
+
|system|手动控制当前所在系统,传入后将直接使用传入的值,ssr场景需指定系统初始值时适用|"" \| "pc" \| "android" \| "ios"|""|
|
|
61
|
+
|useDarkMode|是否监听系统原生的暗黑模式变化(prefers\-color\-scheme: dark)以判断是否切为暗黑模式|boolean|false|
|
|
62
|
+
|isDarkMode|是否处于暗黑模式,指定后以指定的值为准|boolean|false|
|
|
63
|
+
|darkModeSelector|当处于暗黑模式时,body上挂载的类名,为空值时不挂载类名|string|"arco-theme-dark"|
|
|
64
|
+
|theme|主题变量,传入后将在线替换css变量,需设置less变量 @use\-css\-vars: 1|Record\<string, string\>|-|
|
|
65
|
+
|locale|国际化语言包配置|ILocale|-|
|
|
66
|
+
|useRtl|是否使用Rtl模式|boolean|false|
|
|
67
|
+
|onDarkModeChange|当系统原生暗黑模式发生变化时触发,useDarkMode=true 时有效|(isDark: boolean) =\> void|-|
|
|
68
|
+
|createRoot|React19 修改了 createRoot 的引入路径,导致组件内部无法直接引入(低react版本会找不到模块)。因此使用 react 19 的用户需从外部传入 createRoot 方法|CreateRootFnType|-|
|
|
69
|
+
|
|
70
|
+
> ILocale
|
|
71
|
+
|
|
72
|
+
|参数|描述|类型|
|
|
73
|
+
|----------|-------------|------|
|
|
74
|
+
|locale|语言类型|string|
|
|
75
|
+
|LoadMore|-|\{ loadMoreText: string; loadingText: string; noDataText: string; failLoadText: string; prepareScrollText: string; prepareClickText: string; \}|
|
|
76
|
+
|Picker|-|\{ okText: string; cancelText: string; \}|
|
|
77
|
+
|Tag|-|\{ addTag: string; \}|
|
|
78
|
+
|Dialog|-|\{ okText: string; cancelText: string; \}|
|
|
79
|
+
|SwipeLoad|-|\{ normalText: string; activeText: string; \}|
|
|
80
|
+
|PullRefresh|-|\{ loadingText: string; pullingText: string; finishText: string; loosingText: string; \}|
|
|
81
|
+
|DropdownMenu|-|\{ select: string; \}|
|
|
82
|
+
|Pagination|-|\{ previousPage: string; nextPage: string; \}|
|
|
83
|
+
|Image|-|\{ loadError: string; \}|
|
|
84
|
+
|ImagePicker|-|\{ loadError: string; \}|
|
|
85
|
+
|SearchBar|-|\{ placeholder: string; cancelBtn: string; \}|
|
|
86
|
+
|Stepper|-|\{ minusButtonName: string; addButtonName: string; \}|
|
|
87
|
+
|Keyboard|-|\{ confirm: string; \}|
|
|
88
|
+
|Form|-|\{ required: string; type: \{ email: string; url: string; string: string; number: string; array: string; object: string; boolean: string; \}; number: \{ min: string; max: string; equal: string; range: string; positive: string; negative: string; \}; \.\.\. 4 more \.\.\.; pickerDefaultHint: string; \}|
|
|
89
|
+
|NavBar|-|\{ backBtnAriaLabel: string; \}|
|
|
90
|
+
|Uploader|-|\{ uploadBtn: string; retryUpload: string; \}|
|