第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]

获取JSON对象key及vulue

[不指定 2023/09/01 09:29 | by 刘新修 ]
JavaScript代码
  1. var arr = [  
  2.     {  
  3.         "原告性别": "女",  
  4.         "出生日期": "XX1年1月1X日",  
  5.         "居住地址": "北京市丰台区XXXXX",  
  6.         "所属民族": "汉族",  
  7.         "电话号码": "XXXXXX78",  
  8.         "原告姓名": "XXX"  
  9.     },  
  10.     {  
  11.         "原告性别": "男",  
  12.         "出生日期": "1992年6月10日",  
  13.         "居住地址": "北京市通州区XXXXX",  
  14.         "所属民族": "汉族",  
  15.         "电话号码": "18701519435",  
  16.         "原告姓名": "xxx"  
  17.     }  
  18. ]  
  19.   
  20.   
  21. /*** 遍历数组中的JSON对象 ***/  
  22. for (var i=0; i<arr.length; i++){  
  23.     var keys=Object.keys(arr[i]);  
  24.     console.log('keys:', keys);  
  25. }  
  26.   
  27. //keys: (6) ['原告性别', '出生日期', '居住地址', '所属民族', '电话号码', '原告姓名']  

 平时在写js的时候遇到多层属性嵌套,一般大家敢直接用点使用吗?

有没有开发的时候好好的,某一时刻突然出现一个控制台报错类似:Uncaught TypeError: xxx is not a function
一般这种情况就是没有判断是否有值,如果数据是后端返回的,有可能后端就是没有值或者值的类型不对,这些情况都可能导致出现程序出错,一般我们需要进行判断,常见的判断就是
 
JavaScript代码
  1. if(obj.a && obj.a.b && obj.a.b.c && obj.a.b.c.d){  
  2.     // do something  
  3. }  
 

如果层级太深或者类似判断逻辑太多,写起来有点烦,能把自己蠢哭。。。 下面有一些优雅的方式解决这个问题。

方法1:

扁平化处理:后台处理 / 前端预处理, 防止出现不存在值的情况

方法2:

ES6 使用 CoffeeScript: a?.b?.c?.d

方法3:

JavaScript代码
  1. function checkNested(obj /*, level1, level2, ... levelN*/) {  
  2.   var args = Array.prototype.slice.call(arguments),  
  3.       obj = args.shift();  
  4.   
  5.   for (var i = 0; i < args.length; i++) {  
  6.     if (!obj || !obj.hasOwnProperty(args[i])) {  
  7.       return false;  
  8.     }  
  9.     obj = obj[args[i]];  
  10.   }  
  11.   return true;  
  12. }  
  13.   
  14. var test = {level1:{level2:{level3:'level3'}} };  
  15.   
  16. checkNested(test, 'level1''level2''level3'); // true  
  17. checkNested(test, 'level1''level2''foo'); // false  

方法4:

https://github.com/letsgetrandy/brototype

JavaScript代码
  1. var myURL;  
  2. if (Bro(app).doYouEven('config.environment.buildURL')) {  
  3.     myURL = app.config.environment.buildURL('dev');  
  4. }  

方法5:

lodash

JavaScript代码
  1. var object = { 'a': [{ 'b': { 'c': 3 } }] };  
  2.    
  3. _.get(object, 'a[0].b.c');  
  4. // => 3  
  5.    
  6. _.get(object, ['a''0''b''c']);  
  7. // => 3  
  8.    
  9. _.get(object, 'a.b.c''default');  
  10. // => 'default'  

 

Object.getOwnPropertyNames()

[不指定 2023/08/28 16:29 | by 刘新修 ]

 

JavaScript代码
  1. // 类数组对象  
  2. const obj = { 0: "a", 1: "b", 2: "c" };  
  3. console.log(Object.getOwnPropertyNames(obj).sort());  
  4. // ["0", "1", "2"]  
  5.   
  6. Object.getOwnPropertyNames(obj).forEach((val, idx, array) => {  
  7.     console.log(`${val} -> ${obj[val]}`);  
  8. });  

 

js比较俩个对象是否相等

[不指定 2023/08/28 15:20 | by 刘新修 ]

一、使用Object.getOwnPropertyNames()

该方法和Object.keys()功能一样,不同的地方在于Object.getOwnPropertyNames返回对象本身全部的属性,而Object.keys返回对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)(即返回enumerable为false的属性)

