From c4ac03e6f46998b0d51480bb14fc0ea9cec13921 Mon Sep 17 00:00:00 2001 From: slatejack <1815846446@qq.com> Date: Mon, 11 Nov 2024 18:00:41 +0800 Subject: [PATCH] fix(upload): support oneFileFail and oneFileSuccess in mobile react and mobile vue --- db/TDesign.db | Bin 1003520 -> 1003520 bytes .../tdesign-mobile-react/src/upload/type.ts | 8 ++++++++ .../src/upload/upload.en-US.md | 2 ++ .../tdesign-mobile-react/src/upload/upload.md | 2 ++ .../tdesign-mobile-vue/src/upload/props.ts | 4 ++++ .../tdesign-mobile-vue/src/upload/type.ts | 8 ++++++++ .../src/upload/upload.en-US.md | 4 ++++ .../tdesign-mobile-vue/src/upload/upload.md | 4 ++++ packages/scripts/api.json | 16 ++++++++++++---- 9 files changed, 44 insertions(+), 4 deletions(-) diff --git a/db/TDesign.db b/db/TDesign.db index 1f0f8cd98d84bb4a3f7968052194741b3202396a..3dacbab3708553ed620b67557c03f2ab16a8c675 100644 GIT binary patch delta 93 zcmZozVB4_3c7ik`^F$eER%QmhvaZII))dCp6sFb`=GGLJ))dy(6t=A??1~2&<)=%Z qU_aX)e25*0Ie?gRd+;Hy#axW??cdLE0Wmia^8hjL_U~u-IGX|O6(nf@ delta 93 zcmZozVB4_3c7ik`<3t%}Rz?QBvW~`-))dCp6sFb`=GGLJ))dy(6t=A??1~2&*{4gN qU_aX)e25*0Ie?gRd+;Hy#axW+?cdLE0Wmia^8hjL_U~u-IGX|Fkt8z! diff --git a/packages/products/tdesign-mobile-react/src/upload/type.ts b/packages/products/tdesign-mobile-react/src/upload/type.ts index 999e8ae2..19ae369c 100644 --- a/packages/products/tdesign-mobile-react/src/upload/type.ts +++ b/packages/products/tdesign-mobile-react/src/upload/type.ts @@ -124,6 +124,14 @@ export interface TdUploadProps { * 上传失败后触发。`response` 指接口响应结果,`response.error` 会作为错误文本提醒。如果希望判定为上传失败,但接口响应数据不包含 `error` 字段,可以使用 `formatResponse` 格式化 `response` 数据结构。如果是多文件多请求上传场景,请到事件 `onOneFileFail` 中查看 `response` */ onFail?: (options: UploadFailContext) => void; + /** + * 多文件/图片场景下,单个文件上传失败后触发,如果一个请求上传一个文件,则会触发多次。单文件/图片不会触发 + */ + onOneFileFail?: (options: UploadFailContext) => void; + /** + * 单个文件上传成功后触发,在多文件场景下会触发多次。`context.file` 表示当前上传成功的单个文件,`context.response` 表示上传请求的返回数据 + */ + onOneFileSuccess?: (context: Pick) => void; /** * 点击图片预览时触发,文件没有预览 */ diff --git a/packages/products/tdesign-mobile-react/src/upload/upload.en-US.md b/packages/products/tdesign-mobile-react/src/upload/upload.en-US.md index 120bc075..813a6587 100644 --- a/packages/products/tdesign-mobile-react/src/upload/upload.en-US.md +++ b/packages/products/tdesign-mobile-react/src/upload/upload.en-US.md @@ -34,6 +34,8 @@ withCredentials | Boolean | false | uploading request with cookie | N onChange | Function | | Typescript:`(value: Array, context: UploadChangeContext) => void`
trigger on uploaded files change。[see more ts definition](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/upload/type.ts)。
`interface UploadChangeContext { e?: MouseEvent \| ProgressEvent; response?: any; trigger: UploadChangeTrigger; index?: number; file?: UploadFile; files?: UploadFile[] }`

