自己搭建Vue + Vuex + Typescript 项目的使用

栏目: JavaScript · 发布时间: 5年前

内容简介:现在很多主流语言都是强类型的,而这点也一直是JavaScript所被人诟病的地方。使用TypeScript之后,将会在代码调试、重构等步骤节省很多时间。比如说:函数在返回值的时候可能经过复杂的操作,那我们如果想要知道这个值的结构就需要去仔细阅读这段代码。那如果有了TypeScript之后,直接就可以看到函数的返回值结构,将会非常的方便创建tsconfig.json文件,放在根目录下,和

现在很多主流语言都是强类型的,而这点也一直是JavaScript所被人诟病的地方。使用TypeScript之后,将会在代码调试、重构等步骤节省很多时间。

比如说:函数在返回值的时候可能经过复杂的操作,那我们如果想要知道这个值的结构就需要去仔细阅读这段代码。那如果有了TypeScript之后,直接就可以看到函数的返回值结构,将会非常的方便

TypeScript配置

1. Webpack

  • 首先需要安装 ts-loader ,这是TypeScript为Webpack提供的编译器,类似于 babel-loader
npm i ts-loader -D
复制代码
  • 配置rules 接着在Webpack的 module.rules 里面添加对ts的支持(我这里的webpack版本是2.x):
{
    test: /\.vue$/,
    loader: 'vue-loader',
    options: vueLoaderConfig
},
{
    test: /\.ts$/,
    loader: 'ts-loader',
    options: {
      appendTsSuffixTo: [/\.vue$/],
    }
}
复制代码
  • 配置extensions 添加可识别文件后缀对ts的支持,如:
extensions: ['.js', '.vue', '.json', '.ts']
复制代码

2. tsconfig.json

创建tsconfig.json文件,放在根目录下,和 package.json 同级

配置内容主要也看个人需求,具体可以去typescript的官网查看,但是有一点需要注意:

在Vue中,你需要引入 strict: true (或者至少 noImplicitThis: true,这是 strict 模式的一部分) 以利用组件方法中 this 的类型检查,否则它会始终被看作 any 类型。

{
  "include": [
    "src/*",
    "src/**/*"
  ],
  "exclude": [
    "node_modules"
  ],
  "compilerOptions": {
    // types option has been previously configured
    "types": [
      // add node as an option
      "node"
    ],
    // typeRoots option has been previously configured
    "typeRoots": [
      // add path to @types
      "node_modules/@types"
    ],
    // 以严格模式解析
    "strict": true,
    // 在.tsx文件里支持JSX
    "jsx": "preserve",
    // 使用的JSX工厂函数
    "jsxFactory": "h",
    // 允许从没有设置默认导出的模块中默认导入
    "allowSyntheticDefaultImports": true,
    // 启用装饰器
    "experimentalDecorators": true,
    "strictFunctionTypes": false,
    // 允许编译javascript文件
    "allowJs": true,
    // 采用的模块系统
    "module": "esnext",
    // 编译输出目标 ES 版本
    "target": "es5",
    // 如何处理模块
    "moduleResolution": "node",
    // 在表达式和声明上有隐含的any类型时报错
    "noImplicitAny": true,
    "lib": [
      "dom",
      "es5",
      "es6",
      "es7",
      "es2015.promise"
    ],
    "sourceMap": true,
    "pretty": true
  }
}
复制代码

3. 修改main.js

  • 把项目主文件 main.js 修改成 main.ts ,里面的写法基本不变,但是有一点需要注意: 引入Vue文件的时候需要加上 .vue 后缀,否则编辑器识别不到
  • 把webpack的entry文件也修改成 main.ts

4. vue-shims.d.ts

TypeScript并不支持Vue文件,所以需要告诉TypeScript *.vue 文件交给vue编辑器来处理。解决方案就是在创建一个vue-shims.d.ts文件, 创建vue-shims.d.ts文件,可放在根目录下,和 package.json 同级

*.d.ts类型文件不需要手动引入,TypeScript会自动加载

