Blockquote 对象 Blockquote 对象代表着一个 HTML 引用(blockquote)块元素。 <blockquote> 标签定义摘自另一个源的块引用。 一个 <blockquote> 元素的内容通常展现为一个左、右两边进行缩进的段落。 在 HTML 文档中的每一个 <blockquote> 标签创建时,都会创建一个 Blockquote 对象。 from:
View Details显式转换 其他数据类型转换成Number 将其他数据类型的值转化为数值时,有几种方法? Number() parseInt() parseFloat() +/- (一元操作符) 说一说上面方法的异同? 它们都是可以将非数值转化为数值,不同点如下:
1 2 3 4 5 |
1. Number() 可以处理Boolean、null、undefined,Object而parseInt不可以 2. 在处理字符串时 - number能处理数字字符串(正负),包括十六进制的数字以及空字符串; - parseInt是从第一个非空格字符开始解析,直到遇到一个非数字字符串,如果第一个不是数字或者负号,parseInt就会返回NaN 3. parseFloat()与parseInt()类似,+/-与Number()类似 |
规则 除以下情况外能正常转化为数字,其余全为NaN
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
1. Boolean值, true--->1 false--->0 2. null--->0 3. 空字符串('')---> 0 4. 数字字符串('123', '1.23', '0xf')---> 123, 1.23, 15 5. 对象则是先调用valueOf方法,看该方法的返回值是否能转化成数字,如果不行则基于这个返回值调用toString方法,再测试改返回值能不能转化成数字 var a = { valueOf: function() { return 'xyxy'; }, toString: function() { return 1; } }; Number(a) // NaN |
其他数据类型转换成String 将其他数据类型的值转化为字符串时,有几种方法? 其他数据类型的值.toString() String(其它数据类型的值) 说一说上面方法的异同?
1 |
null与undefined上没有toString()方法 |
规则 字符串拼接时,加号两边如果出现字符串或者引用类型的值({}、[]、function(){}),都会变成字符串拼接(因为原本应该是把引用类型的值转为数字,但是需要先转为字符串,遇到字符串就直接变成字符串拼接了)
1 2 3 4 |
{} => "[object Object]" function(){} =>"function(){}" {}+0; //0 没有变成字符串拼接的原因:把{}当做块处理了,不参与数学运算 ({}+0); //"[object Object]0" 用括号运算符包起来就是数学运算了 |
1 2 3 4 5 6 |
// 做个题目吧 let result =10 + false +undefined+[]+'Tencent'+null+true+{}; //(10+0+NaN)+''+'Tencent' +'null' +'true' + '[object Object]' //"NaNTencentnulltrue[object Object]" console.log(result) |
其他数据类型转换成Boolean 将其他数据类型的值转化为布尔值时,有几种方法? ! 转换为布尔类型后取反 !! 转换为布尔类型 Boolean 规则?
1 |
只有 0、NaN、空字符串、undefined、null 五个值会变为false,其余都是true |
隐式转换 isNaN、Math方法
1 |
参考显式转换成Number的规则 |
+ 操作
1 2 |
两边的数据有一个是字符串类型则选用字符串拼接操作, 之后才是考虑数学计算的加操作 |
== 「类型一样的几个特殊点」
1 2 3 |
{} == {} : false 说明:对象(引用类型的值)比较的是堆内存的地址 [] == [] : false 同上 NaN == NaN : false |
2.「类型不一样的转换规则」
1 2 3 4 5 6 |
1. null == undefined : true 2. null、undefined和其他任何值都不相等即 在比较相等性之前,不能将null与undefined转换成其他任何职 3. 字符串 == 对象 要把对象转换为字符串 4. 剩下如果==两边数据类型不一致,都是需要转换为数字再进行比较 5.注意点: 虽然Number(null)的结果是0,但是null和0 ==比较时并不是转为数字比较的,即验证3中所说 |
作者:妍等等xy 链接:https://juejin.cn/post/6920236688224550925 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
View Details今天逛博客网站 — shoptalkshow,看到这样一个界面,非常有意思: 觉得它的风格很独特,尤其是其中一些边框。 嘿嘿,所以来一篇边框特辑,看看运用 CSS,可以在边框上整些什么花样。 border 属性 谈到边框,首先会想到 border,我们最常用的莫过于 solid,dashed,上图中便出现了 dashed。 除了最常见的 solid,dashed,CSS border 还支持 none,hidden, dotted, double, groove, ridge, inset, outset 等样式。除去 none,hidden,看看所有原生支持的 border 的样式: 基础的就这些,如果希望实现一个其他样式的边框,或者给边框加上动画,那就需要配合一些其他属性,或是脑洞大开。OK,一起来看看一些额外的有意思的边框。 边框长度变化 先来个比较简单的,实现一个类似这样的边框效果: 这里其实是借用了元素的两个伪元素。两个伪元素分别只设置上、左边框,下、右边框,通过 hover 时改变两个伪元素的高宽即可。非常好理解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<span class="hljs-selector-tag">div</span> { <span class="hljs-attribute">position</span>: relative; <span class="hljs-attribute">border</span>: <span class="hljs-number">1px</span> solid <span class="hljs-number">#03A9F3</span>; &::before, &::after { <span class="hljs-attribute">content</span>: <span class="hljs-string">""</span>; <span class="hljs-attribute">position</span>: absolute; <span class="hljs-attribute">width</span>: <span class="hljs-number">20px</span>; <span class="hljs-attribute">height</span>: <span class="hljs-number">20px</span>; } &<span class="hljs-selector-pseudo">::before</span> { <span class="hljs-attribute">top</span>: -<span class="hljs-number">5px</span>; <span class="hljs-attribute">left</span>: -<span class="hljs-number">5px</span>; <span class="hljs-attribute">border-top</span>: <span class="hljs-number">1px</span> solid <span class="hljs-built_in">var</span>(--borderColor); <span class="hljs-attribute">border-left</span>: <span class="hljs-number">1px</span> solid <span class="hljs-built_in">var</span>(--borderColor); } &<span class="hljs-selector-pseudo">::after</span> { <span class="hljs-attribute">right</span>: -<span class="hljs-number">5px</span>; <span class="hljs-attribute">bottom</span>: -<span class="hljs-number">5px</span>; <span class="hljs-attribute">border-bottom</span>: <span class="hljs-number">1px</span> solid <span class="hljs-built_in">var</span>(--borderColor); <span class="hljs-attribute">border-right</span>: <span class="hljs-number">1px</span> solid <span class="hljs-built_in">var</span>(--borderColor); } &<span class="hljs-selector-pseudo">:hover</span><span class="hljs-selector-pseudo">::before</span>, &<span class="hljs-selector-pseudo">:hover</span><span class="hljs-selector-pseudo">::after</span> { <span class="hljs-attribute">width</span>: <span class="hljs-built_in">calc</span>(<span class="hljs-number">100%</span> + <span class="hljs-number">9px</span>); <span class="hljs-attribute">height</span>: <span class="hljs-built_in">calc</span>(<span class="hljs-number">100%</span> + <span class="hljs-number">9px</span>); } } <span class="copy-code-btn">复制代码</span> |
CodePen Demo — width border animation 接下来,会开始加深一些难度。 虚线边框动画 使用 dashed 关键字,可以方便的创建虚线边框。
1 2 3 4 5 |
<span class="hljs-selector-tag">div</span> { <span class="hljs-attribute">border</span>: <span class="hljs-number">1px</span> dashed <span class="hljs-number">#333</span>; } <span class="copy-code-btn">复制代码</span> |
当然,我们的目的是让边框能够动起来。使用 dashed 关键字是没有办法的。但是实现虚线的方式在 CSS 中有很多种,譬如渐变就是一种很好的方式:
1 2 3 4 5 6 |
<span class="hljs-selector-tag">div</span> { <span class="hljs-attribute">background</span>: <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">90deg</span>, #<span class="hljs-number">333</span> <span class="hljs-number">50%</span>, transparent <span class="hljs-number">0</span>) repeat-x; <span class="hljs-attribute">background-size</span>: <span class="hljs-number">4px</span> <span class="hljs-number">1px</span>; <span class="hljs-attribute">background-position</span>: <span class="hljs-number">0</span> <span class="hljs-number">0</span>; } <span class="copy-code-btn">复制代码</span> |
看看,使用渐变模拟的虚线如下: 好,渐变支持多重渐变,我们把容器的 4 个边都用渐变表示即可:
1 2 3 4 5 6 7 8 9 10 |
<span class="hljs-selector-tag">div</span> { <span class="hljs-attribute">background</span>: <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">90deg</span>, #<span class="hljs-number">333</span> <span class="hljs-number">50%</span>, transparent <span class="hljs-number">0</span>) repeat-x, <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">90deg</span>, #<span class="hljs-number">333</span> <span class="hljs-number">50%</span>, transparent <span class="hljs-number">0</span>) repeat-x, <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">0deg</span>, #<span class="hljs-number">333</span> <span class="hljs-number">50%</span>, transparent <span class="hljs-number">0</span>) repeat-y, <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">0deg</span>, #<span class="hljs-number">333</span> <span class="hljs-number">50%</span>, transparent <span class="hljs-number">0</span>) repeat-y; <span class="hljs-attribute">background-size</span>: <span class="hljs-number">4px</span> <span class="hljs-number">1px</span>, <span class="hljs-number">4px</span> <span class="hljs-number">1px</span>, <span class="hljs-number">1px</span> <span class="hljs-number">4px</span>, <span class="hljs-number">1px</span> <span class="hljs-number">4px</span>; <span class="hljs-attribute">background-position</span>: <span class="hljs-number">0</span> <span class="hljs-number">0</span>, <span class="hljs-number">0</span> <span class="hljs-number">100%</span>, <span class="hljs-number">0</span> <span class="hljs-number">0</span>, <span class="hljs-number">100%</span> <span class="hljs-number">0</span>; } <span class="copy-code-btn">复制代码</span> |
效果如下: OK,至此,我们的虚线边框动画其实算是完成了一大半了。虽然 border-style: dashed 不支持动画,但是渐变支持呀。我们给上述 div 再加上一个 hover 效果,hover 的时候新增一个 animation 动画,改变元素的 background-position 即可。
1 2 3 4 5 6 7 8 9 10 |
<span class="hljs-selector-tag">div</span><span class="hljs-selector-pseudo">:hover</span> { <span class="hljs-attribute">animation</span>: linearGradientMove .<span class="hljs-number">3s</span> infinite linear; } <span class="hljs-keyword">@keyframes</span> linearGradientMove { 100% { <span class="hljs-attribute">background-position</span>: <span class="hljs-number">4px</span> <span class="hljs-number">0</span>, -<span class="hljs-number">4px</span> <span class="hljs-number">100%</span>, <span class="hljs-number">0</span> -<span class="hljs-number">4px</span>, <span class="hljs-number">100%</span> <span class="hljs-number">4px</span>; } } <span class="copy-code-btn">复制代码</span> |
OK,看看效果,hover 上去的时候,边框就能动起来,因为整个动画是首尾相连的,无限循环的动画看起来就像是虚线边框在一直运动,这算是一个小小的障眼法或者小技巧: 这里还有另外一个小技巧,如果我们希望虚线边框动画是从其他边框,过渡到虚线边框,再行进动画。完全由渐变来模拟也是可以的,如果想节省一些代码,使用 border 会更快一些,譬如这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="hljs-selector-tag">div</span> { <span class="hljs-attribute">border</span>: <span class="hljs-number">1px</span> solid <span class="hljs-number">#333</span>; &:hover { <span class="hljs-attribute">border</span>: none; <span class="hljs-attribute">background</span>: <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">90deg</span>, #<span class="hljs-number">333</span> <span class="hljs-number">50%</span>, transparent <span class="hljs-number">0</span>) repeat-x, <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">90deg</span>, #<span class="hljs-number">333</span> <span class="hljs-number">50%</span>, transparent <span class="hljs-number">0</span>) repeat-x, <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">0deg</span>, #<span class="hljs-number">333</span> <span class="hljs-number">50%</span>, transparent <span class="hljs-number">0</span>) repeat-y, <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">0deg</span>, #<span class="hljs-number">333</span> <span class="hljs-number">50%</span>, transparent <span class="hljs-number">0</span>) repeat-y; <span class="hljs-attribute">background-size</span>: <span class="hljs-number">4px</span> <span class="hljs-number">1px</span>, <span class="hljs-number">4px</span> <span class="hljs-number">1px</span>, <span class="hljs-number">1px</span> <span class="hljs-number">4px</span>, <span class="hljs-number">1px</span> <span class="hljs-number">4px</span>; <span class="hljs-attribute">background-position</span>: <span class="hljs-number">0</span> <span class="hljs-number">0</span>, <span class="hljs-number">0</span> <span class="hljs-number">100%</span>, <span class="hljs-number">0</span> <span class="hljs-number">0</span>, <span class="hljs-number">100%</span> <span class="hljs-number">0</span>; } } <span class="copy-code-btn">复制代码</span> |
由于 border 和 background 在盒子模型上位置的差异,视觉上会有一个很明显的错位的感觉: 要想解决这个问题,我们可以把 border 替换成 outline,因为 outline […]
View DetailsYou are trying to create a new angular, react, vue app, and you end up with an error message saying: npm ERR! Unexpected end of JSON input while parsing near There’s a high chance that your npm cache been damaged. Try:
1 |
npm cache clean --force |
If you are a windows user, try deleting all files in this folder:
1 |
C:\Users{{your-username}}\AppData\Roaming\npm-cache |
Then…
1 |
npm cache verify |
If that doesn’t work, try updating to the lastest (understand the risks)
1 |
npm i npm@latest -g |
I hope this helps! from:https://dev.to/rishiabee/npm-err-unexpected-end-of-json-input-while-parsing-near-743
View Details前言 【类】和【接口】是 JavaScript 未来的方向,我们的 API 调用也将如此,朝着这个方向和业务模块同步分类、同步升级。本文讲的正是 —— Vue 魔法师,如何将 API “类化”? 万物皆模块,万物可归类。闲言少叙,直接正题。 分类 API 环境: Vue2+ 或 Vue3+ 咱这里直接 VueCLI 迅速快捷构建
1 |
vue create vue-api-module |
得到如下目录
1 2 3 4 5 |
--src ----store ------index.js ----App.vue ----main.js |
然后新建文件 api.js 如下,
1 2 3 4 5 6 7 |
--src ----services ------api.js ----store ------index.js ----App.vue ----main.js |
基础类 API 我们先创建一个基础类如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class BaseApiService { baseUrl = "https://jsonplaceholder.typicode.com"; resource; constructor(resource) { if (!resource) throw new Error("Resource is not provided"); this.resource = resource; } getUrl(id = "") { return `${this.baseUrl}/${this.resource}/${id}`; } handleErrors(err) { // 处理错误: console.log({ message: "Errors is handled here", err }); } } |
baseUrl:设置请求根路径; resource:来源; getUrl:获取链接函数,包含 baseUrl、resource、id; handleErrors:处理错误函数; 只读类 API 然后,我们再创建一个子类:包含 fetch、get 只读方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class ReadOnlyApiService extends BaseApiService { constructor(resource) { super(resource); } async fetch(config = {}) { try { const response = await fetch(this.getUrl(), config); return await response.json(); } catch (err) { this.handleErrors(err); } } async get(id) { try { if (!id) throw Error("Id 不合法"); const response = await fetch(this.getUrl(id)); return await response.json(); } catch (err) { this.handleErrors(err); } } } |
fetch:获取数据; get:通过 id 获取数据; 写入类 API 接着,我们再创建一个包含可读写方法的子类:post、put、delete
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
class ModelApiService extends ReadOnlyApiService { constructor(resource) { super(resource); } async post(data = {}) { try { const response = await fetch(this.getUrl(), { method: "POST", body: JSON.stringify(data) }); const { id } = response.json(); return id; } catch (err) { this.handleErrors(err); } } async put(id, data = {}) { if (!id) throw Error("Id 不合法"); try { const response = await fetch(this.getUrl(id), { method: "PUT", body: JSON.stringify(data) }); const { id: responseId } = response.json(); return responseId; } catch (err) { this.handleErrors(err); } } async delete(id) { if (!id) throw Error("Id 不合法"); try { await fetch(this.getUrl(id), { method: "DELETE" }); return true; } catch (err) { this.handleErrors(err); } } } |
post:创建数据; put:更新数据; delete:删除数据; 继承 让我们看看两个简单的继承示例:
1 2 3 4 5 |
class UsersApiService extends ReadOnlyApiService { constructor() { super("users"); } } |
1 2 3 4 5 |
class PostsApiService extends ModelApiService { constructor() { super("posts"); } } |
【UsersApiService 类】继承了只读类 API —— ReadOnlyApiService,可以使用 fetch、get 两种方法。而 【PostsApiService 类】继承了读写类 API —— ModelApiService,可以使用 fetch、get、post、put、delete 五种方法。 我们也可以根据业务来写继承 API 类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class AlbumsApiService extends ModelApiService { constructor() { super("albums"); } async uploadImage() { /* 这里可以写你的上传图片逻辑 */ console.log({ message: "图片上传成功!" }); return true; } async triggerError() { try { throw Error(" API 模块调用错误!"); } catch (err) { this.handleErrors(err); } } } |
导出 我们在 api.js 导出这些 […]
View Details
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function fake_click(obj) { var ev = document.createEvent("MouseEvents"); ev.initMouseEvent( "click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null ); obj.dispatchEvent(ev); } function download(name, data) { var urlObject = window.URL || window.webkitURL || window; var downloadData = new Blob([data]); var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a") save_link.href = urlObject.createObjectURL(downloadData); save_link.download = name; fake_click(save_link); } //调用方法 download("save.txt","内容"); |
from:https://www.cnblogs.com/frost-yen/p/10226705.html
View Detailsjs解释数据包 做一个项目,服务器要给我发一个数据包,格式为,前面16位short,后32位int,后面就全是string,我用javascript怎么去把这个数据包解读出来? 用WebSocket,接收到的就是一个Blob对象.而我要给服务器返回的也是这种格式,我又怎么把我的数据封装成这样的数据包? ——解决方案——————--
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
var reader = { readAs: function(type,blob,cb){ var r = new FileReader(); r.onloadend = function(){ if(typeof(cb) === 'function') { cb.call(r,r.result); } } try{ r['readAs'+type](blob); }catch(e){} } } function parseBlob(blob){ var shortVar, intVar, stringVar; reader.readAs('ArrayBuffer',blob.slice(0,2),function(arr){ shortVar = (new Int16Array(arr))[0]; console.log(shortVar); }); reader.readAs('ArrayBuffer',blob.slice(2,6),function(arr){ intVar = (new Int32Array(arr))[0]; console.log(intVar); }); reader.readAs('Text',blob.slice(6,blob.size,'text/plain;charset=UTF-8'),function(result){ stringVar = result; console.log(stringVar); }); } var buffer = new ArrayBuffer(6);//建立6个字节的缓冲,前两个字节是short,后四个是int var bufferView = new Int16Array(buffer); //建立16位的视图,那么视图的长度应该是3 bufferView[0] = 32767; bufferView[1] = 0; bufferView[2] = 1; //现在buffer中的内容由低位到高位应该是 //11111111 11111110 00000000 00000000 100000000 00000000 var blob = new Blob([bufferView,"words words 文本文本文本文本"]); //构造这个blob类型 //测试一下parseBlob函数是否正确 parseBlob(blob); //32767 //65536 //words words 文本文本文本文本 //第一个short是32767 //第二个int,前16位为0,第17位为1,所以结果是65536 //第三个字符串,和我们构造blob的时候一样 |
from:https://blog.csdn.net/woxingwosu0100/article/details/51273523/
View Details
1 2 3 4 5 |
//字符串转ascii码,用charCodeAt(); //ascii码转字符串,用fromCharCode(); var str = "A"; var code = str.charCodeAt(); var str2 = String.fromCharCode(code); |
十进制转二进制
1 2 3 |
var a = "i"; console.log(a.charCodeAt()); //105 console.log(a.charCodeAt().toString(2)); //1101001 |
1 2 3 |
var a = "我"; console.log(a.charCodeAt()); //25105 console.log(a.charCodeAt().toString(2)); //110001000010001 |
1 2 3 4 |
var a = "我们"; console.log(a.length); //2 var list = a.split(""); console.log(list.length); //2<br>console.log(a.charCodeAt().toString(2)); //110001000010001 100111011101100 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//将字符串转换成二进制形式,中间用空格隔开 function strToBinary(str){ var result = []; var list = str.split(""); for(var i=0;i<list.length;i++){ if(i != 0){ result.push(" "); } var item = list[i]; var binaryStr = item.charCodeAt().toString(2); result.push(binartStr); } return result.join(""); } console.log(strToBinary("我们")); //110001000010001 100111011101100 console.log(strToBinary("@%$+")); //1000000 100101 100100 101011 //将二进制字符串转换成Unicode字符串 function binaryToStr(str){ var result = []; var list = str.split(" "); for(var i=0;i<list.length;i++){ var item = list[i]; var asciiCode = parseInt(item,2); var charValue = String.fromCharCode(asciiCode); result.push(charValue); } return result.join(""); } console.log(binaryToStr("110001000010001 100111011101100")); //我们 console.log(binaryToStr("1000000 100101 100100 101011")); //@%$+ |
转载请注明出处:http://www.cnblogs.com/it-deepinmind/ from:https://www.cnblogs.com/it-deepinmind/p/7430025.html
View Details需求由来: 公司项目外链到别公司项目或者网页(通俗的说就是通过别的随意网页跳转至你项目网页),这时公司项目就要区分是从哪个公司或者哪个网页跳转过来的,从而进行不同的接口请求(公司所有接口都要带上请求头)。大部分做法都是设置请求头来区分。做法如下: 废话不多说 直接上代码 通俗易懂: 新建一个配置文件requst.js 内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import axios from 'axios'; // 设置公共请求头 const init = function () { let url = window.location.search.toString() // 获取外链过来的连接参数部分 let arr = [] let obj = {} // 预封装集合 arr = url.split('&') // 对参数切割处理 在封装 arr.forEach(l => { l = l.split('=') obj[l[0]] = l[1] }) // 具体有哪些参数看你们后台定义了哪些 下面的参数有 osType、deviceId、deviceChannel、language ..... axios.defaults.headers.common['deviceChannel'] = 'gclife_bmp_pc'; axios.defaults.headers.common['language'] = window.localStorage.defaultLanguage; // 有则赋值 obj.osType ? axios.defaults.headers.common['osType'] = obj.osType : axios.defaults.headers.common['osType'] = ''; obj.deviceId ? axios.defaults.headers.common['deviceId'] = obj.deviceId : axios.defaults.headers.common['deviceId'] = ''; . . . } export default { init } |
接下来就是在main.js引入就行了 如下:
1 2 3 |
// 引入请求头文件 import request from './request' request.init() // 请求头初始化 |
上诉内容就是设置公共请求头的内容了。 from:https://www.cnblogs.com/ljx20180807/p/9766699.html
View Details方法一(常规) 父组件传递数据到子组件; 子组件将数据转成本地数据
1 2 3 4 5 6 |
props: ['name'], data() { return { iName: this.name } }, |
但是此时,父组件如果更新了name 值,但是子组件中的 iName 不会随之更改;所以要监听父组件传入数据的变化,随之更新子组件;
1 2 3 4 5 6 |
watch: { // 监听父组件传入的数据,更新到本地 name(newVal, oldVal){ this.iName = newVal; } }, |
此时,父组件更新 name ,子组件展示出来的数据(iName)会随之变化,但是子组件修改数据,父组件不会变化,所以需要监听子组件数据(iName)的变化,通知父组件进行更新
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 子组件中的监听 watch: { // 监听父组件传入的数据,更新到本地 name(newVal, oldVal){ this.iName = newVal; }, // 监听本地数据的变化,通知父组件更新 iName(newVal, oldVal) { this.$emit('update', newVal); } }, // 父组件中的更新 <test :name="name" @update="update"/> methods: { update(str) { this.name = str; } }, |
方法二(自定义 v-model 双向数据绑定) 自定义组件中使用 v-model 进行双向数据绑定,相当于;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<test v-model="selected" /> 相当于 <test :value="selected" @input="data=> selected=data"/> 所以子组件需要做的事情就是 1. 接收 value 数据 props: ['value'], 2. 将value 转成本地数据 data() { return { checked: this.value } }, 3. 监听 value 的变化,更新到本地数据, 监听 本地数据的变化,使用 input 事件通知父组件更新 watch: { value(newVal){ this.checked = newVal; }, checked(newVal){ this.$emit('input', newVal) } }, |
方法三(.sync 修饰符)
1 |
<input :title.sync="xx"/> |
拆开后
1 |
<input @update:title="data => xx=data" :title="xx"/> |
from:https://blog.csdn.net/qq_39125684/article/details/90380268
View Details