--- name: vue2-development description: Vue 2 + TypeScript 组件开发规范,使用 vue-property-decorator 类组件模式。适用于开发 Vue 单文件组件、表单组件、对话框组件等场景。 metadata: author: datagradient-ui version: "1.1" --- # Vue 组件开发规范 ## 何时使用 当需要开发或修改 Vue 组件时使用此规范,特别是: - 创建新的 `.vue` 单文件组件 - 开发表单组件和对话框 - 使用装饰器模式定义组件 - 实现表单验证逻辑 ## 组件结构 使用 Vue 2 + TypeScript + vue-property-decorator 的类组件模式。 ### 标准模板 ```vue ``` ## 装饰器使用 ### Props 定义 ```typescript // ✅ GOOD @Prop({ default: {} }) value!: Kv @Prop() readonly edit!: boolean // ❌ BAD @Prop() value ``` ### Refs 定义 ```typescript // ✅ GOOD @Ref() formRef!: ElForm ``` ### Watch 使用 ```typescript // ✅ GOOD @Watch('value', { immediate: true }) setModel (newVal: Kv, oldVal: Kv) { if (!isEqual(newVal, oldVal)) { this.model = newVal } } ``` ### Vuex 绑定 ```typescript // ✅ GOOD const $store = namespace('dataTag/dataModel') @$store.Action('fetchDataModelPageList') fetchDataModelPageList!: IGenericAction> @$store.State('dataModelList') dataModelList!: IDataModelResultItem[] ``` ## 表单验证 ### 验证规则定义 ```typescript // ✅ GOOD rules: Kv = { modelName: [ getRule('required', '请输入模型名称'), { max: 50, message: '模型名称不得超过50个字符!' }, { pattern: /^[a-zA-Z0-9_\u4e00-\u9fa5]+$/g, message: '仅支持中文、字母、数字和下划线' }, { validator: this.ruleValRepeatVerify, trigger: 'blur' } ] } // 使用 genRequired codeNameCn: [ genRequired('请输入中文名称'), { pattern: /^[0-9_\u4e00-\u9fa5]+$/g, message: '中文名称只能包括中文、数字、下划线' } ] ``` ### 验证方法 ```typescript // ✅ GOOD validate () { return this.formRef.validate() } async ruleValRepeatVerify (rule, value: string, callback) { if (value) { const obj = { fieldCode: 1, id: Number(this.$route.query.id), value: this.model.modelName } await this.checkModelName(obj).then(res => { if (res) { callback(new Error('该名称已存在')) } }) } callback() } ``` ## 命名规范 - **组件文件**:PascalCase(如 `FlowDistributionDlg.vue`) - **组件类名**:PascalCase(如 `FlowDistributionDlg`) - **属性/方法**:camelCase(如 `modelName`, `validate()`) ## 样式规范 - 使用 `scoped` 避免样式污染 - 使用 SCSS 预处理器 - 类名使用 kebab-case ```vue ``` ## 最佳实践 1. **继承基类**:组件应继承对应的 AbsView 基类(如 `AbsWorkbenchView`, `AbsDataModelView`) 2. **类型定义**:使用 TypeScript 类型注解,避免使用 `any` 3. **国际化**:使用 `$t()` 进行文本国际化 4. **错误处理**:异步操作应包含错误处理逻辑 5. **代码复用**:提取公共逻辑到工具函数或基类 ## 参考 详细规范请参考 [references/COMPONENT_GUIDE.md](references/COMPONENT_GUIDE.md)