`type UploadChangeTrigger = 'add' \| 'remove' \| 'abort' \| 'progress-success' \| 'progress' \| 'progress-fail'`
| N onClickUpload | Function | | Typescript:`(context: { e: MouseEvent }) => void`
| N onFail | Function | | Typescript:`(options: UploadFailContext) => void`
`response.error` used for error tips, `formatResponse` can format `response`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/upload/type.ts)。
`interface UploadFailContext { e?: ProgressEvent; failedFiles: UploadFile[]; currentFiles: UploadFile[]; response?: any; file: UploadFile; XMLHttpRequest?: XMLHttpRequest}`
| N +onOneFileFail | Function | | Typescript:`(options: UploadFailContext) => void`
trigger on one file upload failed | N +onOneFileSuccess | Function | | Typescript:`(context: Pick) => void`
trigger on file uploaded successfully | N onPreview | Function | | Typescript:`(options: { file: UploadFile; index: number; e: MouseEvent }) => void`
trigger on preview elements click | N onProgress | Function | | Typescript:`(options: ProgressContext) => void`
uploading request progress event。[see more ts definition](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/upload/type.ts)。
`interface ProgressContext { e?: ProgressEvent; file?: UploadFile; currentFiles: UploadFile[]; percent: number; type: UploadProgressType; XMLHttpRequest?: XMLHttpRequest }`

`type UploadProgressType = 'real' \| 'mock'`
| N onRemove | Function | | Typescript:`(context: UploadRemoveContext) => void`
trigger on file removed。[see more ts definition](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/upload/type.ts)。
`interface UploadRemoveContext { index?: number; file?: UploadFile; e: MouseEvent }`
| N diff --git a/packages/products/tdesign-mobile-react/src/upload/upload.md b/packages/products/tdesign-mobile-react/src/upload/upload.md index 957bf392..02dd76d7 100644 --- a/packages/products/tdesign-mobile-react/src/upload/upload.md +++ b/packages/products/tdesign-mobile-react/src/upload/upload.md @@ -34,6 +34,8 @@ withCredentials | Boolean | false | 上传请求时是否携带 cookie | N onChange | Function | | TS 类型:`(value: Array, context: UploadChangeContext) => void`
已上传文件列表发生变化时触发,`trigger` 表示触发本次的来源。[详细类型定义](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/upload/type.ts)。
`interface UploadChangeContext { e?: MouseEvent \| ProgressEvent; response?: any; trigger: UploadChangeTrigger; index?: number; file?: UploadFile; files?: UploadFile[] }`

`type UploadChangeTrigger = 'add' \| 'remove' \| 'abort' \| 'progress-success' \| 'progress' \| 'progress-fail'`
| N onClickUpload | Function | | TS 类型:`(context: { e: MouseEvent }) => void`
点击上传区域时触发 | N onFail | Function | | TS 类型:`(options: UploadFailContext) => void`
上传失败后触发。`response` 指接口响应结果,`response.error` 会作为错误文本提醒。如果希望判定为上传失败,但接口响应数据不包含 `error` 字段,可以使用 `formatResponse` 格式化 `response` 数据结构。如果是多文件多请求上传场景,请到事件 `onOneFileFail` 中查看 `response`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/upload/type.ts)。
`interface UploadFailContext { e?: ProgressEvent; failedFiles: UploadFile[]; currentFiles: UploadFile[]; response?: any; file: UploadFile; XMLHttpRequest?: XMLHttpRequest}`
| N +onOneFileFail | Function | | TS 类型:`(options: UploadFailContext) => void`
多文件/图片场景下,单个文件上传失败后触发,如果一个请求上传一个文件,则会触发多次。单文件/图片不会触发 | N +onOneFileSuccess | Function | | TS 类型:`(context: Pick) => void`
单个文件上传成功后触发,在多文件场景下会触发多次。`context.file` 表示当前上传成功的单个文件,`context.response` 表示上传请求的返回数据 | N onPreview | Function | | TS 类型:`(options: { file: UploadFile; index: number; e: MouseEvent }) => void`
点击图片预览时触发,文件没有预览 | N onProgress | Function | | TS 类型:`(options: ProgressContext) => void`
上传进度变化时触发,真实进度和模拟进度都会触发。
⚠️ 原始上传请求,小文件的上传进度只有 0 和 100,故而不会触发 `progress` 事件;只有大文件才有真实的中间进度。如果你希望很小的文件也显示上传进度,保证 `useMockProgress=true` 的情况下,设置 `mockProgressDuration` 为更小的值。
参数 `options.type=real` 表示真实上传进度,`options.type=mock` 表示模拟上传进度。[详细类型定义](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/upload/type.ts)。
`interface ProgressContext { e?: ProgressEvent; file?: UploadFile; currentFiles: UploadFile[]; percent: number; type: UploadProgressType; XMLHttpRequest?: XMLHttpRequest }`