共同点是俩者都不会返回自身原型链上的属性。

JavaScript代码
  1. var obj = {"name":"liuxinxiu","age":18,"info":"1234"}  
  2. var obj2 = obj;  
  3. var obj3 = {"name":"liuxinxiu","age":18,"info":"123"}  
  4. function checkInfo(obj1, obj2){  
  5.     //判断是否指向同一内存  
  6.     if (obj1 === obj2) return true;  
  7.     let bankInfo = Object.getOwnPropertyNames(obj1),  
  8.         oldBankInfo = Object.getOwnPropertyNames(obj2)  
  9.   
  10.     //判断长度不相同直接返回不同  
  11.     if(bankInfo.length !== oldBankInfo.length) return false  
  12.    
  13.     for(let i=0,max=bankInfo.length; i<max; i++){  
  14.         let prop_name = bankInfo[i]  
  15.         if(obj1[prop_name] !== obj2[prop_name]){  
  16.             return false  
  17.         }  
  18.     }  
  19.     return true  
  20. }  
  21. console.log(checkInfo(obj,obj3))  

二、使用Object.keys()或者Object.entries().toString()

Object.keys()是将对象中键先取出来组成数组,然后先比较键。而后通过键在比较值

Object.entries()是将键和值分别组成俩个数组。然后使用toString将键值数组转化为字符串去比较

JavaScript代码
  1.    
  2. checkInfo() {  
  3.     // object.keys  
  4.     let bankInfo = Object.keys(this.params.bankInfo),  
  5.         oldBankInfo = Object.keys(this.params.oldBankInfo)  
  6.     if (oldBankInfo.length !== bankInfo.length) return false  
  7.     for (let i = 0; i <= bankInfo.length - 1; i++) {  
  8.         let key = bankInfo[i];  
  9.         if (!oldBankInfo.includes(key)){  
  10.             return false  
  11.         }   
  12.         if (this.params.oldBankInfo[key] !== this.params.bankInfo[key]){  
  13.             return false  
  14.         }   
  15.     }  
  16.    
  17.     // object.entries  
  18.     console.log(Object.entries(this.params.bankInfo).toString() === Object.entries(this.params.oldBankInfo).toString()) //true  
  19.     console.log(Object.entries(this.params.bankInfo).toString())  //accountType,2,nationality,CHN,bankName,,bankCode,  
  20.     console.log(Object.entries(this.params.oldBankInfo).toString()) //accountType,2,nationality,CHN,bankName,,bankCode,  
  21.    
  22. }  

三、使用JSON.stringify()或。适用于俩个对象属性顺序相同

JavaScript代码
  1. let bankInfo = {  
  2.     accountType : 2,  
  3.     nationality:'CHN',  //国籍  
  4.     bankName : '',      //银行名称  
  5.     bankCode : '',      //银行code  
  6. }  
  7. let oldBankInfo = {  
  8.     accountType : 2,  
  9.     nationality:'CHN',  //国籍  
  10.     bankName : '',      //银行名称  
  11.     bankCode : '',      //银行code  
  12. }  
  13.    
  14. let flag2 = JSON.stringify(bankInfo) == JSON.stringify(oldBankInfo)  
  15. console.log(flag2)  

 

XSS已经成为非常流行的网站攻击方式,为了安全起见,尽量避免用户的输入。可是有些情况下不仅不避免,反而要求鼓励输入,比如写博客。博客园开放性很高,可以运行手写的JS。之前比较著名的例子就是,凡是看到某一篇文章的,都自动关注他。

如果避免跨站攻击的话,我们就得对用户的输入,进行转义。例如<script type='text/javascript'>alert('hello world')</script>。如果直接保存这个字符串的话,然后再输出的话,就会运行JS了。我们需要将这个字符串转义成"&lt;script type='text/javascript'&gt;alert('hello world')&lt;/script&gt;"。

转义,就是一个个字符的匹配,然后转换。看着不难,但是需要转义的字符也不少。另外当字符数量大的时候,效率成为一个问题。下面我写一个函数,让浏览器底层帮我们做到。

JavaScript代码
  1. function stringEncode(str){  
  2.        var div=document.createElement('div');  
  3.        if(div.innerText){  
  4.            div.innerText=str;  
  5.        }else{  
  6.            div.textContent=str;//Support firefox  
  7.        }  
  8.        return div.innerHTML;  
  9. }  

xss漏洞以及防御实现

