vue2.0向vue3.0的过度

839 阅读1分钟

前言

由于公司所有项目使用的都是vue2.0, ts基本没有使用;因此改造项目在vue2.0中使用typescript和 Composition API,也就是ts,js混合开发的一个过度版本,新旧代码分离,渐进性修改;

在vue中如何应用TS

1、安装TS和s-loader

npm install --save-dev typescript 
npm install --save-dev ts-loader

2、配置webpack,

/* vue.config.js */
module.exports = {
  configureWebpack: {
    resolve: {
    	extensions: [`.js`, `.vue`, `.json`, `.ts`]
    },
    module: {
      rules: [
        {
          test: /\.tsx?$/,
          loader: 'ts-loader',
          exclude: /node_modules/,
          options: {
           appendTsSuffixTo: [/\.vue$/] 
          }
        },
      ]
    }
  }
};

3、在根目录建tsconfig.json文件 配置以下内容,

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowJs": true,                      // 允许js
    "allowSyntheticDefaultImports": true,
    "noImplicitAny": false,               // 不进行any语法检查
    "sourceMap": true,
    "baseUrl": ".",
    "types": [
      "webpack-env"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.js",  // 导入js
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx",
    "public/config.js"  // 导入js
  ],
  "exclude": [
    "node_modules"
  ]
}

注意:

1、除了将文件后缀由.js改为.ts外,在.vue组件中需要设置

2、必须包含strict: true(或至少noImplicitThis: truestrict标志的一部分)以利用this组件方法中的类型检查,否则它始终被视为any类型

经过以上配置就可以在我们原本的项目中使用ts文件了

<script lang="ts">
  // ...
</script>

在项目中引入@vue/composition-api

Vue 3 新出的 Composition API 可以优雅的聚集零散业务代码,在vue 2.0的项目中我们也是可以使用的;

1、安装

npm install @vue/composition-api

2、在vue中注册该插件 在使用composition-api前,必须先在vue中注册该插件

import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)

3、使用

在.vue文件中,组件导出时,需要使用defineComponent函数对setup函数进行封装,返回options的对象

import { defineComponent,ref,onMounted  } from '@vue/composition-api';

export default defineComponent({
name:"",
components:{
// ...
} as any,
props:{},
setup(props){
    console.log("props",props)
    const list = ref([])
    const getDataList= ()=>{
       list.value.push(...dataList)
    }
    onMounted(getDataList)
    return {list,getDataList}
}
}),
mounted(){
console.log(this.list)
}