前端笔墨Vue.js

在vue下使用typeScript

2020-01-08  本文已影响0人  夏日望天看云

安装vue脚手架

Vue CLI内置了TypeScript的支持,并且@vue/cli3提供了TypeScript插件,因此搭建支持TypeScript的vue工程非常方便。
因此我们需要先全局安装vue3.0+的脚手架,在node命令行中执行如下命令:

npm install @vue/cli -g

如果安装成功则在命令行中输入vue -V,会输出如下:


image.png

创建项目

使用命令vue create PROJECT_NAME创建vue项目。

vue create tsvue

tsvue为我的项目名称。
进入如下界面:


image.png

我们因为是使用typeScript,所以需要选择自行选择配置,就是我蓝色箭头指向的选项。
然后自行选择:


image.png
我们对以上选择做出如下解释:
1 ? Check the features needed for your project: (Press <space> to select, <a> to toggle all, <i> to invert selection)
2 >( ) Babel //转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。 
3  ( ) TypeScript// TypeScript是一个JavaScript(后缀.js)的超集(后缀.ts)包含并扩展了 JavaScript 的语法,需要被编译输出为 JavaScript在浏览器运行
4  ( ) Progressive Web App (PWA) Support// 渐进式Web应用程序
5  ( ) Router // vue-router(vue路由)
6  ( ) Vuex // vuex(vue的状态管理模式)
7  ( ) CSS Pre-processors // CSS 预处理器(如:less、sass)
8  ( ) Linter / Formatter // 代码风格检查和格式化(如:ESlint)
9  ( ) Unit Testing // 单元测试(unit tests)10 ( ) E2E Testing // e2e(end to end) 测试

接着如下界面
是否使用class-style结构,这里选择Y(yes).


image.png

使用Babel与TypeScript一起用于自动检测的填充,这里选择Y


image.png
路由使用历史模式? 这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面;这里选择Y
image.png
挑选一个css预处理工具,看自己喜好,我选择less
image.png

下一步:代码检查设置 我选择eslint+prettier;


image.png
对应的相关解释:
只进行报错提醒;
不严谨模式;
正常模式;
严格模式;
typescript格式验证工具;(不推荐)
代码检查方式:我选择保存时检查 Lint on save
image.png
选择配置写在单独配置文件中还是package.json中,个人习惯,我选择单独配置文件中In dedicated config files;
image.png

是否保存这次的配置,我选择否N。如果选择是,则会让你再填写一次配置名称。


image.png
项目创建完成。
image.png

使用Ts做一个简单的组件并进行传值

这里引用一个文章vue-property-decorator用法

然后我在App.vue中增加一个路由跳转

<template>
    <div id="app">
        <div id="nav">
            <router-link to="/">Home</router-link>|
            <router-link to="/about">About</router-link>|
            <router-link to="/abc">我自己写的组件</router-link>
        </div>
        <router-view />
    </div>
</template>

<style lang="less">
#app {
    font-family: 'Avenir', Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
}

#nav {
    padding: 30px;
    a {
        font-weight: bold;
        color: #2c3e50;

        &.router-link-exact-active {
            color: #42b983;
        }
    }
}
</style>

接着在router中index.ts中增加一个路由abc

import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from '../views/Home.vue';

Vue.use(VueRouter);

const routes = [
    {
        path: '/',
        name: 'home',
        component: Home,
    },
    {
        path: '/about',
        name: 'about',
        // route level code-splitting
        // this generates a separate chunk (about.[hash].js) for this route
        // which is lazy-loaded when the route is visited.
        component: () => import(/* webpackChunkName: "about" */ '../views/About.vue'),
    },
    {
        path: '/abc',
        name: 'abc',
        component: () => import(/* webpackChunkName: "abc" */ '../views/abc.vue'),
    },
];

const router = new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes,
});

export default router;

abc组件

<template>
    <div>
        我是abc组件
        <p>{{ getvalue }}</p>
        <mycom :name="jim" :age="age" @pass="got"></mycom>
    </div>
</template>

<script lang="ts">
import {Component, Vue, Prop} from 'vue-property-decorator';
import mycom from '../components/mycom.vue';
@Component({
    components: {
        mycom,
    },
})
export default class abc extends Vue {
    jim: string = 'jack';
    age: number = 11;
    getvalue: any = '';
    got(name: any) {
        this.getvalue = name;
    }
}
</script>

mycom子组件
组件需要父组件传name age字段,并把name和age反给父组件,并在父组件中展示。

<template>
   <div class="box">
       <div>
           {{ name + '的年龄' + myage }}
           <p>有一个{{ num }}岁的哥哥</p>
       </div>
       <div>
           <button @click="changeAge">点击改变年龄</button>
       </div>
   </div>
</template>

<script lang="ts">
import {Component, Vue, Prop} from 'vue-property-decorator';
@Component
export default class mycom extends Vue {
   //prop为父组件向子组件传值,!为必须有值,?为可有值
   @Prop({default: 'jack'}) name!: string;
   @Prop({default: 23}) age!: number;
   get num() {
       return this.myage + 4;
   }
   myname: string = this.name;
   myage: number = this.age;
   changeAge(): void {
       this.myage = Math.floor(Math.random() * 100);
       this.$emit('pass', this.myname + this.myage);//子组件向父组件传值
   }
}
</script>

<style lang="less">
.box {
   color: red;
}
</style>

接着在终端命令行中执行 npm run serve就能执行自己的项目了,执行npm run lint --fix可以检查自己的项目并修复一些不符合eslint规则的错误和警告。
这里我们习惯于缩进为4 ,但是执行了npm run lint --fix,会自行格式化我们的代码并把缩进改成了2。再多放查找情况下,我们需要给@typescript-eslint/parser进行配置。
在根目录下新建一个.prettierrc.js文件,将一下内容写入到文件中:

module.exports = {
    // 箭头函数只有一个参数的时候可以忽略括号
    arrowParens: 'avoid',
    // 括号内部不要出现空格
    bracketSpacing: false,
    // 行结束符使用 Unix 格式
    endOfLine: 'lf',
    // true: Put > on the last line instead of at a new line
    jsxBracketSameLine: false,
    // jsx 属性使用双引号
    jsxSingleQuote: false,
    // 行宽
    printWidth: 100,
    // 换行方式
    proseWrap: 'preserve',
    // 分号
    semi: true,
    // 使用单引号
    singleQuote: true,
    // 缩进
    tabWidth: 4,
    // 使用空格缩进
    useTabs: false,
    // 后置逗号,多行对象、数组在最后一行增加逗号
    trailingComma: 'es5',
    // parser: 'babylon',
};

至此自动格式化就是缩进就是4个字符了。

上一篇下一篇

猜你喜欢

热点阅读