[不指定 2020/05/22 18:44 | by 刘新修 ]

XSS三种类型

  • 存储型XSS:数据库中存在XSS攻击的数据,若数据未经过任何转义,返回给客户端。被浏览器渲染,就可能导致XSS攻击
  • 反射型XSS:将用户输入的存在XSS攻击的数据,发送给服务端,服务端并未对数据进行存储,也未经过任何转义,直接返回给客户端。被浏览器渲染。就可能导致XSS攻击
  • 纯粹发生在客户端的XSS攻击

XSS攻击演示

假设用户输入的参数为:

JavaScript代码
  1. <script>alert(xss)</script>  

如果后台没有对该数据做任何过滤直接显示到前端<div>标签中的话,源代码就变成了这样:

JavaScript代码
  1. <div><script>alert(xss)</script><div>  

那么在前端显示出来的是一个写着xss的弹窗,就发生了xss攻击

防御方案

我在项目中的主要的防御方案是对数据的过滤,对于数据中的危险字符进行相应的转义:

XML/HTML代码
  1. &----->&  
  2. <-----><  
  3. >----->>  
  4. "----->"  
  5. '----->'  
  6. /----->/  
手机型号尺寸(对角线)物理点宽长比例像素点倍数状态栏高度底部安全距离导航栏高度tabbar高度
iPhone 4/4S3.5英寸320x4800.667640x960@2x20-4449
iPhone 5/5S/5C4英寸320x5680.563640x1136@2x20-4449
iPhone SE4英寸320x5680.563640x1136@2x20-4449
iPhone 64.7英寸375x6670.562750x1334@2x20-4449
iPhone 6 Plus5.5英寸414x7360.5631242x2208@3x20-4449
iPhone 6S4.7英寸375x6670.562750x1334@2x20-4449
iPhone 6S Plus5.5英寸414x7360.5631242x2208@3x20-4449
iPhone 74.7英寸375x6670.562750x1334@2x20-4449
iPhone 7 Plus5.5英寸414x7360.5631242x2208@3x20-4449
iPhone 84.7英寸375x6670.562750x1334@2x20-4449
iPhone 8 Plus5.5英寸414x7360.5631242x2208@3x20-4449
iPhone X5.8英寸375x8120.4621125x2436@3x44344483
iPhone XS5.8英寸375x8120.4621125x2436@3x44344483
iPhone XS Max6.5英寸414x8960.4621242x2688@3x44344483
iPhone XR6.1英寸414x8960.462828x1792@2x44344483
iPhone 116.1英寸414x8960.462828x1792@2x44344483
iPhone 11 Pro5.8英寸375x8120.4621125x2436@3x44344483
iPhone 11 Pro Max6.5英寸414x8960.4621242x2688@3x44344483
iPhone SE 2020款4.7英寸375x6670.562750x1334@2x20-4449

 

Vue props用法详解

[不指定 2019/09/10 14:56 | by 刘新修 ]

Vue props用法详解

组件接受的选项之一 props 是 Vue 中非常重要的一个选项。父子组件的关系可以总结为:

props down, events up

父组件通过 props 向下传递数据给子组件;子组件通过 events 给父组件发送消息。

父子级组件

比如我们需要创建两个组件 parent 和 child。需要保证每个组件可以在相对隔离的环境中书写,这样也能提高组件的可维护性。

这里我们先定义父子两个组件和一个 Vue 对象:

XML/HTML代码
  1. <div id="example">  
  2.   <parent></parent>  
  3. </div>  
JavaScript代码
  1. var childNode = {  
  2.   template: `  
  3.         <div>childNode</div>  
  4.         `  
  5. };  
  6. var parentNode = {  
  7.   template: `  
  8.         <div>  
  9.           <child></child>  
  10.           <child></child>  
  11.         </div>  
  12.         `,  
  13.   components: {  
  14.     child: childNode  
  15.   }  
  16. };  
  17. new Vue({  
  18.   el: "#example",  
  19.   components: {  
  20.     parent: parentNode  
  21.   }  
  22. });  

这里的 childNode 定义的 template 是一个 div,并且内容是"childNode"字符串。
而在 parentNode 的 template 中定义了 div 的 class 名叫 parent 并且包含了两个 child 组件。

静态 props

组件实例的作用域是孤立的。这意味着不能(也不应该)在子组件的模板中直接饮用父组件的数据。要让子组件使用父组件的数据,需要通过子组件的 props 选项。

