guides/vue.md
2024-01-11 20:00:55 +08:00

177 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# vue约定规范
* ##### 代码风格配置:
```
* 使用element 框架时eslint配置使用"eslint-plugin-vue",默认element-admin框架已完成配置
大部分规则也都配置在了eslint-plugin-vue之中当没有遵循规则的时候会报错
* 单独安装: npm install eslint-plugin-vue -D
* 使用quasar框架时创建(npm quasar create)时已完成配置
* 提交npm lint检查代码通过后再提交代码, 也可以添加husky检查但过于强制可以熟悉后再使用
```
* ##### 不要在css中直接修改框架内部class的样式可自行添加class进行覆盖或直接标签上style进行覆盖
* ##### !! 命名
文件和变量命名使用驼峰式,文件大驼峰,变量小驼峰, 尽量见名思义,看见文件名就可以知道这个文件下的大概内容。变量命名不要 User1、User2User111这样明明是设备的数据搞个Userxxxx来存放
文件名尽量双拼写单词,被引入时文件名即组件名
```
不明所以的命名
//****
const checked1 = ref("");
const checked2 = ref("");
const checked3 = ref("");
const input = ref("");
const value = ref("");
//**
const value1 = ref(""); //操作设备的数据
const value2 = ref(""); //操作账号的数据
let index1 = 0; //一级索引
let index2 = 0;
const search = ref("");
const search2 = ref("");
```
* ##### html标签使用要语义化
上网搜html语义化资料 如:[参考链接](https://www.gaotianyang.top/archives/202007298e596984/)
* ##### 组件的data属性使用驼峰式
* ##### git提交不要提交无用文件
* ##### 分组件: 先清楚为什么要分组件和分组件的作用
1. 单一职责原则:每个组件只负责一项功能,这样可以使组件的代码更加简洁易读,并且方便维护和重用。
2. 可复用性:每个组件都应该尽量独立,以便在其他地方重复使用。
3. 组件之间的耦合度:组件之间应该尽量避免耦合,这样可以使得组件的代码更加灵活,便于维护和修改。
4. 让组件尽可能小:尽可能使组件的代码行数少,这样可以使代码更易读,并且方便维护。
5. 可读性:组件的代码应该有良好的结构,并且有适当的注释,便于阅读和理解。
```
无效分组件: 一个表格页面只在当前页面使用,不需要在其他页面使用,那么无需分组件,直接在页面中使用
<template>
<main>
<el-container>
<TableView />
</el-container>
</main>
</template>
<script setup lang="ts">
import TableView from '@/components/ListModel/Table.vue';
</script>
```
```
该拆分的没有拆分组件: 一个表格页面在当前页面和其他页面都需要使用,那么需要分组件,并且在当前页面使用,如下面省市区 和项目/地块选择的代码,大部分的表格页面都用到,而且每个都要请求接口获取下拉数据,应该拆分成一个组件,这样可以减少代码量,并且可以复用,
<el-text class="box-up-title">作物长势监测</el-text>
<el-form inline :model="formData" class="box-up-form">
<el-form-item label="省">
<el-select v-model="formData.province" placeholder="区域选择或搜索" clearable filterable @change="provinceSelected">
<el-option v-for="item in provinceList" :label="item.cityName" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="市">
<el-select v-model="formData.city" placeholder="区域选择或搜索" clearable filterable @change="citySelected" no-data-text="请先选择上级区域">
<el-option v-for="item in cityList" :label="item.cityName" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="区/县">
<el-select v-model="formData.county" placeholder="区域选择或搜索" clearable filterable @change="countySelected" no-data-text="请先选择上级区域">
<el-option v-for="item in countyList" :label="item.cityName" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="地块">
<el-select v-model="formData.plot_id" placeholder="地块选择" clearable filterable no-data-text="请先选择区县">
<el-option v-for="item in plotList" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="项目">
<el-select v-model="formData.species_id" placeholder="项目选择或搜索" clearable filterable @change="speciesSelected">
<el-option v-for="item in speciesList" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="地块选择">
<el-select v-model="formData.variety_id" clearable filterable >
<el-option v-for="item in varietyListComputed" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
```
* ##### vue3 统一使用setup风格,更简洁易明
```
<!-- js -->
<script setup>
<!-- ts -->
<script setup lang="ts">
```
* ##### 推荐使用Typescript/jsdoc开发
* ##### 组件、属性、事件、插槽的命名使用驼峰命名法,其中组件名首字母大写,调用时均使用小写中划线方式,如:
```
组件命名: MyComponent
组件的属性命名: myProperty
组件的事件命名: myEvent
组件的插槽命名: mySlot
完整示例:
<my-component :my-property="value" @my-event="handleMyEvent">
<template v-slot:my-slot> </template>
</my-component>
```
* ##### 布局组件文件使用xxxLayout结尾命名
```
MainLayout
DeviceLayout
```
* ##### 页面文件使用xxxPage结尾命名
```
DevicePage
DeviceDetailPage
```
* ##### 路由定义每个页面必须带上唯一name通常与页面文件名一致页面跳转统一使用name切换不允许直接push路径方式
```
{
path: '/device',
name: 'DevicePage',
component: () => import('@/views/device/DevicePage.vue')
}
跳转到页面时使用router.push({name: 'DevicePage'})
```
* ##### 不同组件间的引用尽量使用@/views/xxx/xxx.vue的路径方式避免使用相对路径方式
```
import DevicePage from '@/views/device/DevicePage.vue'
有的项目为 src
import DevicePage from '@/views/device/DevicePage.vue'
```
* ##### 路由定义每个页面必须带上meta属性其中meta.title为页面标题meta.icon为页面图标meta.keepAlive为页面是否需要缓存
* ##### [开发中遇到的问题整理](./vue-qa.md)
* ##### 待补充