Vue中的数据监视原理

1.vue会监视data中所有层次的数据. vue对于配置在data中的所有对象都会以key值作为目标进行监视,不论多少层,都会递归地为每一个key配置getter和setter(通过Object.defineProperty())。 相关阅读 MDN关于defineProperty的说明 2.如何监测对象中的数据? 通过setter实现监视,且要在new Vue时就传入要监测的数据,即在data中提前配置。 (1).对象中后追加的属性,Vue默认不做响应式处理 直接通过修改vm._data或者vm来添加key,并不会配置getter和setter,因此不会做响应式 (2).如需给后添加的属性做响应式,请使用如下API: Vue.set(target,key/index,value)或vm.$set(target,key/index,value)(可以同时修改数组和对象) ​ 特别注意: Vue.set()和vm.$set()不能直接给vm或vm的根数据对象(vm._data)添加属性!!! 3.如何监测数组中的数据? 在数组中直接通过索引的方式修改数组并不会引起Vue的响应,那么要如何做呢?Vue通过包裹数组更新元素的方法(对原数组方法进行修改)实现,本质就是做了两件事: (1). 调用原生对应的方法对数组进行更新. (2). 重新解析模板,进而更新页面. 就包裹了下面的七种数组方法: push() pop() shift() unshift() splice() sort() reverse() 也就是说,通过上面七种方法修改数组,会让Vue做出响应。 例如想要修改数组中索引为0的位置的数据,可以通过 vm.data.arr.splice(0,0,val)或Vue.set(vm.data.arr,0,val)又或者vm.$set(vm.data.arr,0,val),在具体的由Vue管理的方法中this指向的应该就是vm!! 数据劫持 Vue通过setter,getter对数据进行动态监测,其实就是“劫持”了数据😯

Mar 21, 2022 · 1 min · Archai

canvas绘制跟随鼠标移动的线条

