vue3.0+ts引入詳細步驟以及語法校驗報錯問題解決辦法
一、前言
前段時間學習了ts,于是用腳手架搭了個vue3.0+ts的項目,引入詳細步驟及語法校驗報錯解決辦法,整理下遇到的問題以及解決辦法,分享給大家。
二、使用
1. 引入ts
Q:在vue項目中編寫tsx函數(shù)式組件提示報錯。在沒有引入ts的項目中,寫tsx語法提示報錯。無法使用 JSX,除非提供了 “–jsx” 標志。ts(17004)
A:
- 先檢查是否安裝ts,cmd輸入 tsc -v, 顯示了版本號即安裝了ts;未安裝則執(zhí)行 npm install -g typescript,全局安裝ts;
- 下載依賴包 yarn add typescript @vue/cli-plugin-typescript;
- 添加tsconfig.json配置文件 。在項目目錄下控制臺輸入tsc --init,該目錄下生成tsconfig.json文件,內(nèi)容替換成以下:
{ "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue", "src/main.js"], "exclude": ["node_modules"], "compilerOptions": { "jsx": "preserve", "noImplicitAny": false, "allowJs": true, "target": "es2016", "module": "commonjs", "baseUrl": "./", "paths": { "@/*": ["./src/*"] }, "types": ["webpack-env"], "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true }, }
- jsconfig.json 文件添加 “jsx”: “preserve” 配置項。
R: 問題解決視圖
2 main.js 修改成 main.ts
Q: 控制臺報錯 Can’t resolve ‘./src/main.js’ in ‘F:\code\st\Vue\v3_ts’
A: 停止運行后重新運行npm run serve 即可
R: 運行成功
3. 修改app.vue 后綴為 .tsx, 修改文件內(nèi)容
import { defineComponent } from 'vue' export default defineComponent({ setup() { return () => ( <router-view /> ) } })
4. 組件引入less
使用import導入的方式引入,代碼如下:
import "./index.less" export default (props, ctx) => { return () => ( <span>123</span> ) }
5. 組件引入圖片
使用import導入的方式引入,代碼如下:
Q:報錯找不到模塊“./img/right.png”或其相應的類型聲明。
A:在src目錄下新增文件 shims.d.ts 文件,內(nèi)容如下:
declare module '*.vue' { import { ComponentOptions } from 'vue' const componentOptions: ComponentOptions export default componentOptions } declare module '*.less'; declare module '*.png'; declare module '*.json';
三、報錯類型及解決辦法
Q:eslint 校驗報錯。
A: vue.config.js 中添加 lintOnSave:false 配置項,重新運行即可。Q: 引入 less 報錯。
A:未下載less依賴包,yarn add less less-loader即可。
Q:使用navigator.getUserMedia 提示報錯 類型“Navigator”上不存在屬性“getUserMedia”;
A:在src目錄下 shims.d.ts 文件中添加如下內(nèi)容即可。
interface Navigator { getUserMedia( constraints: MediaStreamConstraints, successCallback: NavigatorUserMediaSuccessCallback, errorCallback: NavigatorUserMediaErrorCallback ): Promise<MediaStream>; } declare const navigator: Navigator;
- Q:使用dom獲取頁面元素,修改屬性值時報錯。不能將類型“HTMLElement | null”分配給類型“HTMLVideoElement”。不能將類型“null”分配給類型“HTMLVideoElement”。
A:使用斷言,把獲取到的dom元素設置成 HTMLVideoElement 類型,代碼如下:
videoEle = document.getElementById("video") as HTMLVideoElement; videoEle.srcObject = stream; videoEle.onloadedmetadata = function (e) { videoEle.play(); };
暫時遇到了這些,后續(xù)遇到其他語法報錯的問題再更新。
- Q: 父組件傳子組件非必傳參數(shù),在子組件中使用報錯。類型“string | undefined”的參數(shù)不能賦給類型“string”的參數(shù)。
不能將類型“undefined”分配給類型“string”。
A: 使用斷言,設置成對應類型,如
let placeholder = ref<string>(props?.placeholder as string)
- Q: 引入第三方js,報錯 找不到名稱“XLSX”。
A:在src目錄下 shims.d.ts 文件中添加如下內(nèi)容即可。
declare const XLSX: any;
- Q 使用父組件傳入的屬性報錯,property) s: string | undefined,對象可能為“未定義”。ts(2532)
A: 使用 let str = props.s as string; 變量接收屬性值后斷言成對應類型的數(shù)據(jù)類型
import { defineComponent } from "vue"; import VP from "./components/poker" interface Props { s?: string } export default defineComponent({ props: { s: { type: String } }, setup(props: Props, ctx) { let str = props.s as string; return () => ( <> { str.split("").map(v => { return (<VP></VP>) }) } </> ) } })
附:Vue-cli3中使用TS完整代碼案例
<template> <div class="test-container"> {{message}} <input type="button" value="點擊觸發(fā)父級方法" @click="bindSend"/> <input type="button" value="點擊觸發(fā)父級方法" @click="handleSend"/> <input type="button" value="點擊觸發(fā)父級方法" @click="bindSend2"/> <!-- <Hello></Hello> --> </div> </template> <script lang="ts"> import { Component, Prop, Vue, Watch, Emit } from "vue-property-decorator"; import Hello from "./HelloWorld.vue"; // 注明此類為一個vue組件 @Component({ components: { Hello } }) export default class Test extends Vue { // 原有data中的數(shù)據(jù)在這里展開編寫 public message: string = "asd"; //原有props中的數(shù)據(jù)展開編寫 @Prop({ type: Number, default: 1, required: false }) propA?: number @Prop() propB:string //原有computed public get computedMsg(){ return '這里是計算屬性' + this.message; } public set computedMsg(message:string){ } //原有的watch屬性 @Watch('propA',{ deep:true }) public test(newValue:string,oldValue:string){ console.log('propA值改變了' + newValue); } // 以前需要給父級傳值的時候直接方法中使用emit就行了,當前需要通過emit來處理 @Emit() private bindSend():string{ return this.message } @Emit() private bindSend1(msg:string,love:string){ // 如果不處理可以不寫下面的,會自動將參數(shù)回傳 // msg += 'love'; // return msg; } //原有放在methods中的方法平鋪出來 public handleSend():void { this.bindSend1(this.message,'love'); } // 這里的emit中的參數(shù)是表明父級通過什么接受,類似以前的$emit('父級定義的方法') @Emit('test') private bindSend2(){ return '這個可以用test接受'; } } </script>
總結(jié)
到此這篇關(guān)于vue3.0+ts引入詳細步驟以及語法校驗報錯問題解決辦法的文章就介紹到這了,更多相關(guān)vue3.0 ts 引入步驟及語法校驗報錯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決vue2.0動態(tài)綁定圖片src屬性值初始化時報錯的問題
下面小編就為大家分享一篇解決vue2.0動態(tài)綁定圖片src屬性值初始化時報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03