Vue+Typescript中在Vue上挂载axios使用时报错
<h3 id="vuetypescript中在vue上挂载axios使用时报错">Vue+Typescript中在Vue上挂载axios使用时报错</h3><p>在<code>vue</code>项目开发过程中,为了方便在各个组件中调用<code>axios</code>,我们通常会在入口文件将axios挂载到vue原型身上,如下:<br>
<code>main.ts</code></p>
<pre><code>import Vue from 'vue'
import axios from './utils/http'
Vue.prototype.$axios = axios;
</code></pre>
<p>这样的话,我们在各个组件中进行请求时,就可以直接使用<code>this.$axios</code>,但是在ts中使用<code>this.$axios</code>进行请求时,会进行报错,如下所示:</p>
<p><img src="https://i.loli.net/2019/08/07/o4WCsktG9LSNfJv.png"></p>
<p>从图中我们可以看出ts在Vue身上检测不到$axios。通过<br>
在网上查阅发现:在ts中,不识别vue下面挂$axios,不可以挂在原型链上。也就是说我们手动在Vue原型身上挂载$axios,ts无法识别到。</p>
<h4 id="解决方法1手动告诉ts忽略这里的类型检测">解决方法1:手动告诉ts忽略这里的类型检测</h4>
<p>虽然ts无法检测到Vue原型身上的<code>prototype</code>,但是实际上我们是挂载成功的,也就是说我们是可以正常使用的,唯一需要解决的是ts的类型检测问题,因此,我们可以指定this为<code>any</code>类型,这样的话就可以避免报错问题。如下所示:</p>
<pre><code>(this as any).$axios
.post("/api/users/login", this.ruleForm)
.then((res: {data:any}) => {}
</code></pre>
<p>但是使用<code>any</code>意味着失去了类型安全保障,并且你得不到工具的支持。</p>
<h4 id="解决方法2使用vue-axios这个包来处理这个挂载问题">解决方法2:使用<code>vue-axios</code>这个包来处理这个挂载问题</h4>
<p>我们可以通过使用<code>vue-axios</code>这个包来处理这个挂载问题。vue-axios 是在axios基础上扩展的插件,在Vue.prototype原型上扩展了$http等属性,可以更加方便的使用axios。</p>
<pre><code># 安装
npmi axios
npm i vue-axios -S
# 注册
Vue.use(axios,vue-axios)
# 使用
this.axios()
</code></pre>
<p>通过使用<code>vue-axios</code>包,我们可以直接使用<code>this.axios</code>进行调用。</p>
<p><img src="https://i.loli.net/2019/08/07/SzlQbJucUrH8B3a.png"></p>
<p>从上面我们可以看出<code>vue-axios</code>帮助我们实现了在<code>Vue</code>原型身上挂载<code>axios</code>,而且能够被ts检测到。这样就完美避免了ts报错的问题。</p>
<h3 id="说明">说明</h3>
<p>使用ts进行开发的过程中,会遇到各种各样的报错问题,希望记录下来,避免下次再次踩坑,也希望帮助其他人。</p><br><br>
来源:https://www.cnblogs.com/yinhaiying/p/11314332.html
頁:
[1]