父组件向子组件传递数据分为两种方式:动态和静态,这里先介绍静态方式。

子组件要显示的用 props 声明它期望获得的数据

修改上例中的代码,给 childNode 添加一个 props 选项和需要的forChildMsg数据;
然后在父组件中的占位符添加特性的方式来传递数据。

JavaScript代码
  1. var childNode = {  
  2.   template: `  
  3.         <div>  
  4.           {{forChildMsg}}  
  5.         </div>  
  6.         `,  
  7.   props: ["for-child-msg"]  
  8. };  
  9. var parentNode = {  
  10.   template: `  
  11.         <div>  
  12.           <p>parentNode</p>  
  13.           <child for-child-msg="aaa"></child>  
  14.           <child for-child-msg="bbb"></child>  
  15.         </div>  
  16.         `,  
  17.   components: {  
  18.     child: childNode  
  19.   }  
  20. };  

命名规范
对于 props 声明的属性,在父组件的 template 模板中,属性名需要使用中划线写法;

子组件 props 属性声明时,使用小驼峰或者中划线写法都可以;而子组件的模板使用从父组件传来的变量时,需要使用对应的小驼峰写法。别担心,Vue 能够正确识别出小驼峰和下划线命名法混用的变量,如这里的forChildMsgfor-child-msg是同一值。

动态 props

在模板中,要动态地绑定父组件的数据到子组件模板的 props,和绑定 Html 标签特性一样,使用v-bind绑定;

基于上述静态 props 的代码,这次只需要改动父组件:

JavaScript代码
  1. var parentNode = {  
  2.   template: `  
  3.         <div>  
  4.           <p>parentNode</p>  
  5.           <child :for-child-msg="childMsg1"></child>  
  6.           <child :for-child-msg="childMsg2"></child>  
  7.         </div>  
  8.         `,  
  9.   components: {  
  10.     child: childNode  
  11.   },  
  12.   data: function() {  
  13.     return {  
  14.       childMsg1: "Dynamic props msg for child-1",  
  15.       childMsg2: "Dynamic props msg for child-2"  
  16.     };  
  17.   }  
  18. };  

在父组件的 data 的 return 数据中的 childMsg1 和 childMsg2 会被传入子组件中,

props 验证

验证传入的 props 参数的数据规格,如果不符合数据规格,Vue 会发出警告。

能判断的所有种类(也就是 type 值)有:
String, Number, Boolean, Function, Object, Array, Symbol

JavaScript代码
  1. Vue.component("example", {  
  2.   props: {  
  3.     // 基础类型检测, null意味着任何类型都行  
  4.     propA: Number,  
  5.     // 多种类型  
  6.     propB: [String, Number],  
  7.     // 必传且是String  
  8.     propC: {  
  9.       type: String,  
  10.       required: true  
  11.     },  
  12.     // 数字有默认值  
  13.     propD: {  
  14.       type: Number,  
  15.       default: 101  
  16.     },  
  17.     // 数组、默认值是一个工厂函数返回对象  
  18.     propE: {  
  19.       type: Object,  
  20.       default: function() {  
  21.         console.log("propE default invoked.");  
  22.         return { message: "I am from propE." };  
  23.       }  
  24.     },  
  25.     // 自定义验证函数  
  26.     propF: {  
  27.       isValid: function(value) {  
  28.         return value > 100;  
  29.       }  
  30.     }  
  31.   }  
  32. });  
  33. let childNode = {  
  34.   template: "<div>{{forChildMsg}}</div>",  
  35.   props: {  
  36.     "for-child-msg": Number  
  37.   }  
  38. };  
  39. let parentNode = {  
  40.   template: `  
  41.           <div class="parent">  
  42.             <child :for-child-msg="msg"></child>  
  43.           </div>  
  44.         `,  
  45.   components: {  
  46.     child: childNode  
  47.   },  
  48.   data() {  
  49.     return {  
  50.       // 当这里是字符串 "123456"时会报错  
  51.       msg: 123456  
  52.     };  
  53.   }  
  54. };  

还可以在 props 定义的数据中加入自定义验证函数,当函数返回 false 时,输出警告。

比如我们把上述例子中的 childNode 的for-child-msg修改成一个对象,并包含一个名叫validator的函数,该命名是规定叫validator的,自定义函数名不会生效。