`type UploadProgressType = 'real' \| 'mock'`
| N onRemove | Function | | TS 类型:`(context: UploadRemoveContext) => void`
移除文件时触发。[详细类型定义](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/upload/type.ts)。
`interface UploadRemoveContext { index?: number; file?: UploadFile; e: MouseEvent }`
| N diff --git a/packages/products/tdesign-mobile-vue/src/upload/props.ts b/packages/products/tdesign-mobile-vue/src/upload/props.ts index 6c69f84c..f7acad9e 100644 --- a/packages/products/tdesign-mobile-vue/src/upload/props.ts +++ b/packages/products/tdesign-mobile-vue/src/upload/props.ts @@ -123,6 +123,10 @@ export default { onClickUpload: Function as PropType, /** 上传失败后触发。`response` 指接口响应结果,`response.error` 会作为错误文本提醒。如果希望判定为上传失败,但接口响应数据不包含 `error` 字段,可以使用 `formatResponse` 格式化 `response` 数据结构。如果是多文件多请求上传场景,请到事件 `onOneFileFail` 中查看 `response` */ onFail: Function as PropType, + /** 多文件/图片场景下,单个文件上传失败后触发,如果一个请求上传一个文件,则会触发多次。单文件/图片不会触发 */ + onOneFileFail: Function as PropType, + /** 单个文件上传成功后触发,在多文件场景下会触发多次。`context.file` 表示当前上传成功的单个文件,`context.response` 表示上传请求的返回数据 */ + onOneFileSuccess: Function as PropType, /** 点击图片预览时触发,文件没有预览 */ onPreview: Function as PropType, /** 上传进度变化时触发,真实进度和模拟进度都会触发。
⚠️ 原始上传请求,小文件的上传进度只有 0 和 100,故而不会触发 `progress` 事件;只有大文件才有真实的中间进度。如果你希望很小的文件也显示上传进度,保证 `useMockProgress=true` 的情况下,设置 `mockProgressDuration` 为更小的值。
参数 `options.type=real` 表示真实上传进度,`options.type=mock` 表示模拟上传进度 */ diff --git a/packages/products/tdesign-mobile-vue/src/upload/type.ts b/packages/products/tdesign-mobile-vue/src/upload/type.ts index ea23d553..24da0490 100644 --- a/packages/products/tdesign-mobile-vue/src/upload/type.ts +++ b/packages/products/tdesign-mobile-vue/src/upload/type.ts @@ -134,6 +134,14 @@ export interface TdUploadProps { * 上传失败后触发。`response` 指接口响应结果,`response.error` 会作为错误文本提醒。如果希望判定为上传失败,但接口响应数据不包含 `error` 字段,可以使用 `formatResponse` 格式化 `response` 数据结构。如果是多文件多请求上传场景,请到事件 `onOneFileFail` 中查看 `response` */ onFail?: (options: UploadFailContext) => void; + /** + * 多文件/图片场景下,单个文件上传失败后触发,如果一个请求上传一个文件,则会触发多次。单文件/图片不会触发 + */ + onOneFileFail?: (options: UploadFailContext) => void; + /** + * 单个文件上传成功后触发,在多文件场景下会触发多次。`context.file` 表示当前上传成功的单个文件,`context.response` 表示上传请求的返回数据 + */ + onOneFileSuccess?: (context: Pick) => void; /** * 点击图片预览时触发,文件没有预览 */ diff --git a/packages/products/tdesign-mobile-vue/src/upload/upload.en-US.md b/packages/products/tdesign-mobile-vue/src/upload/upload.en-US.md index c816725f..acae884b 100644 --- a/packages/products/tdesign-mobile-vue/src/upload/upload.en-US.md +++ b/packages/products/tdesign-mobile-vue/src/upload/upload.en-US.md @@ -33,6 +33,8 @@ withCredentials | Boolean | false | uploading request with cookie | N onChange | Function | | Typescript:`(value: Array, context: UploadChangeContext) => void`
trigger on uploaded files change。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadChangeContext { e?: MouseEvent \| ProgressEvent; response?: any; trigger: UploadChangeTrigger; index?: number; file?: UploadFile; files?: UploadFile[] }`

`type UploadChangeTrigger = 'add' \| 'remove' \| 'abort' \| 'progress-success' \| 'progress' \| 'progress-fail'`
| N onClickUpload | Function | | Typescript:`(context: { e: MouseEvent }) => void`
| N onFail | Function | | Typescript:`(options: UploadFailContext) => void`
`response.error` used for error tips, `formatResponse` can format `response`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadFailContext { e?: ProgressEvent; failedFiles: UploadFile[]; currentFiles: UploadFile[]; response?: any; file: UploadFile; XMLHttpRequest?: XMLHttpRequest}`
| N +onOneFileFail | Function | | Typescript:`(options: UploadFailContext) => void`
trigger on one file upload failed | N +onOneFileSuccess | Function | | Typescript:`(context: Pick) => void`
trigger on file uploaded successfully | N onPreview | Function | | Typescript:`(options: { file: UploadFile; index: number; e: MouseEvent }) => void`
trigger on preview elements click | N onProgress | Function | | Typescript:`(options: ProgressContext) => void`
uploading request progress event。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface ProgressContext { e?: ProgressEvent; file?: UploadFile; currentFiles: UploadFile[]; percent: number; type: UploadProgressType; XMLHttpRequest?: XMLHttpRequest }`

`type UploadProgressType = 'real' \| 'mock'`
| N onRemove | Function | | Typescript:`(context: UploadRemoveContext) => void`
trigger on file removed。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadRemoveContext { index?: number; file?: UploadFile; e: MouseEvent }`
| N @@ -47,6 +49,8 @@ name | params | description change | `(value: Array, context: UploadChangeContext)` | trigger on uploaded files change。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadChangeContext { e?: MouseEvent \| ProgressEvent; response?: any; trigger: UploadChangeTrigger; index?: number; file?: UploadFile; files?: UploadFile[] }`

`type UploadChangeTrigger = 'add' \| 'remove' \| 'abort' \| 'progress-success' \| 'progress' \| 'progress-fail'`
click-upload | `(context: { e: MouseEvent })` | \- fail | `(options: UploadFailContext)` | `response.error` used for error tips, `formatResponse` can format `response`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadFailContext { e?: ProgressEvent; failedFiles: UploadFile[]; currentFiles: UploadFile[]; response?: any; file: UploadFile; XMLHttpRequest?: XMLHttpRequest}`
+one-file-fail | `(options: UploadFailContext)` | trigger on one file upload failed +one-file-success | `(context: Pick)` | trigger on file uploaded successfully preview | `(options: { file: UploadFile; index: number; e: MouseEvent })` | trigger on preview elements click progress | `(options: ProgressContext)` | uploading request progress event。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface ProgressContext { e?: ProgressEvent; file?: UploadFile; currentFiles: UploadFile[]; percent: number; type: UploadProgressType; XMLHttpRequest?: XMLHttpRequest }`

`type UploadProgressType = 'real' \| 'mock'`
remove | `(context: UploadRemoveContext)` | trigger on file removed。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadRemoveContext { index?: number; file?: UploadFile; e: MouseEvent }`
diff --git a/packages/products/tdesign-mobile-vue/src/upload/upload.md b/packages/products/tdesign-mobile-vue/src/upload/upload.md index 69500cb9..1b316554 100644 --- a/packages/products/tdesign-mobile-vue/src/upload/upload.md +++ b/packages/products/tdesign-mobile-vue/src/upload/upload.md @@ -33,6 +33,8 @@ withCredentials | Boolean | false | 上传请求时是否携带 cookie | N onChange | Function | | TS 类型:`(value: Array, context: UploadChangeContext) => void`
已上传文件列表发生变化时触发,`trigger` 表示触发本次的来源。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadChangeContext { e?: MouseEvent \| ProgressEvent; response?: any; trigger: UploadChangeTrigger; index?: number; file?: UploadFile; files?: UploadFile[] }`

`type UploadChangeTrigger = 'add' \| 'remove' \| 'abort' \| 'progress-success' \| 'progress' \| 'progress-fail'`
| N onClickUpload | Function | | TS 类型:`(context: { e: MouseEvent }) => void`
点击上传区域时触发 | N onFail | Function | | TS 类型:`(options: UploadFailContext) => void`
上传失败后触发。`response` 指接口响应结果,`response.error` 会作为错误文本提醒。如果希望判定为上传失败,但接口响应数据不包含 `error` 字段,可以使用 `formatResponse` 格式化 `response` 数据结构。如果是多文件多请求上传场景,请到事件 `onOneFileFail` 中查看 `response`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadFailContext { e?: ProgressEvent; failedFiles: UploadFile[]; currentFiles: UploadFile[]; response?: any; file: UploadFile; XMLHttpRequest?: XMLHttpRequest}`
| N +onOneFileFail | Function | | TS 类型:`(options: UploadFailContext) => void`
多文件/图片场景下,单个文件上传失败后触发,如果一个请求上传一个文件,则会触发多次。单文件/图片不会触发 | N +onOneFileSuccess | Function | | TS 类型:`(context: Pick) => void`
单个文件上传成功后触发,在多文件场景下会触发多次。`context.file` 表示当前上传成功的单个文件,`context.response` 表示上传请求的返回数据 | N onPreview | Function | | TS 类型:`(options: { file: UploadFile; index: number; e: MouseEvent }) => void`
点击图片预览时触发,文件没有预览 | N onProgress | Function | | TS 类型:`(options: ProgressContext) => void`
上传进度变化时触发,真实进度和模拟进度都会触发。
⚠️ 原始上传请求,小文件的上传进度只有 0 和 100,故而不会触发 `progress` 事件;只有大文件才有真实的中间进度。如果你希望很小的文件也显示上传进度,保证 `useMockProgress=true` 的情况下,设置 `mockProgressDuration` 为更小的值。
参数 `options.type=real` 表示真实上传进度,`options.type=mock` 表示模拟上传进度。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface ProgressContext { e?: ProgressEvent; file?: UploadFile; currentFiles: UploadFile[]; percent: number; type: UploadProgressType; XMLHttpRequest?: XMLHttpRequest }`

`type UploadProgressType = 'real' \| 'mock'`
| N onRemove | Function | | TS 类型:`(context: UploadRemoveContext) => void`
移除文件时触发。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadRemoveContext { index?: number; file?: UploadFile; e: MouseEvent }`
| N @@ -47,6 +49,8 @@ onValidate | Function | | TS 类型:`(context: { type: UploadValidateType, fi change | `(value: Array, context: UploadChangeContext)` | 已上传文件列表发生变化时触发,`trigger` 表示触发本次的来源。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadChangeContext { e?: MouseEvent \| ProgressEvent; response?: any; trigger: UploadChangeTrigger; index?: number; file?: UploadFile; files?: UploadFile[] }`

`type UploadChangeTrigger = 'add' \| 'remove' \| 'abort' \| 'progress-success' \| 'progress' \| 'progress-fail'`
click-upload | `(context: { e: MouseEvent })` | 点击上传区域时触发 fail | `(options: UploadFailContext)` | 上传失败后触发。`response` 指接口响应结果,`response.error` 会作为错误文本提醒。如果希望判定为上传失败,但接口响应数据不包含 `error` 字段,可以使用 `formatResponse` 格式化 `response` 数据结构。如果是多文件多请求上传场景,请到事件 `onOneFileFail` 中查看 `response`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadFailContext { e?: ProgressEvent; failedFiles: UploadFile[]; currentFiles: UploadFile[]; response?: any; file: UploadFile; XMLHttpRequest?: XMLHttpRequest}`
+one-file-fail | `(options: UploadFailContext)` | 多文件/图片场景下,单个文件上传失败后触发,如果一个请求上传一个文件,则会触发多次。单文件/图片不会触发 +one-file-success | `(context: Pick)` | 单个文件上传成功后触发,在多文件场景下会触发多次。`context.file` 表示当前上传成功的单个文件,`context.response` 表示上传请求的返回数据 preview | `(options: { file: UploadFile; index: number; e: MouseEvent })` | 点击图片预览时触发,文件没有预览 progress | `(options: ProgressContext)` | 上传进度变化时触发,真实进度和模拟进度都会触发。
⚠️ 原始上传请求,小文件的上传进度只有 0 和 100,故而不会触发 `progress` 事件;只有大文件才有真实的中间进度。如果你希望很小的文件也显示上传进度,保证 `useMockProgress=true` 的情况下,设置 `mockProgressDuration` 为更小的值。
参数 `options.type=real` 表示真实上传进度,`options.type=mock` 表示模拟上传进度。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface ProgressContext { e?: ProgressEvent; file?: UploadFile; currentFiles: UploadFile[]; percent: number; type: UploadProgressType; XMLHttpRequest?: XMLHttpRequest }`

`type UploadProgressType = 'real' \| 'mock'`
remove | `(context: UploadRemoveContext)` | 移除文件时触发。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/upload/type.ts)。
`interface UploadRemoveContext { index?: number; file?: UploadFile; e: MouseEvent }`
diff --git a/packages/scripts/api.json b/packages/scripts/api.json index a95df47d..242e7207 100644 --- a/packages/scripts/api.json +++ b/packages/scripts/api.json @@ -137517,7 +137517,9 @@ "platform_framework": [ "1", "2", - "4" + "4", + "8", + "16" ], "component": "Upload", "field_category": 2, @@ -137545,7 +137547,9 @@ "platform_framework_text": [ "Vue(PC)", "React(PC)", - "Angular(PC)" + "Angular(PC)", + "Vue(Mobile)", + "React(Mobile)" ], "field_type_text": [] }, @@ -137554,7 +137558,9 @@ "platform_framework": [ "1", "2", - "4" + "4", + "8", + "16" ], "component": "Upload", "field_category": 2, @@ -137582,7 +137588,9 @@ "platform_framework_text": [ "Vue(PC)", "React(PC)", - "Angular(PC)" + "Angular(PC)", + "Vue(Mobile)", + "React(Mobile)" ], "field_type_text": [] },