新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇文章为大家展示了怎么在Vue中利用Proxy监听接口的状态,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
成都创新互联公司长期为近千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为开封企业提供专业的成都网站设计、成都网站制作、外贸网站建设,开封网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。import Vue from 'vue' import {ToastPlugin} from 'vux' import api from './api/api' //引入封装好的api模块,和使用的toast弹出窗,弹窗可以选择任何框架的看起来比较好看的弹窗组件 Vue.use(ToastPlugin); //toast初始化 let vm = new Vue(); //创建实例,是因为toast弹窗依赖它所以这里要创建个实例,去调用弹窗用 Vue.prototype.dilog = function (value) { vm.$vux.toast.show({ text: value || "业务处理成功", type: 'text', width: "5rem", position: 'middle' }); }; //陷阱,只要接口状态改变就会调用此方法 var interceptor = { set: function (recObj, key, value) { vm.dilog(value); //弹出层,value就是api返回的状态值 return this } }; //创建代理以进行侦听 var proxyEngineer = new Proxy(api, interceptor); Vue.prototype.api = proxyEngineer; //将api替换为新的实例
之所以这样做,是因为创建好的封装好的api文件里,不应该在去引入一个vue实例了,如果不用代理,直接在api文件里引入vue那将是巨大的消耗。
class API { constructor(){ this.massages = "业务处理成功!"; //定义信息状态属性 //当前接口错误提示 this.code='000000'||'999999' } post(params, callback, dailog, errcallback = function () { //错误信息回调}) { //dailog 是是否需要在初始化弹窗,比如一个列表通常不需要加载完了弹出一个加载成功,或者获取数据成功什么的。Boolean,通常只需要在点击某事件时候使用,或者是初///始化数据报错使用 //this.code 代表状态码 let config={}; config.data = params.data||{}; var url = `${base}${params.url}.do`; var dailog = dailog; //封装了axios的post方法 return axios.post(url, config.data, config, dailog).then(res => { let rst = res.data; if (rst.code === '000000' || rst.code === '999999') { callback&&callback(rst.result||{}); if (dailog) { //根据dailog 值来判断需不需要弹窗 this.massages = rst.message; } }else{ errcallback && errcallback(); this.massages=rst.message; //监听massages的变化 } //这里如果返回this返回的是代理对象的this return res }).catch(e => { console.log(e) }) } } const api = new API(); export default api //代码核心地方其实就是在类上定义了信息字段,通过massages值变化来反馈信息
我所使用的toast效果。
this.api.post(params, res => { //你需要执行的逻辑 // 再也不需要写什么 //this.$msg(res.value) 这类的代码,代理已经都帮你处理完了 })
这就是我在实际中用到的代理,这个方法不管在多页面还是单页面都适用。当然代码有些粗糙,也没做过多限制,只是说了下思想。以防自己忘记。
顺带说下代理这个特性这里就把《Understanding ECMAScript 6》这本书的内容拿来用了,并稍微添加一些自己的理解。只做记录。
代理与反射是什么?
通过调用 new Proxy() ,你可以创建一个代理用来替代另一个对象(被称为目标),这个代 理对目标对象进行了虚拟,因此该代理与该目标对象表面上可以被当作同一个对象来对待。 代理允许你拦截在目标对象上的底层操作,而这原本是 JS 引擎的内部能力。拦截行为使用了 一个能够响应特定操作的函数(被称为陷阱)。 拦截器的概念比较重要。 Reflect 拦截器有一些反射接口,
拦截的作用其实就是重写内置对象的特定方法。
创建一个简单的代理
let target = {}; let proxy = new Proxy(target, {}); proxy.name = "proxy"; console.log(proxy.name); // "proxy" console.log(target.name); // "proxy" target.name = "target"; console.log(proxy.name); // "target" console.log(target.name); // "target" proxy拦截代理了target
我主要使用到的点
let target = { name: "target" }; let proxy = new Proxy(target, { set(trapTarget, key, value, receiver) { // 忽略已有属性,避免影响它们 if (!trapTarget.hasOwnProperty(key)) { if (isNaN(value)) { throw new TypeError("Property must be a number."); } } // 添加属性 return Reflect.set(trapTarget, key, value, receiver); } }); // 添加一个新属性 proxy.count = 1; console.log(proxy.count); // 1 console.log(target.count); // 1 // 你可以为 name 赋一个非数值类型的值,因为该属性已经存在 proxy.name = "proxy"; console.log(proxy.name); // "proxy" console.log(target.name); // "proxy" // 抛出错误 proxy.anotherName = "proxy";
上述内容就是怎么在Vue中利用Proxy监听接口的状态,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。