JavaScript代码
  1. let childNode = {  
  2.   template: "<div>{{forChildMsg}}</div>",  
  3.   props: {  
  4.     "for-child-msg": {  
  5.       validator: function(value) {  
  6.         return value > 100;  
  7.       }  
  8.     }  
  9.   }  
  10. };  

在这里我们给for-child-msg变量设置了validator函数,并且要求传入的值必须大于 100,否则报出警告。

单向数据流

props 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来。这是为了防止子组件五一修改父组件的状态。

所以不应该在子组件中修改 props 中的值,Vue 会报出警告。

JavaScript代码
  1. let childNode = {  
  2.   template: `  
  3.           <div class="child">  
  4.             <div>  
  5.               <span>子组件数据</span>  
  6.               <input v-model="forChildMsg"/>  
  7.             </div>  
  8.             <p>{{forChildMsg}}</p>  
  9.           </div>`,  
  10.   props: {  
  11.     "for-child-msg": String  
  12.   }  
  13. };  
  14. let parentNode = {  
  15.   template: `  
  16.           <div class="parent">  
  17.             <div>  
  18.               <span>父组件数据</span>  
  19.               <input v-model="msg"/>  
  20.             </div>  
  21.             <p>{{msg}}</p>  
  22.             <child :for-child-msg="msg"></child>  
  23.           </div>  
  24.         `,  
  25.   components: {  
  26.     child: childNode  
  27.   },  
  28.   data() {  
  29.     return {  
  30.       msg: "default string."  
  31.     };  
  32.   }  
  33. };  

这里我们给父组件和子组件都有一个输入框,并且显示出父组件数据和子组件的数据。当我们在父组件的输入框输入新数据时,同步的子组件数据也被修改了;这就是 props 的向子组件传递数据。而当我们修改子组件的输入框时,浏览器的控制台则报出错误警告

