sohelp-eleplus 1.1.24 → 1.1.26
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/components.js +1 -0
- package/http/SohelpHttp.js +21 -21
- package/icons/flag/AustraliaFlag.vue +10 -0
- package/icons/flag/BrazilFlag.vue +13 -0
- package/icons/flag/CanadaFlag.vue +6 -0
- package/icons/flag/ChinaFlag.vue +13 -0
- package/icons/flag/DenmarkFlag.vue +7 -0
- package/icons/flag/EuropeFlag.vue +30 -0
- package/icons/flag/HongkongFlag.vue +10 -0
- package/icons/flag/IndiaFlag.vue +27 -0
- package/icons/flag/IndonesiaFlag.vue +12 -0
- package/icons/flag/JapanFlag.vue +13 -0
- package/icons/flag/KoreaFlag.vue +26 -0
- package/icons/flag/MalaysiaFlag.vue +28 -0
- package/icons/flag/MexicoFlag.vue +15 -0
- package/icons/flag/NewZealandFlag.vue +45 -0
- package/icons/flag/NorwayFlag.vue +9 -0
- package/icons/flag/PhilippinesFlag.vue +8 -0
- package/icons/flag/PolandFlag.vue +12 -0
- package/icons/flag/README.md +100 -0
- package/icons/flag/RussiaFlag.vue +7 -0
- package/icons/flag/SingaporeFlag.vue +15 -0
- package/icons/flag/SouthAfricaFlag.vue +19 -0
- package/icons/flag/SwedenFlag.vue +6 -0
- package/icons/flag/SwitzerlandFlag.vue +11 -0
- package/icons/flag/ThailandFlag.vue +9 -0
- package/icons/flag/TurkeyFlag.vue +14 -0
- package/icons/flag/UkFlag.vue +9 -0
- package/icons/flag/UsaFlag.vue +11 -0
- package/icons/flag/VietnamFlag.vue +12 -0
- package/icons/flag/index.js +97 -0
- package/package.json +1 -1
- package/sohelp-country-select/README.md +140 -0
- package/sohelp-country-select/index.vue +146 -0
- package/sohelp-cry-input/README.md +191 -10
- package/sohelp-cry-input/index.vue +137 -47
- package/sohelp-grid/index.vue +121 -114
- package/sohelp-grid/js/DefaultGridOptions.js +1 -1
- package/sohelp-grid/js/useSohelpGridConfig.js +5 -5
- package/sohelp-import/index.vue +372 -365
- package/sohelp-table/index.vue +113 -115
- package/sohelp-vform-eleplus/render.es.js +0 -1
- package/sohelp-vxe-table/index.vue +20 -32
- package/sohelp-workflow-drawer/components/form.vue +1 -1
- package/sohelp-workflow-drawer/components/table.vue +0 -1
- package/sohelp-workflow-drawer/components/timeline.vue +2 -2
- package/sohelp-workflow-drawer/components/workflow.vue +28 -0
- package/sohelp-workflow-drawer/index.vue +189 -200
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg viewBox="0 0 900 600" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<path fill="#e30a17" d="M0 0h900v600H0z"/>
|
|
4
|
+
<circle fill="#fff" cx="450" cy="300" r="120"/>
|
|
5
|
+
<circle fill="#e30a17" cx="480" cy="300" r="96"/>
|
|
6
|
+
<path fill="#fff" d="M626 260l16 7-16 7 6-17z" transform="rotate(18, 600, 300)"/>
|
|
7
|
+
</svg>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script>
|
|
11
|
+
export default {
|
|
12
|
+
name: 'TurkeyFlag'
|
|
13
|
+
}
|
|
14
|
+
</script>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-gb" viewBox="0 0 640 480">
|
|
3
|
+
<path fill="#012169" d="M0 0h640v480H0z"/>
|
|
4
|
+
<path fill="#FFF" d="m75 0 244 181L562 0h78v62L400 241l240 178v61h-80L320 301 81 480H0v-60l239-178L0 64V0z"/>
|
|
5
|
+
<path fill="#C8102E" d="m424 281 216 159v40L369 281zm-184 20 6 35L54 480H0zM640 0v3L391 191l2-44L590 0zM0 0l239 176h-60L0 42z"/>
|
|
6
|
+
<path fill="#FFF" d="M241 0v480h160V0zM0 160v160h640V160z"/>
|
|
7
|
+
<path fill="#C8102E" d="M0 193v96h640v-96zM273 0v480h96V0z"/>
|
|
8
|
+
</svg>
|
|
9
|
+
</template>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-us" viewBox="0 0 640 480">
|
|
3
|
+
<path fill="#bd3d44" d="M0 0h640v480H0"/>
|
|
4
|
+
<path stroke="#fff" stroke-width="37" d="M0 55.3h640M0 129h640M0 203h640M0 277h640M0 351h640M0 425h640"/>
|
|
5
|
+
<path fill="#192f5d" d="M0 0h364.8v258.5H0"/>
|
|
6
|
+
<marker id="us-a" markerHeight="30" markerWidth="30">
|
|
7
|
+
<path fill="#fff" d="m14 0 9 27L0 10h28L5 27z"/>
|
|
8
|
+
</marker>
|
|
9
|
+
<path fill="none" marker-mid="url(#us-a)" d="m0 0 16 11h61 61 61 61 60L47 37h61 61 60 61L16 63h61 61 61 61 60L47 89h61 61 60 61L16 115h61 61 61 61 60L47 141h61 61 60 61L16 166h61 61 61 61 60L47 192h61 61 60 61L16 218h61 61 61 61 60z"/>
|
|
10
|
+
</svg>
|
|
11
|
+
</template>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg viewBox="0 0 900 600" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<path fill="#da251d" d="M0 0h900v600H0z"/>
|
|
4
|
+
<path fill="#ffff00" d="M450 300l42-126-108 78h133.6l-108-78L451.6 426z"/>
|
|
5
|
+
</svg>
|
|
6
|
+
</template>
|
|
7
|
+
|
|
8
|
+
<script>
|
|
9
|
+
export default {
|
|
10
|
+
name: 'VietnamFlag'
|
|
11
|
+
}
|
|
12
|
+
</script>
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export { default as UsaFlag } from './UsaFlag.vue';
|
|
2
|
+
export { default as ChinaFlag } from './ChinaFlag.vue';
|
|
3
|
+
export { default as EuropeFlag } from './EuropeFlag.vue';
|
|
4
|
+
export { default as UkFlag } from './UkFlag.vue';
|
|
5
|
+
export { default as JapanFlag } from './JapanFlag.vue';
|
|
6
|
+
export { default as KoreaFlag } from './KoreaFlag.vue';
|
|
7
|
+
export { default as HongkongFlag } from './HongkongFlag.vue';
|
|
8
|
+
export { default as SingaporeFlag } from './SingaporeFlag.vue';
|
|
9
|
+
export { default as AustraliaFlag } from './AustraliaFlag.vue';
|
|
10
|
+
export { default as CanadaFlag } from './CanadaFlag.vue';
|
|
11
|
+
export { default as SwitzerlandFlag } from './SwitzerlandFlag.vue';
|
|
12
|
+
export { default as SwedenFlag } from './SwedenFlag.vue';
|
|
13
|
+
export { default as NorwayFlag } from './NorwayFlag.vue';
|
|
14
|
+
export { default as DenmarkFlag } from './DenmarkFlag.vue';
|
|
15
|
+
export { default as MalaysiaFlag } from './MalaysiaFlag.vue';
|
|
16
|
+
export { default as ThailandFlag } from './ThailandFlag.vue';
|
|
17
|
+
export { default as IndiaFlag } from './IndiaFlag.vue';
|
|
18
|
+
export { default as RussiaFlag } from './RussiaFlag.vue';
|
|
19
|
+
export { default as BrazilFlag } from './BrazilFlag.vue';
|
|
20
|
+
export { default as SouthAfricaFlag } from './SouthAfricaFlag.vue';
|
|
21
|
+
export { default as MexicoFlag } from './MexicoFlag.vue';
|
|
22
|
+
export { default as PhilippinesFlag } from './PhilippinesFlag.vue';
|
|
23
|
+
export { default as IndonesiaFlag } from './IndonesiaFlag.vue';
|
|
24
|
+
export { default as VietnamFlag } from './VietnamFlag.vue';
|
|
25
|
+
export { default as NewZealandFlag } from './NewZealandFlag.vue';
|
|
26
|
+
export { default as TurkeyFlag } from './TurkeyFlag.vue';
|
|
27
|
+
export { default as PolandFlag } from './PolandFlag.vue';
|
|
28
|
+
|
|
29
|
+
// 币别代码到国旗组件的映射(用于动态导入)
|
|
30
|
+
export const FlagMap = {
|
|
31
|
+
usd: () => import('./UsaFlag.vue'),
|
|
32
|
+
cny: () => import('./ChinaFlag.vue'),
|
|
33
|
+
eur: () => import('./EuropeFlag.vue'),
|
|
34
|
+
gbp: () => import('./UkFlag.vue'),
|
|
35
|
+
jpy: () => import('./JapanFlag.vue'),
|
|
36
|
+
krw: () => import('./KoreaFlag.vue'),
|
|
37
|
+
hkd: () => import('./HongkongFlag.vue'),
|
|
38
|
+
aud: () => import('./AustraliaFlag.vue'),
|
|
39
|
+
cad: () => import('./CanadaFlag.vue'),
|
|
40
|
+
chf: () => import('./SwitzerlandFlag.vue'),
|
|
41
|
+
sgd: () => import('./SingaporeFlag.vue'),
|
|
42
|
+
myr: () => import('./MalaysiaFlag.vue'),
|
|
43
|
+
thb: () => import('./ThailandFlag.vue'),
|
|
44
|
+
inr: () => import('./IndiaFlag.vue'),
|
|
45
|
+
rub: () => import('./RussiaFlag.vue'),
|
|
46
|
+
brl: () => import('./BrazilFlag.vue'),
|
|
47
|
+
zar: () => import('./SouthAfricaFlag.vue'),
|
|
48
|
+
mxn: () => import('./MexicoFlag.vue'),
|
|
49
|
+
php: () => import('./PhilippinesFlag.vue'),
|
|
50
|
+
idr: () => import('./IndonesiaFlag.vue'),
|
|
51
|
+
vnd: () => import('./VietnamFlag.vue'),
|
|
52
|
+
nzd: () => import('./NewZealandFlag.vue'),
|
|
53
|
+
try: () => import('./TurkeyFlag.vue'),
|
|
54
|
+
pln: () => import('./PolandFlag.vue'),
|
|
55
|
+
sek: () => import('./SwedenFlag.vue'),
|
|
56
|
+
nok: () => import('./NorwayFlag.vue'),
|
|
57
|
+
dkk: () => import('./DenmarkFlag.vue')
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// 国家代码到货币代码的映射
|
|
61
|
+
export const CountryCodeToCurrency = {
|
|
62
|
+
US: 'usd', CN: 'cny', GB: 'gbp', JP: 'jpy', KR: 'krw', HK: 'hkd',
|
|
63
|
+
SG: 'sgd', AU: 'aud', CA: 'cad', CH: 'chf', MY: 'myr', TH: 'thb',
|
|
64
|
+
IN: 'inr', RU: 'rub', BR: 'brl', ZA: 'zar', MX: 'mxn', PH: 'php',
|
|
65
|
+
ID: 'idr', VN: 'vnd', NZ: 'nzd', TR: 'try', PL: 'pln', SE: 'sek',
|
|
66
|
+
NO: 'nok', DK: 'dkk'
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// 国家名称映射
|
|
70
|
+
export const CountryNameMap = {
|
|
71
|
+
US: { zh: '美国', en: 'United States' },
|
|
72
|
+
CN: { zh: '中国', en: 'China' },
|
|
73
|
+
GB: { zh: '英国', en: 'United Kingdom' },
|
|
74
|
+
JP: { zh: '日本', en: 'Japan' },
|
|
75
|
+
KR: { zh: '韩国', en: 'South Korea' },
|
|
76
|
+
HK: { zh: '香港', en: 'Hong Kong' },
|
|
77
|
+
SG: { zh: '新加坡', en: 'Singapore' },
|
|
78
|
+
AU: { zh: '澳大利亚', en: 'Australia' },
|
|
79
|
+
CA: { zh: '加拿大', en: 'Canada' },
|
|
80
|
+
CH: { zh: '瑞士', en: 'Switzerland' },
|
|
81
|
+
MY: { zh: '马来西亚', en: 'Malaysia' },
|
|
82
|
+
TH: { zh: '泰国', en: 'Thailand' },
|
|
83
|
+
IN: { zh: '印度', en: 'India' },
|
|
84
|
+
RU: { zh: '俄罗斯', en: 'Russia' },
|
|
85
|
+
BR: { zh: '巴西', en: 'Brazil' },
|
|
86
|
+
ZA: { zh: '南非', en: 'South Africa' },
|
|
87
|
+
MX: { zh: '墨西哥', en: 'Mexico' },
|
|
88
|
+
PH: { zh: '菲律宾', en: 'Philippines' },
|
|
89
|
+
ID: { zh: '印度尼西亚', en: 'Indonesia' },
|
|
90
|
+
VN: { zh: '越南', en: 'Vietnam' },
|
|
91
|
+
NZ: { zh: '新西兰', en: 'New Zealand' },
|
|
92
|
+
TR: { zh: '土耳其', en: 'Turkey' },
|
|
93
|
+
PL: { zh: '波兰', en: 'Poland' },
|
|
94
|
+
SE: { zh: '瑞典', en: 'Sweden' },
|
|
95
|
+
NO: { zh: '挪威', en: 'Norway' },
|
|
96
|
+
DK: { zh: '丹麦', en: 'Denmark' }
|
|
97
|
+
};
|
package/package.json
CHANGED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# 国家选择组件 (SohelpCountrySelect)
|
|
2
|
+
|
|
3
|
+
支持国旗、中英文名称的国家选择组件,具备丝滑的动画过渡效果。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- ✅ 支持 25 个主流国家/地区
|
|
8
|
+
- ✅ 显示国旗图标 + 中文 + 英文名称
|
|
9
|
+
- ✅ 支持搜索过滤
|
|
10
|
+
- ✅ 可自定义显示/隐藏国旗
|
|
11
|
+
- ✅ 丝滑的动画过渡效果
|
|
12
|
+
- ✅ 选中状态高亮显示
|
|
13
|
+
- ✅ 支持 v-model 双向绑定
|
|
14
|
+
- ✅ 支持所有 el-select 原生属性和事件
|
|
15
|
+
|
|
16
|
+
## 属性 (Props)
|
|
17
|
+
|
|
18
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
19
|
+
| :--------- | :------ | :----- | :-------------------------------- |
|
|
20
|
+
| modelValue | String | '' | 绑定值(国家代码,如 'CN', 'US') |
|
|
21
|
+
| showFlag | Boolean | true | 是否显示国旗 |
|
|
22
|
+
|
|
23
|
+
**其他属性**:支持通过 `v-bind` 传递所有 el-select 的原生属性,如 `placeholder`、`disabled`、`size`、`multiple` 等
|
|
24
|
+
|
|
25
|
+
## 事件 (Events)
|
|
26
|
+
|
|
27
|
+
| 事件名 | 说明 | 回调参数 |
|
|
28
|
+
| :---------------- | :----------- | :-------------- |
|
|
29
|
+
| update:modelValue | 值变化时触发 | (value: string) |
|
|
30
|
+
|
|
31
|
+
**其他事件**:支持通过 `v-on` 绑定所有 el-select 的原生事件
|
|
32
|
+
|
|
33
|
+
## 支持的国家
|
|
34
|
+
|
|
35
|
+
| 代码 | 中文 | 英文 |
|
|
36
|
+
| :--- | :--------- | :------------- |
|
|
37
|
+
| US | 美国 | United States |
|
|
38
|
+
| CN | 中国 | China |
|
|
39
|
+
| GB | 英国 | United Kingdom |
|
|
40
|
+
| JP | 日本 | Japan |
|
|
41
|
+
| KR | 韩国 | South Korea |
|
|
42
|
+
| HK | 香港 | Hong Kong |
|
|
43
|
+
| SG | 新加坡 | Singapore |
|
|
44
|
+
| AU | 澳大利亚 | Australia |
|
|
45
|
+
| CA | 加拿大 | Canada |
|
|
46
|
+
| CH | 瑞士 | Switzerland |
|
|
47
|
+
| MY | 马来西亚 | Malaysia |
|
|
48
|
+
| TH | 泰国 | Thailand |
|
|
49
|
+
| IN | 印度 | India |
|
|
50
|
+
| RU | 俄罗斯 | Russia |
|
|
51
|
+
| BR | 巴西 | Brazil |
|
|
52
|
+
| ZA | 南非 | South Africa |
|
|
53
|
+
| MX | 墨西哥 | Mexico |
|
|
54
|
+
| PH | 菲律宾 | Philippines |
|
|
55
|
+
| ID | 印度尼西亚 | Indonesia |
|
|
56
|
+
| VN | 越南 | Vietnam |
|
|
57
|
+
| NZ | 新西兰 | New Zealand |
|
|
58
|
+
| TR | 土耳其 | Turkey |
|
|
59
|
+
| PL | 波兰 | Poland |
|
|
60
|
+
| SE | 瑞典 | Sweden |
|
|
61
|
+
| NO | 挪威 | Norway |
|
|
62
|
+
| DK | 丹麦 | Denmark |
|
|
63
|
+
|
|
64
|
+
## 使用示例
|
|
65
|
+
|
|
66
|
+
### 基础用法
|
|
67
|
+
|
|
68
|
+
```vue
|
|
69
|
+
<template>
|
|
70
|
+
<sohelp-country-select v-model="country" />
|
|
71
|
+
</template>
|
|
72
|
+
|
|
73
|
+
<script setup>
|
|
74
|
+
import { ref } from 'vue';
|
|
75
|
+
|
|
76
|
+
const country = ref('CN');
|
|
77
|
+
</script>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 不显示国旗
|
|
81
|
+
|
|
82
|
+
```vue
|
|
83
|
+
<template>
|
|
84
|
+
<sohelp-country-select v-model="country" :show-flag="false" />
|
|
85
|
+
</template>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 自定义占位符
|
|
89
|
+
|
|
90
|
+
```vue
|
|
91
|
+
<template>
|
|
92
|
+
<sohelp-country-select v-model="country" placeholder="请选择国家" />
|
|
93
|
+
</template>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 禁用状态
|
|
97
|
+
|
|
98
|
+
```vue
|
|
99
|
+
<template>
|
|
100
|
+
<sohelp-country-select v-model="country" disabled placeholder="禁用状态" />
|
|
101
|
+
</template>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 不同尺寸
|
|
105
|
+
|
|
106
|
+
```vue
|
|
107
|
+
<template>
|
|
108
|
+
<div>
|
|
109
|
+
<sohelp-country-select v-model="country1" size="large" />
|
|
110
|
+
<sohelp-country-select v-model="country2" />
|
|
111
|
+
<sohelp-country-select v-model="country3" size="small" />
|
|
112
|
+
</div>
|
|
113
|
+
</template>
|
|
114
|
+
|
|
115
|
+
<script setup>
|
|
116
|
+
import { ref } from 'vue';
|
|
117
|
+
|
|
118
|
+
const country1 = ref('CN');
|
|
119
|
+
const country2 = ref('US');
|
|
120
|
+
const country3 = ref('GB');
|
|
121
|
+
</script>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 事件监听
|
|
125
|
+
|
|
126
|
+
```vue
|
|
127
|
+
<template>
|
|
128
|
+
<sohelp-country-select v-model="country" @change="handleChange" />
|
|
129
|
+
</template>
|
|
130
|
+
|
|
131
|
+
<script setup>
|
|
132
|
+
import { ref } from 'vue';
|
|
133
|
+
|
|
134
|
+
const country = ref('CN');
|
|
135
|
+
|
|
136
|
+
const handleChange = (value) => {
|
|
137
|
+
console.log('选择的国家:', value);
|
|
138
|
+
};
|
|
139
|
+
</script>
|
|
140
|
+
```
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-select v-model="selectedValue" v-bind="$attrs" filterable clearable style="min-width: 180px">
|
|
3
|
+
<template #prefix v-if="showFlag && selectedFlag">
|
|
4
|
+
<component :is="selectedFlag" class="prefix-flag" />
|
|
5
|
+
</template>
|
|
6
|
+
<el-option
|
|
7
|
+
v-for="country in countries"
|
|
8
|
+
:key="country.code"
|
|
9
|
+
:label="`${country.nameZh} (${country.nameEn})`"
|
|
10
|
+
:value="country.code"
|
|
11
|
+
>
|
|
12
|
+
<div class="country-option">
|
|
13
|
+
<component :is="country.flag" class="country-flag" v-if="showFlag" />
|
|
14
|
+
<span>{{ country.nameZh }}</span>
|
|
15
|
+
<span class="name-en">({{ country.nameEn }})</span>
|
|
16
|
+
</div>
|
|
17
|
+
</el-option>
|
|
18
|
+
</el-select>
|
|
19
|
+
</template>
|
|
20
|
+
|
|
21
|
+
<script setup>
|
|
22
|
+
import { ref, defineAsyncComponent, watch, computed } from 'vue';
|
|
23
|
+
import { FlagMap, CountryCodeToCurrency, CountryNameMap } from '@/components/sohelp-eleplus/icons/flag';
|
|
24
|
+
|
|
25
|
+
// Props 定义
|
|
26
|
+
const props = defineProps({
|
|
27
|
+
modelValue: {
|
|
28
|
+
type: String,
|
|
29
|
+
default: ''
|
|
30
|
+
},
|
|
31
|
+
showFlag: {
|
|
32
|
+
type: Boolean,
|
|
33
|
+
default: true
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const emit = defineEmits(['update:modelValue']);
|
|
38
|
+
|
|
39
|
+
// 生成国家列表数据,包含代码、中英文名称和对应的国旗组件
|
|
40
|
+
const countries = Object.entries(CountryNameMap).map(([code, names]) => ({
|
|
41
|
+
code,
|
|
42
|
+
nameZh: names.zh,
|
|
43
|
+
nameEn: names.en,
|
|
44
|
+
flag: defineAsyncComponent(FlagMap[CountryCodeToCurrency[code]])
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
// 内部状态,用于绑定 el-select
|
|
48
|
+
const selectedValue = ref('');
|
|
49
|
+
|
|
50
|
+
// 计算属性:获取当前选中国家的国旗组件
|
|
51
|
+
const selectedFlag = computed(() => {
|
|
52
|
+
if (!selectedValue.value) return null;
|
|
53
|
+
return defineAsyncComponent(FlagMap[CountryCodeToCurrency[selectedValue.value]]);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// 监听外部传入的 modelValue,同步到内部状态
|
|
57
|
+
watch(
|
|
58
|
+
() => props.modelValue,
|
|
59
|
+
(newVal) => {
|
|
60
|
+
selectedValue.value = newVal;
|
|
61
|
+
},
|
|
62
|
+
{ immediate: true }
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
// 监听内部选中值变化,通过 update:modelValue 事件同步到外部
|
|
66
|
+
watch(selectedValue, (newVal) => {
|
|
67
|
+
emit('update:modelValue', newVal);
|
|
68
|
+
});
|
|
69
|
+
</script>
|
|
70
|
+
|
|
71
|
+
<script>
|
|
72
|
+
export default {
|
|
73
|
+
name: 'SohelpCountrySelect'
|
|
74
|
+
};
|
|
75
|
+
</script>
|
|
76
|
+
|
|
77
|
+
<style lang="scss" scoped>
|
|
78
|
+
.country-option {
|
|
79
|
+
display: flex;
|
|
80
|
+
align-items: center;
|
|
81
|
+
gap: 5px;
|
|
82
|
+
transition: all 0.3s ease;
|
|
83
|
+
|
|
84
|
+
.country-flag {
|
|
85
|
+
width: 20px;
|
|
86
|
+
flex-shrink: 0;
|
|
87
|
+
display: flex;
|
|
88
|
+
align-items: center;
|
|
89
|
+
justify-content: center;
|
|
90
|
+
border: 1px solid #dcdfe6;
|
|
91
|
+
border-radius: 2px;
|
|
92
|
+
transition:
|
|
93
|
+
transform 0.3s ease,
|
|
94
|
+
border-color 0.3s ease;
|
|
95
|
+
|
|
96
|
+
svg {
|
|
97
|
+
width: 100%;
|
|
98
|
+
height: 100%;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.name-en {
|
|
103
|
+
color: #999;
|
|
104
|
+
font-size: 12px;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.prefix-flag {
|
|
109
|
+
width: 18px;
|
|
110
|
+
display: flex;
|
|
111
|
+
align-items: center;
|
|
112
|
+
justify-content: center;
|
|
113
|
+
border: 1px solid #dcdfe6;
|
|
114
|
+
border-radius: 2px;
|
|
115
|
+
transition: all 0.3s ease;
|
|
116
|
+
|
|
117
|
+
svg {
|
|
118
|
+
width: 100%;
|
|
119
|
+
height: 100%;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
:deep(.el-select__prefix) {
|
|
124
|
+
margin-right: 5px;
|
|
125
|
+
transition: opacity 0.3s ease;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// 选中状态动画
|
|
129
|
+
:deep(.el-select-dropdown__item.is-selected) {
|
|
130
|
+
.country-option {
|
|
131
|
+
.country-flag {
|
|
132
|
+
border-color: #409eff;
|
|
133
|
+
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// 下拉面板动画
|
|
139
|
+
:deep(.el-select-dropdown) {
|
|
140
|
+
transition: all 0.3s ease;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
:deep(.el-select-dropdown__item) {
|
|
144
|
+
transition: all 0.3s ease;
|
|
145
|
+
}
|
|
146
|
+
</style>
|
|
@@ -1,30 +1,211 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 货币金额输入框 (SohelpCryInput)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
支持国旗前缀、千分符、币别符、保留小数位数的货币数值输入组件。
|
|
4
4
|
|
|
5
5
|
## 属性 (Props)
|
|
6
6
|
|
|
7
7
|
| 属性名 | 类型 | 默认值 | 说明 |
|
|
8
8
|
| :--- | :--- | :--- | :--- |
|
|
9
|
-
|
|
|
10
|
-
|
|
|
11
|
-
|
|
|
9
|
+
| modelValue | Number/String | '' | 绑定值(纯数字) |
|
|
10
|
+
| separator | String | ',' | 千分符分隔符,如 "," |
|
|
11
|
+
| cry | String | 'cny' | 币别代码,如 'usd', 'cny', 'eur' |
|
|
12
|
+
| digits | Number | 2 | 保留小数位数 |
|
|
13
|
+
| showFlag | Boolean | true | 是否显示币别国旗 |
|
|
14
|
+
|
|
15
|
+
**其他属性**:支持通过 `v-bind` 传递所有 el-input 的原生属性,如 `placeholder`、`disabled`、`readonly`、`clearable`、`size`、`autofocus` 等
|
|
16
|
+
|
|
17
|
+
## 事件 (Events)
|
|
18
|
+
|
|
19
|
+
| 事件名 | 说明 | 回调参数 |
|
|
20
|
+
| :--- | :--- | :--- |
|
|
21
|
+
| update:modelValue | 失焦时触发,更新绑定值 | (value: number \| string \| '') |
|
|
22
|
+
|
|
23
|
+
**其他事件**:支持通过 `v-on` 绑定所有 el-input 的原生事件,如 `focus`、`blur`、`clear`、`change` 等
|
|
24
|
+
|
|
25
|
+
## 功能特性
|
|
26
|
+
|
|
27
|
+
- ✅ 支持千分符格式化显示
|
|
28
|
+
- ✅ 自动处理浮点数精度问题
|
|
29
|
+
- ✅ 支持自定义千分符分隔符
|
|
30
|
+
- ✅ 支持自定义小数位数
|
|
31
|
+
- ✅ 支持 25 种主流货币
|
|
32
|
+
- ✅ 国旗图标动态加载
|
|
33
|
+
- ✅ 默认自动获取焦点(可通过 `:autofocus="false"` 禁用)
|
|
34
|
+
- ✅ 完整透传 el-input 的所有属性和事件
|
|
35
|
+
|
|
36
|
+
## 支持的币别 (Currency Codes)
|
|
37
|
+
|
|
38
|
+
| 代码 | 国旗 | 货币 |
|
|
39
|
+
| :--- | :--- | :--- |
|
|
40
|
+
| usd | 🇺🇸 | 美元 USD |
|
|
41
|
+
| cny | 🇨🇳 | 人民币 CNY |
|
|
42
|
+
| eur | 🇪🇺 | 欧元 EUR |
|
|
43
|
+
| gbp | 🇬🇧 | 英镑 GBP |
|
|
44
|
+
| jpy | 🇯🇵 | 日元 JPY |
|
|
45
|
+
| krw | 🇰🇷 | 韩元 KRW |
|
|
46
|
+
| hkd | 🇭🇰 | 港币 HKD |
|
|
47
|
+
| aud | 🇦🇺 | 澳元 AUD |
|
|
48
|
+
| cad | 🇨🇦 | 加元 CAD |
|
|
49
|
+
| sgd | 🇸🇬 | 新币 SGD |
|
|
50
|
+
| myr | 🇲🇾 | 马来西亚林吉特 MYR |
|
|
51
|
+
| thb | 🇹🇭 | 泰铢 THB |
|
|
52
|
+
| inr | 🇮🇳 | 印度卢比 INR |
|
|
53
|
+
| rub | 🇷🇺 | 俄罗斯卢布 RUB |
|
|
54
|
+
| brl | 🇧🇷 | 巴西雷亚尔 BRL |
|
|
55
|
+
| zar | 🇿🇦 | 南非兰特 ZAR |
|
|
56
|
+
| mxn | 🇲🇽 | 墨西哥比索 MXN |
|
|
57
|
+
| php | 🇵🇭 | 菲律宾比索 PHP |
|
|
58
|
+
| idr | 🇮🇩 | 印尼盾 IDR |
|
|
59
|
+
| vnd | 🇻🇳 | 越南盾 VND |
|
|
60
|
+
| nzd | 🇳🇿 | 新西兰元 NZD |
|
|
61
|
+
| try | 🇹🇷 | 土耳其里拉 TRY |
|
|
62
|
+
| pln | 🇵🇱 | 波兰兹罗提 PLN |
|
|
63
|
+
| sek | 🇸🇪 | 瑞典克朗 SEK |
|
|
64
|
+
| nok | 🇳🇴 | 挪威克朗 NOK |
|
|
65
|
+
| dkk | 🇩🇰 | 丹麦克朗 DKK |
|
|
12
66
|
|
|
13
67
|
## 使用示例
|
|
14
68
|
|
|
69
|
+
### 基础用法
|
|
70
|
+
|
|
71
|
+
```vue
|
|
72
|
+
<template>
|
|
73
|
+
<sohelp-cry-input
|
|
74
|
+
v-model="value"
|
|
75
|
+
separator=","
|
|
76
|
+
cry="usd"
|
|
77
|
+
:digits="2"
|
|
78
|
+
/>
|
|
79
|
+
</template>
|
|
80
|
+
|
|
81
|
+
<script setup>
|
|
82
|
+
import { ref } from 'vue';
|
|
83
|
+
|
|
84
|
+
const value = ref(1234567.89);
|
|
85
|
+
</script>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 不同币别
|
|
89
|
+
|
|
90
|
+
```vue
|
|
91
|
+
<template>
|
|
92
|
+
<div class="demo">
|
|
93
|
+
<div class="item">
|
|
94
|
+
<label>美元 (USD)</label>
|
|
95
|
+
<sohelp-cry-input v-model="usd" separator="," cry="usd" :digits="2" />
|
|
96
|
+
</div>
|
|
97
|
+
<div class="item">
|
|
98
|
+
<label>人民币 (CNY)</label>
|
|
99
|
+
<sohelp-cry-input v-model="cny" separator="," cry="cny" :digits="2" />
|
|
100
|
+
</div>
|
|
101
|
+
<div class="item">
|
|
102
|
+
<label>欧元 (EUR)</label>
|
|
103
|
+
<sohelp-cry-input v-model="eur" separator="," cry="eur" :digits="2" />
|
|
104
|
+
</div>
|
|
105
|
+
<div class="item">
|
|
106
|
+
<label>日元 (JPY)</label>
|
|
107
|
+
<sohelp-cry-input v-model="jpy" separator="," cry="jpy" :digits="0" />
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</template>
|
|
111
|
+
|
|
112
|
+
<script setup>
|
|
113
|
+
import { ref } from 'vue';
|
|
114
|
+
|
|
115
|
+
const usd = ref(1234567.89);
|
|
116
|
+
const cny = ref(1234567.89);
|
|
117
|
+
const eur = ref(1234567.89);
|
|
118
|
+
const jpy = ref(1234567);
|
|
119
|
+
</script>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 不显示国旗
|
|
123
|
+
|
|
15
124
|
```vue
|
|
16
125
|
<template>
|
|
17
126
|
<sohelp-cry-input
|
|
18
|
-
v-model="
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
:
|
|
127
|
+
v-model="value"
|
|
128
|
+
separator=","
|
|
129
|
+
cry="usd"
|
|
130
|
+
:digits="2"
|
|
131
|
+
:show-flag="false"
|
|
132
|
+
/>
|
|
133
|
+
</template>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 不同小数位数
|
|
137
|
+
|
|
138
|
+
```vue
|
|
139
|
+
<template>
|
|
140
|
+
<sohelp-cry-input
|
|
141
|
+
v-model="value"
|
|
142
|
+
separator=","
|
|
143
|
+
cry="cny"
|
|
144
|
+
:digits="4"
|
|
145
|
+
/>
|
|
146
|
+
</template>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 使用 v-bind 传递原生属性
|
|
150
|
+
|
|
151
|
+
```vue
|
|
152
|
+
<template>
|
|
153
|
+
<sohelp-cry-input
|
|
154
|
+
v-model="value"
|
|
155
|
+
v-bind="inputProps"
|
|
156
|
+
@focus="handleFocus"
|
|
157
|
+
@blur="handleBlur"
|
|
22
158
|
/>
|
|
23
159
|
</template>
|
|
24
160
|
|
|
25
161
|
<script setup>
|
|
26
162
|
import { ref } from 'vue';
|
|
27
163
|
|
|
28
|
-
const
|
|
164
|
+
const value = ref(0);
|
|
165
|
+
|
|
166
|
+
const inputProps = {
|
|
167
|
+
placeholder: '请输入金额',
|
|
168
|
+
disabled: false,
|
|
169
|
+
clearable: true,
|
|
170
|
+
size: 'large'
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const handleFocus = () => {
|
|
174
|
+
console.log('获得焦点');
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const handleBlur = () => {
|
|
178
|
+
console.log('失去焦点');
|
|
179
|
+
};
|
|
29
180
|
</script>
|
|
30
181
|
```
|
|
182
|
+
|
|
183
|
+
### 禁用自动聚焦
|
|
184
|
+
|
|
185
|
+
```vue
|
|
186
|
+
<template>
|
|
187
|
+
<sohelp-cry-input
|
|
188
|
+
v-model="value"
|
|
189
|
+
:autofocus="false"
|
|
190
|
+
/>
|
|
191
|
+
</template>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### 禁用/只读状态
|
|
195
|
+
|
|
196
|
+
```vue
|
|
197
|
+
<template>
|
|
198
|
+
<div>
|
|
199
|
+
<sohelp-cry-input
|
|
200
|
+
v-model="value1"
|
|
201
|
+
disabled
|
|
202
|
+
placeholder="禁用状态"
|
|
203
|
+
/>
|
|
204
|
+
<sohelp-cry-input
|
|
205
|
+
v-model="value2"
|
|
206
|
+
readonly
|
|
207
|
+
placeholder="只读状态"
|
|
208
|
+
/>
|
|
209
|
+
</div>
|
|
210
|
+
</template>
|
|
211
|
+
```
|