将你的项目从Angular迁移至Vue需要注意什么?
如果你是一名前端开发工程师
且正在尝试将你的项目从 Angular迁移至 Vue
那么本篇文章可以帮你少踩一些坑
介绍
因为公司项目需要 TS 语言的支持
在开发项目时使用的是 Vue Class Component 写法,如下:
教程:
在本篇中涉及到的语法大部分都是基于此,请知悉
LifeCycle
钩子 | Angular | Vue |
---|---|---|
构造函数 | constructor() | created() |
初始化 | ngOnInit() | mounted() |
视图渲染完成 | ngAfterViewInit() | mounted()【存疑】 |
Class
Angular:
1 | // 在 ts 文件中 |
Vue:
1 | // 在 vue 文件的 `<script>` 标签中 |
Service
1. 导入导出
Angular:
1 | () |
Vue:
1 | import {HttpRequestService} from '@/apis/http-service'; |
2.注入
Angular:
1 | // 在 Angular 中是有构造函数的概念的,而一些服务是直接在构造函数中注入的 |
Vue:
1 | // 在 Vue 中是没有构造函数的概念的,所以直接在导出的 class 中直接实例化即可 |
父子组件
1.输入输出
比较项 | Angular | Vue |
---|---|---|
输入 | @Input() | @Prop() |
输出 | @Output() | @Emit() |
输入初始值 | 可以通过 = 来直接赋值 | 不可通过 = 直接设置初始值,需要使用 default 项来指明 |
输出类型 | 事件类型 | 函数,且返回具体的值 |
仓库 | Github |
2.引入子组件
Angular:
1 | 'tag', { static: false }) ( |
Vue:
1 | // 模板 |
3.获取组件中的元素
Angular:
1 | // 通过el来进行获取类名为total的元素 |
Vue:
1 | // 通过ref来获取类名为total的元素 |
日期格式化
Angular 中自带了 formatDate 日期格式化
Vue解决方法:
moment.js
—— vue-momentday.js
自己封装格式化逻辑
对比如下:
比较项 | Moment.js | Day.js | date-fns |
---|---|---|---|
大小 | 16.7k(重) | 2.87k(轻) | 5.76k(轻) |
最后更新时间 | 2021.02(停止开发,仅维护) | 2021.09 | 2021.12 |
优势 | 支持number类型直接转换为时间对象 | 返回新的实例,不可变数据,支持链式操作,API与Moment一致,支持插件 | 模块化加载,适用复杂项目,不可变性和纯粹性 |
劣势 | 可变对象 | 不支持number类型直接转换 | 不支持全局导入 |
浏览器兼容 | FireFox与Safari有异常 | 全浏览器 | |
Tree-shaking | 不支持 | 不支持 | 支持 |
模式 | OO | OO | Functional |
国际化 | 支持 | 支持 | 支持 |
TypeScript | 支持 | 支持 | 支持 |
License | MIT | MIT | MIT |
文档 | 中文 | 中文 | 外文 |
仓库 | GitHub | GitHub | GitHub |
参考链接:
国际化
对比如下:
比较项 | Angular | Vue |
---|---|---|
插件 | ngx-translate | vue-i18n |
html内容中使用 | {{'public' | translate}} | {{ $t('public') }} |
html标签中使用 | <span translate='public'></span> | <span v-t="'public'"></span> |
属性中使用 | <span :title="$t('public')">public</span> | |
ts/js文件中使用 | translate.instant('public') | this.translate.t('public'); |