vue学习(1):将ajax请求封装进JS文件后,调用vux的toast


最近开发项目遇到了一个问题:

    我的项目使用了VUE,并使用VUX框架做ui。在该项目中,我把ajax请求封装在了一个js文件中。


     我希望能够在AJAX请求完成之后,弹出一个提示框告诉用户处理结果,但在封装了ajax的JS文件中无法调用vux的toast组件(提示框组件)(如果有能调用的方法请告诉我QAQ),本菜鸡在查了大量的资料,给自己挖了很多坑之后,终于找到了一个超级简单的解决方法。

解决方法如下:


一、项目结构


--api(文件夹)

---- api.js(封装了ajax的js文件)

--components(存放vue组件的文件夹)

----hello.vue(vue组件,该组件需要调用api.js中的ajax方法)



二、解决方案


在API.JS文件中这样写


import axios from 'axios'


export default{    
components:{       
 axios,
    },
  add_ajax(一些参数){   

   //对参数做一些处理


        return axios.post(url, data)
},
}
    
复制代码

在api.js中,我将axios.post(url, data)这个ajax请求直接return回去。

为啥要这样做呢?因为axios是基于promise的(不知道promise是啥的可以点这里),因此在此处返回的是其实一个promise对象,promise有一个特别好用的.then()方法,在promise对象执行完毕之后,js会帮我们自动执行.then()里面的函数。


因此我们在组件中通过.then()方法中调用vux的toast,就可以在ajax请求完成后,弹出提示窗啦!


下面是组件内调用API的写法:

methods:{add(){
api.add_ajax(一些参数).then((response)=> {         
   if(response.data.result==1){       
         toast.show({ 
               text: '请求成功',
          })                      
  }else{       
       toast.show({         
       text: '请求失败',           
     type:'cancel'  })}                
    }).catch(function (error) {

     //错误处理balabala   
     console.log(error);
      });
}

},}复制代码


三、更优化的解决方式


直接把VUE组件中的toast插件作为一个参数传到ajax对应的函数即可:


api.js中的ajax函数这样写:


add_mybook_with_toast(para,toast)  //toast为传入的VUX组件
{

  axios.post(url, data)  .then(function (response) {     toast.show({
     text:'成功!',

     })    console.log(response);  })  .catch(function (error) {      console.log(error);  });
}复制代码

组件里面这样写:


let toast=this.$vux.toast //将组件传入ajax函数中api.add_mybook_with_toast(para,toast)复制代码


四、其他处理方式



网上的其他大神提出了一些方案,但是由于我初学VUE和es6,所以不大理解,不过我还是按照他的方法试了一下:


1)在js文件中把ajax的结果通过 throw 抛出,然后再在组件中用try catch 语句处理ajax结果:

经过测试,这个方法不靠谱,由于ajax是异步的,如果把调用ajax的函数放入try语句中,不管异步函数报了什么错,catch语句是获取不到的。


以下是伪代码:

try{
ajax()
 //该函数获取AJAX结果后抛出异常
   }
catch(e)
 {
console.log('异常')
  }
//这种方式catch(){}语句永远不会执行复制代码


2)使用拦截器


这种方式是知乎一位同学提出的,(回答链接在这里)但是我不知道拦截器怎么用在组件中所以放弃了。。。。


3)使用非axios的ajax库,通过返回一个promise对象进行处理


这种方式理论上应该是靠谱的,不过请记得,如果使用了axios处理ajax,那么久不再建议使用promise对象了,因为axios本身就自带了peomise属性的,如果再在其上使用peomise,代码会变得很难看懂很复杂- -。


转载于:https://juejin.im/post/5afcf631518825428918f1be

你可能感兴趣的:(vue学习(1):将ajax请求封装进JS文件后,调用vux的toast)