在浏览网页时无意中发现了下面这种背景互动的效果: 通过一番周折,最终找到以下实现代码 function randomLine() { function n(n, e, t) { return n.getAttribute(e) || t } function e(n) { return document.getElementsByTagName(n) } function t() { var t = e("script"), o = t.length, i = t[o - 1]; return { l: o, z: n(i, "zIndex", -88), o: n(i, "opacity", .5), c: n(i, "color","0,0,0"), n: n(i, "count", 150) } } function o() { a = m.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, c = m....

Mar 20, 2022 · 3 min · Archai

PHP开发验证码类

利用php中的GD库可以完成验证码类的开发。后盾人教程 PHP创建图像步骤 发送HTTP头信息,声明内容为图像 header('Content-type:image/gif'); header('Content-type:image/jpeg'); header('Content-type:image/png'); 通过设置头信息让浏览器渲染出图像,而不是HTML等其他类型 创建画布 imageCreateTrueColor(width,height); width & height 画布宽高,即为输出图片的尺寸,返回为source 类型,后续操作都是针对这个资源展开。 创建绘图所需要的颜色 imageColorAllocate(img_resource,R,G,B); 颜色从属于创建画布产生的图像资源而存在,后面三个值分别为红绿蓝三个通道的值,为int类型,在0—255之间。 绘图(填充画布、画圆、画方块、画线条、画布上写字) 👉 填充画布(画布背景) imageFill(img_resource,x,y,color); 👉 画圆 //绘制空心圆形 imageEllipse(img_res,x,y,w,h,color); //绘制填充好的实心圆 imageFilledEllipse(img_res,x,y,w,h,color); 绘制 圆心(x,y) 宽 x,高 h,的圆 👉 画方 //空心矩形 imageRectangle(img_res,x1,y1,x2,y2,color); //实心矩形 imageFilledRectangle (img_res,x1,y1,x2,y2,color); (x1,y1)为左上角坐标, (x2,y2)为右下角坐标 👉画线条 imageLine(img_res,x1,y1,x2,y2,color) (x1,y1)与(x2,y2)两点确定的直线。 👉 绘制像素(点) imagesetpixel ( img_res , x , y , color ) 👉 输入文本 imagettftext (img_res , size , angle , x , y , color , fontfile ,text ) 图像资源,字体尺寸,角度,第一个字符的基本点(大概是字符的左下角),Y 坐标(字体基线的位置),颜色 ,字体文件绝对路径(realpath($path)获取),文本字符串(UTF-8 编码)...

Oct 3, 2020 · 3 min · Archai

Git相关

基本命令 git config --global #全局配置 git config #当前仓库配置 mkdir #创建文件夹 ls #列出当前目录下(文件,文件夹) ls -a #所有all rm -rf * #删除当前目录下所有 touch #新建文件 cat #查看文件中的内容 不想`git add . 所有? 配置.gitignore 定义忽略提交的文件,其中 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。 匹配模式最后跟反斜杠(/)说明要忽略的是目录。 可以使用标准的 glob 模式(php)匹配。 从版本库删除 git rm ... #从版本库中删除,本地也会删除 git rm --cached ... #只从版本库删除 从版本库改名 git mv ... ... #改名 log git log -p #显示文件变动信息 git log -1 #最近一次提交 git log --oneline 修改最新一次提交commit描述 git commit --amend -m "xxx" #最近一次提交的描述 也可以把最新的git add ....

Sep 29, 2020 · 1 min · Archai

Javascript正则表达式

关于正则表达式的创建,就不做过多的赘述 ::: tip 由于不知名原因,span标签报错,因此全部替换为[sp] ::: 关于转义 1.字面量形式创建的RegExp 转义形式: \d, \., \s 等 let str='fintinger2592030861.com$323e' let reg=/\d+\.com/ str.match(reg);//2592030861.com 2.对象形式创建的RegExp 转义形式: \\d, \\., \\s等 let str = 'fintinger2592030861.com$323e' let reg = new RegExp('\\d+\\.com', 'g') str.match(reg)//2592030861.com 边界约束 利用^和$分别限制开头和结尾 let str = 'bdhw42556jbjkhb2592030861jrh4jbhkfehrbj43jk32kbbjhb' let reg = /\d{3,6}/ let reg2 = /^\d{3,6}$/ str.match(reg)//42556 str.match(reg2)//null 元字符 元字符 用法 \d & \D 表示数字和非数字 \s & \S 表示空白(空格,换行,Tab制表符等)和非空白 \w & \W 表示字母,数字,下划线和非… ....

Sep 20, 2020 · 2 min · Archai

Es6中的class类

class实质上是对js中继承的封装组合,用一种“语法糖”的形式实现原型链的继承 静态属性/方法 静态方法/属性是指,函数作为对象时,定义在其原型(__proto__)上的方法,而需要实例化继承的动态方法是定义在其原型对象(prototype) 中的,静态方法中的参数都是固定的,直接通过整个构造函数调用,实例化对象并不会继承;而动态方法中的参数会因为实例化对象的不同而产生改变,实例化对象默认是继承的。 function User(){} User.__proto__.show=function(){} console.dir(User) //这里的show()方法就属于静态方法 在class中,利用static定义静态属性/方法 class Admin{ static show(){}//__proto__中 show(){}//prototype中 } console.dir(Admin) 关于class一些注意点 class中声明的方法在prototype对象中,由于默认的属性特征设置,这些方法是不可遍历的! class Admin{ show(){} } console.log( Object.getOwnPropertyDescriptor( Admin.prototype,"show" )) //enumerable: false class中声明方法时,方法之间不用,隔开! class中默认开启严格模式 class中的属性保护 主要可以通过三种途径实现属性保护:Symbol,weakmap,私有属性 1.Symbol /*利用Symbol创建一个受保护的属性的集合对象,无法直接获取,只能通过自定义的get/set方法*/ const protects = Symbol('受保护的属性') class User { constructor(name) { this.name = name this[protects] = { host: 'https://www.fintinger.xyz', token: '5574f1b81bbe4e3847e7a83c0a84a442', password: '123456' } } set host(url) { if (!...

Sep 9, 2020 · 4 min · Archai