[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "forChildMsg"

修改 props 数据

通常有两种原因:

  1. prop 作为初始值传入后,子组件想把它当做局部数据来用
  2. prop 作为初始值传入后,由子组件处理成其他数据输出

应对办法是

  1. 定义一个局部变量,并用 prop 的值初始化它

但是由于定义的 ownChildMsg 只能接受 forChildMsg 的初始值,当父组件要传递的值变化发生时,ownChildMsg 无法收到更新。

JavaScript代码
  1. let childNode = {  
  2.   template: `  
  3.           <div class="child">  
  4.             <div>  
  5.               <span>子组件数据</span>  
  6.               <input v-model="forChildMsg"/>  
  7.             </div>  
  8.             <p>{{forChildMsg}}</p>  
  9.             <p>ownChildMsg : {{ownChildMsg}}</p>  
  10.           </div>`,  
  11.   props: {  
  12.     "for-child-msg": String  
  13.   },  
  14.   data() {  
  15.     return { ownChildMsg: this.forChildMsg };  
  16.   }  
  17. };  

这里我们加了一个<p>用于查看 ownChildMsg 数据是否变化,结果发现只有默认值传递给了 ownChildMsg,父组件改变只会变化到 forChildMsg,不会修改 ownChildMsg。

  1. 定义一个计算属性,处理 prop 的值并返回

由于是计算属性,所以只能显示值,不能设置值。我们这里设置的是一旦从父组件修改了 forChildMsg 数据,我们就把 forChildMsg 加上一个字符串"---ownChildMsg",然后显示在屏幕上。这时是可以每当父组件修改了新数据,都会更新 ownChildMsg 数据的。


JavaScript代码
  1. let childNode = {  
  2.   template: `  
  3.           <div class="child">  
  4.             <div>  
  5.               <span>子组件数据</span>  
  6.               <input v-model="forChildMsg"/>  
  7.             </div>  
  8.             <p>{{forChildMsg}}</p>  
  9.             <p>ownChildMsg : {{ownChildMsg}}</p>  
  10.           </div>`,  
  11.   props: {  
  12.     "for-child-msg": String  
  13.   },  
  14.   computed: {  
  15.     ownChildMsg() {  
  16.       return this.forChildMsg + "---ownChildMsg";  
  17.     }  
  18.   }  
  19. };  
  1. 更加妥帖的方式是使用变量存储 prop 的初始值,并用 watch 来观察 prop 值得变化。发生变化时,更新变量的值。
JavaScript代码
  1. let childNode = {  
  2.   template: `  
  3.           <div class="child">  
  4.             <div>  
  5.               <span>子组件数据</span>  
  6.               <input v-model="forChildMsg"/>  
  7.             </div>  
  8.             <p>{{forChildMsg}}</p>  
  9.             <p>ownChildMsg : {{ownChildMsg}}</p>  
  10.           </div>`,  
  11.   props: {  
  12.     "for-child-msg": String  
  13.   },  
  14.   data() {  
  15.     return {  
  16.       ownChildMsg: this.forChildMsg  
  17.     };  
  18.   },  
  19.   watch: {  
  20.     forChildMsg() {  
  21.       this.ownChildMsg = this.forChildMsg;  
  22.     }  
  23.   }  
  24. };  

 

 

vue中 fetch跨域请求

[不指定 2019/08/28 13:52 | by 刘新修 ]

 fetch 是原生javaScript提供的,它可以当作全局变量使用,挂载在window对象身上的

fetch的get请求方法

简单基本的fetch请求(get)

XML/HTML代码
  1. <div id="app">  
  2.     <button @click="getData">get请求</button>  
  3. </div>  
  4.   
  5.   
  6.   
  7. <script>  
  8. 是原生javaScript提供的,它可以当作全局变量使用,挂载在window对象身上的  
  9. new Vue({  
  10.     // fetch   
  11.     el:"#app",  
  12.     methods:{  
  13.            getData(){  
  14.         // var p=fetch();  
  15.         // console.log(p)//fetch方法也是promise对象  
  16.         fetch('./data/name.json')  
  17.         .then( (res) => {  return res.json() } )//对fetch进行格式化,否则读取不到内容  
  18.         .then( (data) => { console.log(data)} )//拿到格式化后的数据data  
  19.         .catch(error=>console.log(error))  
  20.          },  
  21.   
  22.     },  
  23. })   

注意事项:


A: fetch 的 get 请求的参数是直接连接在url上的, 我们可以使用Node.js提供的url或是qureystring模块来将

  Object --> String

B: fetch 的请求返回的是Promise对象,所以我们可以使用.then().catch(),但是要记住.then()至少要写两个, 第一个then是用来格式

XML/HTML代码
  1. 格式化处理的其他方式  
  2. fetch('./data.json')  
  3. .then(res=>{  
  4.     res.json() //格式化json数据  
  5.     //res.text()格式胡文本数据   
  6.     //res.blob()==格式化二进制文件==  
  7. })  
  8. .then( data => console.log(data))  
  9. .catch( error => console.log( error ))  

fetch的post请求方法
代码示例

XML/HTML代码
  1. <div id="app">  
  2.     <button @click="postData">post请求</button>  
  3. </div>  
  4.   
  5.   
  6. <script>  
  7. new Vue({  
  8.     // fetch   
  9.     el:"#app",  
  10.     methods:{  
  11.         postData(){  
  12.             fetch('http://10.31.161.60:8080',{  
  13.                 method:'post',  
  14.                 hearders:new Headers({  
  15.                     //设置请求头,解决跨域问题   
  16.                     'Content-Type':'application/x-www-form-urlencoded'  
  17.                 }),  
  18.                 //解决请求数据类型限制的问题  
  19.                 // body:new URLSearchParams([["a", 1],["b", 2]]).toString()  
  20.             })  
  21.             .then( res => res.text() )  
  22.             .then( data => console.log( data ))  
  23.             .catch( error => console.log( error ))  
  24.   
  25.         }  
  26.     },  
  27. })  

总结

fetch要手动进行一次数据格式化,但是axios是内部进行了数据的格式化

fetch get 方法请求数据,参数要直接连接在url上

fetch 格式化数据 有三种 处理方法

.json() 格式化 json 类型数据, 将 json类型 string 转换成 json 对象

.text() 格式化文本

.blob() 格式化二进制数据

fetch 书写post请求、处理

设置请求头

通过 new URLSearchPrams 来携带参数

vue中http请求

[不指定 2019/08/28 13:31 | by 刘新修 ]

 前后端采用异步接口进行数据交互,传统情况下,我们采用jquery中的$.ajax()方法来进行异步请求。而在vue中我们并没有引入jquery而是采用了vue的插件vue-resource,它同样对异步请求进行了封装,方便我们同服务端进行数据交互。

1、引用及使用

C#代码
  1. cnpm install vue-resource --save-dev   

在项目根目录下/src/main.js中:

JavaScript代码
  1. import VueResource from 'vue-resource'  
  2. Vue.use(VueResource)  

此时在vue文件中就可以使用this.$http()进行网络请求。

2、通常在项目中是需要将http请求进行封装的。

为了封装成全局因此使用vuex。

参照 vue的一些总结 这个文章进行配置vuex

配置成功后,将main.js中的VueResource内容去掉,写在vuex中的store.js中

store.js内容如下

JavaScript代码
  1. import Vue from 'vue'  
  2. import Vuex from 'vuex'  
  3. import VueResource from 'vue-resource'  
  4. Vue.use(Vuex)  
  5. Vue.use(VueResource)  
  6. export default new Vuex.Store({  
  7.   state: {  
  8.     url: 'www.baidu.com'  
  9.   },  
  10.   mutations: {  
  11.     setUrl (state, res) {  
  12.       // 该方法用来改变全局变量的值  
  13.       state.url = res  
  14.     }  
  15.   }  
  16. })  

3、在store.js中封装http请求的方法

JavaScript代码
  1. import Vue from 'vue'  
  2. import Vuex from 'vuex'  
  3. import VueResource from 'vue-resource'  
  4. Vue.use(Vuex)  
  5. Vue.use(VueResource)  
  6. export default new Vuex.Store({  
  7.   state: {  
  8.     // url: 'www.baidu.com'  
  9.   },  
  10.   mutations: {  
  11.     // setUrl (state, res) {  
  12.     //   // 该方法用来改变全局变量的值  
  13.     //   state.url = res  
  14.     // },  
  15.     get(state, data) {  
  16.       Vue.http({  
  17.         method: 'GET',  
  18.         url: data.url,  
  19.         emulateJSON: true  
  20.       })  
  21.         .then(function (success) {  
  22.         // console.log("成功",success)  
  23.           data.success(success.body);  
  24.         }, function (error) {  
  25.         // console.log("错误",error)  
  26.           data.error(error.body);  
  27.         })  
  28.       /* 
  29.       Vue.http.get("http://test.dcsf.hebeiwanteng.com/api/common/wxParking/getNowTime") 
  30.         .then((success)=>{ 
  31.           console.log("成功",success) 
  32.         }) 
  33.         .catch((error)=>{ 
  34.           console.log("失败",error) 
  35.         }) 
  36.       */  
  37.     },  
  38.     post(state, data) {  
  39.       Vue.http({  
  40.         method: 'POST',  
  41.         url: data.url,  
  42.         params: data.data,  
  43.         emulateJSON: true  
  44.       }).then(function (success) {  
  45.           data.success(success.body);  
  46.         }, function (error) {  
  47.           data.error(error.body);  
  48.         })  
  49.     },  
  50.     delete(state, data) {  
  51.       Vue.http({  
  52.         method: 'DELETE',  
  53.         url: data.url,  
  54.         params: data.data,  
  55.         emulateJSON: true  
  56.       }).then(function (success) {  
  57.           data.success(success.body);  
  58.         }, function (error) {  
  59.           data.error(error.body);  
  60.         })  
  61.     },  
  62.     put(state, data) {  
  63.       Vue.http({  
  64.         method: 'PUT',  
  65.         url: data.url,  
  66.         params: data.data,  
  67.         emulateJSON: true  
  68.       }).then(function (success) {  
  69.           data.success(success.body);  
  70.         }, function (error) {  
  71.           data.error(error.body);  
  72.         })  
  73.     },  
  74.   }  
  75. })  

此时封装好了http请求。

 

在vue的文件中调用:

JavaScript代码
  1. <script>  
  2.   import { mapState, mapMutations } from 'vuex'  
  3.   export default {  
  4.     name: 'HelloWorld',  
  5.     data () {  
  6.       return {  
  7.       }  
  8.     },  
  9.     methods: {  
  10.       ...mapMutations(['get','post','delete','put']), //引入方法  
  11.     },  
  12.     created() {  
  13.       let _this = this;  
  14.       _this.get({  
  15.         url:"此处写请求地址",  
  16.         success(success) {  
  17.           console.log("成功",success)  
  18.         },  
  19.         error(error) {  
  20.           console.log("错误",error)  
  21.         }  
  22.       });  
  23.     }  
  24.   }  
  25. </script>  

4、注意:在store.js中使用Vue.http和在vue文件中使用this.$http是一样的。

5、该方法只验证了get请求,其它请求没有做验证。

第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]