如何使用 vue + typescript 编写页面 ( 基础装饰器部分 )
关于 Vue
Vue是一款前端的库,用来快速生成页面,是一款MVVM理念的框架。
关于 Typescript
Typescript是一款ECMAScript/Javascript的超集,提供了更丰富的语法
选择 vue 的理由
简单。推荐指数:3.7 。
扣分主要是我不太喜欢 script,css,template放在一个文件里面。当然了css还可以剔除到单独文件,但是script就没法剔除了,否则语法器会报找不到
开发相关准备
- 开发平台
Windows 10
- 开发工具使用的微软旗下的
Visual Studio Code
,以下简称vscode
- 安装vue插件
Vetur
- 安装
Beautify css/less/scss
插件 - 有需要可以安装一个中文语言包
- 安装vue插件
- 环境安装
node
用来运行环境和使用npm
下载相关的开发包git
部分包源码需要使用git下载安装python
安装py是使用node-sass
需要使用到,使用其他css预编译可以忽略- 以上工具准备好后接下来安装
vue-cli 3.0
使用npm install -g @vue/cli
(习惯使用yarn的人可以使用yarn global add @vue/cli
)
- 使用
vue-cli
创建项目vue create demo
,demo就是创建项目的名称- 提示选择预设,选择
Manually select features
回车确认 - 选择
typescript
vuex
router
babel
css pre-processors
,不使用linter,不选单元测试[有需要另说] - 回车后按照需要选择合适的选项
- 选择完毕后回车等待资源准备
- 使用 vue-ui管理项目
- 运行
vue ui
- 成功后访问提供的 url
- 在
Vue 项目管理器
导入创建的项目 - 在插件、依赖、配置可以做相应调整,也可以添加需要的插件、依赖
- 运行
编码开始
打开 vscode ,文件-打开文件夹,选择刚才创建好的项目文件夹,导入项目,使用CTRL + ~
召唤控制台。 输入npm run serve
运行开发模式,按住CTRL点击链接,打开项目地址。初次使用ts时,需了解以下ts的基本语法,并且在使用ts编写vue时,需要了解vue相关的基础知识。以下介绍默认已经熟悉并了解相关内容,但是不知如何整合。 打开src/views/Home.vue
作为参照,进行讲解:
熟悉几个vue的装饰器 vue-property-decorator
以下的装饰器的功能和原js编写的功能相同/相似,可以参照官方文档类比解读。
import { Vue, Component, Inject, Provide, Prop, Model, Watch, Emit, Mixins } from 'vue-property-decorator'
1. Vue
实际上就是 Vue 本身,继承vue相关属性和函数
class MyComponent extends Vue { }
2. @Component
声明成一个vue的组件实例,如果不使用,则不能得到一个vue组件
第一种方式,不需要定义额外内容
@Component
class MyComponent extends Vue { }
第二种方式,定义相关内容
1 @Component({ 2 /* 这里和js版本编写的 vue 组件内容相同, 3 * 凡是不能在ts里面完成的都可以在这里完成 4 * 最终会被合并到一个实例中。 5 * 在这里定义的内容,不会被语法器获取到,因此必须要同步在class中声明 6 */ 7 data(){ 8 return { myname:"",age:18 } 9 } 10 }) 11 class MyComponent extends Vue { 12 private myname:string; 13 mounted(){ 14 this.myname; 15 this.age;// 语法器报错,当前类找不到age属性 16 } 17 }
3. @Provide
向任意层级的子组件提供可访问的属性,默认为当前属性的名称,可以指定名称
1 @Component 2 class ParentComponent extends Vue { 3 @Provide() private info!:string; 4 @Provide("next") private infoNext!:string; 5 }
4. @Inject
获取父级由Provide提供的属性,默认为当前属性的名称,可以指定名称,多个父级提供相同名称属性时,获取最近父级的名称属性
1 @Component 2 class MyComponent extends Vue { 3 @Inject() private info!:string; 4 @Inject("next") private infoNext!:string; 5 }
5. @Prop
由标签属性注入,获取对应标签属性上值,可配置具体prop内容,参照js版本props内容
1 @Component 2 class MyComponent extends Vue { 3 @Prop() age!:number; 4 @Prop({default:1}) sex!:number; 5 }
1 <template> 2 <MyComponent :age="16" /> 3 </template> 4 5 <script lang="ts"> 6 import MyComponent from './MyComponent.vue'; 7 8 @Component({ 9 components:{ MyComponent } 10 }) 11 class PComponent extends Vue { } 12 </script>
6. @Model
是v-model的装饰器,当自定义组件想使用v-model时,可以使用这种方式,配合emit可以双向传递属性值
1 <template> 2 <input type="checkbox" :checked="checked" @change="changed"/> 3 </template> 4 5 <script lang="ts"> 6 @Component 7 class MyComponent extends Vue { 8 @Model("change") checked!:number; 9 changed(event:any){ /* 这里是偷懒写的any,在实际项目中需要避免 */ 10 this.$emit("change",event.target.value) 11 } 12 } 13 </script>
1 <template> 2 <MyComponent :age="16" v-model="mycheck" /> 3 </template> 4 5 <script lang="ts"> 6 import MyComponent from './MyComponent.vue'; 7 8 @Component({ 9 components:{ MyComponent } 10 }) 11 class PComponent extends Vue { 12 private mycheck:boolean = false; 13 } 14 </script>
7. @Watch
观察某个属性更新
1 @Component 2 class MyComponent extends Vue { 3 @Prop() age!:number; 4 @Watch("age") 5 ageChange(newVal:number,oldVal:number){ 6 /*age属性更新时,处理相关内容*/ 7 } 8 }
8. @Emit
this.$emit 的装饰器,如果没有指定名称,默认使用函数名称。有返回值时,使用返回值,没有则使用
1 @Component 2 class MyComponent extends Vue { 3 private myname = ""; 4 5 @Emit() 6 ageChangeA(){ /* 仅发送 this.$emit('ageChangeA') */ } 7 8 @Emit() 9 ageChangeB(age:number){ /* 发送 age this.$emit('ageChangeB',age) */ } 10 11 @Emit() 12 ageChangeC(age:number){ return 1 /* this.$emit('ageChangeC',1) 发送return 结果*/ } 13 }
9. Mixins
// MyMixin.ts
1 @Component 2 export default class MyMixin extends Vue { 3 /* 如果使用private 修饰,则两个相同的 私有属性混入时,会产生冲突 */ 4 protected myname = "张三"; 5 created(){ /* 混入对象有自己的 生命周期函数*/ } 6 getMyName(){ console.log("张三混入") } 7 }
1 // OtherMixin.ts 2 @Component 3 export default class OtherMixin extends Vue { 4 /* 如果使用private 修饰,则两个相同的 私有属性混入时,会产生冲突 */ 5 protected myname = "李四"; 6 created(){ /* 混入对象有自己的 生命周期函数*/ } 7 getMyName(){ console.log("李四混入") } 8 }
1 @Component 2 class MyComponent extends Mixins(MyMixin,OtherMixin) { 3 private myname = ""; /* 混入对象已经定义,这里产生属性冲突 */ 4 mounted(){ 5 this.getMyName() // 李四混入 6 } 7 }
装饰器可以参照 vue-property-decorator
没有filters,没有指令相关装饰器,有需要可以在@Component里面补充,或者可以直接定义函数调用计算返回值 在class里定义的属性即data属性,需要赋值初始值。
对于computed,使用 get
替代
1 @Component 2 class MyComponent extends Vue { 3 private myname = ""; /* 混入对象已经定义,这里产生属性冲突 */ 4 get upperName(){ 5 return "A" + this.myname 6 } 7 }
原文:https://blog.csdn.net/weixin_33979363/article/details/88005505