declare module '*.vue' {
  import Vue from 'vue';
  export default Vue;
}

复制代码

5. 全局变量的使用

你可以通过 declare 关键字,来告诉 TypeScript,你正在试图表述一个其他地方已经存在的代码 创建vue-shims.global.ts文件,可放在根目录下,和 package.json 同级

declare let $:(select:string) => any
declare let wx: any
interface Window {
    Bridge: any,
    _XT: any
}
复制代码

6.Vue 的全局/实例属性和方法、组件

创建vue-shims.option.ts文件,可放在根目录下,和 package.json 同级

import Vue from 'vue'
declare module 'vue/types/vue' {
    // 可以使用 `VueConstructor` 接口
    // 来声明全局属性
    interface Vue {
        $axios: any,
        Login: (options?:any):void
    }
}
复制代码

7.引入第三方库的时候需要额外声明文件

创建vue-shims.d.ts文件,可放在根目录下,和 package.json 同级

declare module 'vue-awesome-swiper' {
  export const swiper: any
  export const swiperSlide: any
}

declare module 'vue-lazyload'
复制代码

第三方插件库

vue-class-component

vue-class-component 是官方维护的TypeScript装饰器,写法比较扁平化

import  { Component, Vue, Watch, Prop  }  from 'vue-class-component'
import Header from '@/component/header.vue'
import MyMixin from './mixin.js'

Vue.mixin(MyMixin);

@Component({
    // component
    components:{ Header }
})
export default class App extends Vue {
    // initial data
    name:string = 'xiaowu'

    // computed
    get getMyName():string {
        return `my name is ${this.name}`
    }

    // props
    @Prop({
        default: '',
        type: [String, Number]
    })
    phone: [string, number];

    // method
    jumpPage():void{
        console.log('jump page')
    }

    // lifecycle hook
    mounted(){
        console.log('mounted !!)
    }

    // watch 
    @Watch('state', { deep: true })
    onStateChange(n: any, o: any) {
        console.log('state is change ')   
    }
}

复制代码

如何在组件内使用路由钩子

  • 新建class-component-hooks.ts文件,在入口文件main.ts 引入,就可以正常使用
// Register the router hooks with their names
Component.registerHooks([
  'beforeRouteEnter',
  'beforeRouteLeave',
  'beforeRouteUpdate' // for vue-router 2.2+
])  
复制代码

vuex-class

vuex-class 是基于基于 vue-class-component 对Vuex提供的装饰器。它的作者同时也是 vue-class-component 的主要贡献者,质量还是有保证的。

import Vue from 'vue'
import Component from 'vue-class-component'
import {
  State,
  Getter,
  Action,
  Mutation,
  namespace
} from 'vuex-class'
 
const someModule = namespace('path/to/module')
 
@Component
export class MyComp extends Vue {
  @State('foo') stateFoo
  @State(state => state.bar) stateBar
  @Getter('foo') getterFoo
  @Action('foo') actionFoo
  @Mutation('foo') mutationFoo
  @someModule.Getter('foo') moduleGetterFoo
 
  // If the argument is omitted, use the property name
  // for each state/getter/action/mutation type
  @State foo
  @Getter bar
  @Action baz
  @Mutation qux
 
  created () {
    this.stateFoo // -> store.state.foo
    this.stateBar // -> store.state.bar
    this.getterFoo // -> store.getters.foo
    this.actionFoo({ value: true }) // -> store.dispatch('foo', { value: true })
    this.mutationFoo({ value: true }) // -> store.commit('foo', { value: true })
    this.moduleGetterFoo // -> store.getters['path/to/module/foo']
  }
}

复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Effective JavaScript

Effective JavaScript

David Herman / Addison-Wesley Professional / 2012-12-6 / USD 39.99

"It's uncommon to have a programming language wonk who can speak in such comfortable and friendly language as David does. His walk through the syntax and semantics of JavaScript is both charming and h......一起来看看 《Effective JavaScript》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码