自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 Vue项目优化(代码优化)

一、代码优化1、使用keep-aliive包裹动态组件在动态组件中的应用:<keep-alive :include="whiteList" :exclude="blackList" :max="amount"> <component :is="currentComponent"></component></keep-alive>在vue-router中的应用:<keep-alive :include="whiteList"

2020-10-30 11:38:34 423

原创 简单了解CSS Hack

什么是CSS Hack?一般来说,CSS Hack 就是针对不同的浏览器写不同的css。CSS Hack常见的有三种形式:属性Hack、选择符Hack、条件注释Hack (Hack主要针对IE浏览器)例:1、条件Hack条件注释只有在IE浏览器下才能执行,这个代码在非IE浏览下被当做注释视而不见。可以通过IE条件注释载入不同的CSS、JS、HTML和服务器代码等。<!--[if IE]> <p>你在非IE中将看不到我的身影</p><!

2020-10-29 08:32:38 356

原创 事件委托

概念:事件委托 又称 事件代理,就是利用事件冒泡,将子元素的事件绑定到父元素上,如果子元素阻止了事件冒泡,那么事件委托也无法进行。优点:提高性能;减少事件绑定,从而减少内存占用。案例我们经常遇到Vue中v-for一个列表,列表的每一项都绑定了@click处理事件。我们都知道绑定这么多监听,从性能方面来说是不太好的。那我们我们可以通过把每个item的click事件委托给父元素的形式来实现。例如:获取item元素中title值为edit的id//html<table @click="e

2020-10-28 10:32:16 293

原创 Null 与 Undefind 的区别

null表示没有对象,可能将来要赋值一个对象1、 作为函数的参数,表示该函数的参数不是对象2、作为对象原型链的终点undefind表示缺少值,即此处应该有值,但没有定义1、定义了形参,没有传实参,显示undefined2、对象属性名不存在时,显示undefined3、函数没有写返回值,即没有写return,拿到的是undefined4、写了return,但没有赋值,拿到的是undefinednull和undefind的相同点在javaScript中null和Undefind几乎相等

2020-10-28 09:31:14 318

原创 for···in 与 for···of 的区别

for···in 取 key,for···of 取 value遍历数组:for···in 遍历的是key(下标),for···of 遍历的是value(数组的值);var arr = [99,88,66,77];for(let i in arr){ console.log(i); //0,1,2,3}for(let i of arr){ consoel.log(i); //99,88,66,77}遍历字符串: 同遍历数组一样;遍历对象:for···in 遍历的是

2020-10-28 08:58:13 336

原创 常见浏览器内核

浏览器/RunTime内核(渲染引擎)Chrome谷歌之前Webkit,已改Blink内核FireFox火狐GeckoSafari苹果WebkitIETridentOpera欧朋现已改用Google Chrome的Blink内核

2020-10-26 09:36:15 88

原创 文字超过一行(两行)显示省略号

//一行white-space:nowrap;overflow:hidden;text-overflow:ellipsis;//两行 text-overflow: -o-ellipsis-lastline; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical;

2020-10-15 10:03:38 492

原创 闭包——解决闭包缺陷

什么是闭包?可以把闭包简单理解成“定义在一个函数内部的函数”。 即函数嵌套函数,内部函数可以访问外部函数的变量为什么要使用闭包?javascript语言的特殊处就是函数内部可以读取全局变量。我们有时候需要得到函数内的局部变量,但是在正常情况下,这是不能读取到的,这时候就需要用到闭包。闭包的应用场景1、封装对象的私有属性和方法(隐藏数据,做一个简单的缓存工具)2、闭包作用回调函数3、函数节流防抖函数节流:是确保函数特定的时间内最多执行一次。函数防抖:是函数在特定的时间内不被再调用后

2020-10-15 09:51:15 435

原创 图片懒加载原理

什么是图片懒加载?当打开一个有很多图片的页面时,先只加载页面上可视区域的图片,等滚动到页面下面时,再加载所需的图片。这就是图片懒加载。图片懒加载的作用减少或延迟请求数,缓解浏览器的压力,增强用户体验。图片懒加载的基本原理1、设置图片src属性为同一张图片,同时自定义一个data-src属性来存储图片的真实地址2、 页面初始化显示的时候或者浏览器发生滚动的时候判断图片是否在视野中3、 当图片在视野中时,通过js自动改变该区域的图片的src属性为真实地址1.document.documentEl

2020-10-06 08:20:36 199 5

原创 小程序生命周期

可参考:https://www.cnblogs.com/fozero/p/7868560.htmlonLaunch : function () { // 生命周期函数--监听初始化(全局只触发一次)onLoad: function () { // 生命周期函数--监听页面加载 onReady: function () { // 生命周期函数--监听页面初次渲染完成 }, onShow: function () { // 生命周期函数--监听页面显示 }, onHide: f

2020-10-05 09:28:23 86

原创 Vue2和Vue3的区别

1. vue2和vue3双向数据绑定原理发生了改变(重点)vue2 的双向数据绑定是利用ES5 的一个 API Object.definePropert()对数据进行劫持 结合 发布订阅模式的方式来实现的。vue3 中使用了 es6 的 ProxyAPI 对数据代理。相比于vue2.x,使用proxy的优势如下1、defineProperty只能监听某个属性,不能对全对象监听2、可以省去for in、闭包等内容来提升效率(直接绑定整个对象即可)3、可以监听数组,不用再去单独的对数组做特异性操作

2020-09-29 09:00:58 815

原创 keep-alive

keep-alive是什么使用keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。它自身不会渲染一个DOM元素,也不会出现在父组件链中keep-alive的使用场景用户在某个列表页面选择筛选条件过滤出一份数据列表,由列表页面进入数据详情页面,再返回该列表页面,我们希望:列表页面可以保留用户的筛选(或选中)状态。keep-alive就是用来解决这种场景。当然keep-alive不仅仅是能够保存页面/组件的状态这么简单,它还可以避免组件反复创建和渲染,有效提升系统性能。总的

2020-09-28 10:51:20 117

原创 Vue路由守卫

一、全局路由守卫全局路由守卫有三个:全局前置守卫(router.beforeEach )全局后置守卫(router.afterEach)全局解析守卫(router.beforeResolve)router.beforeEach((to, from, next) => { console.log(to) => // 到哪个页面去?console.log(from) => // 从哪个页面来?next() => // 一个回调函数}router.afterEach(

2020-09-28 09:02:07 169

转载 MVVM和MVC

mvvm概念:MVVM是 Model-View-ViewModel 的缩写,分别对应着:数据,视图,视图模型。Model是我们应用中的数据模型,View是我们的UI视图层,通过ViewModle,可以把我们Modle中的数据映射到View视图上,同时,在View层修改了一些数据,也会反应更新我们的Modle。简单理解就是双向数据绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。以vue为例:model 对应 data,view对应 template,vm对应

2020-09-27 19:24:43 90

原创 JS实现图片放大镜效果

1.通过鼠标onmourseover监听鼠标的略过图片,改变透明小区域和放大区域的display,置为block2.通过鼠标onmourseover监听鼠标的略过图片,改变透明小区域和放大区域的display,置为none3.通过event对象获取鼠标的当前坐标位置,即方法event.layerX,event.layer.Y,然后通过放入鼠标事件onmoursemove监听,不停的将透明小区域的top和left置为event.layerX,event.layer.Y的值代码<!DOCTYPE

2020-09-22 22:02:26 203

原创 简述Vue——mixins(混入)的使用

来自官方的描述混入 (mixins): 是一种分发 Vue 组件中可复用功能的非常灵活的方式。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。项目中如何使用混入在vue组件内,如果想将一些公共功能,如组件、方法、钩子函数等复用,混入是一个很好的选择。下面简单介绍一下混入的方式及特点。你可以将一个对象作为混入的选项,在组件中复用。因为vue实例也是对象,所以你可以将vue实例作为混入选项传递进去。我们可以创建一个目录mixins,在创建一个comm

2020-09-22 21:39:22 223

原创 Vue中provide 和inject 依赖注入

provide:Object | () => Objectinject:Array < string > | { [key: string]: string | Symbol | Object }provide:提供依赖。是一个对象,或者是一个返回对象的函数。里面呢就包含要给子孙后代的东西,也就是属性和属性值。inject:注入依赖。一个字符串数组,或是一个对象。属性值可以是一个对象,包含from和default默认值。provide 和 inject 主要在开发高阶插件/组件.

2020-09-22 20:59:57 127

原创 Vue--虚拟dom和diff算法

虚拟DOM:用js来模拟DOM中的节点。1、虚拟 DOM 的最终目标是将虚拟节点渲染到视图上。但是如果直接使用虚拟节点覆盖旧节点的话,会有很多不必要的 DOM 操作。Diff算法a.用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文档当中b.当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异C、把所记录的差异应用到所构建的真正的 DOM 树上,视图就更新了...

2020-09-20 21:36:06 101 1

原创 Vue自定义过滤器filter

过滤器就是一个数据经过了这个过滤器之后出来另一样东西。vue中的过滤器分为两种:局部过滤器和全局过滤器全局过滤器// global-filter是过滤器名称// 函数第一个参数是需要过滤的数据.// 函数第二个参数是给过滤器传递的值. Vue.filter('global-filter',(val,...args)=>{ console.log(`需要过滤的数据是:${val}`) return val + ' 过滤器追加的数据' })var app = ne.

2020-09-20 20:07:52 186

原创 Vue中自定义指令 以及 自定义指令的应用场景

一、Vue中如何自定义指令除了核心功能默认内置的指令 (如v-model 和 v-show等),Vue 也允许注册自定义指令。有的情况下,对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。如何自定义指令1.创建局部指令var app = new Vue({ el: '#app', data: { }, // 创建指令(可以多个) directives: { // 指令名称 dir1: {

2020-09-20 19:46:10 803

原创 Vue -- 修饰符

一、事件修饰符.stop :阻止事件冒泡.prevent :阻止标签默认行为.capture :触发事件捕获行为,(即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理).self :只有当event.target是当前元素自身时触发处理函数.once :事件将只会触发一次.passive :告诉浏览器你不想阻止事件的默认行为使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用v-on:click.prevent.self会阻止所有的点击,而 v-on:click.se

2020-09-18 09:01:46 97

原创 Vue自定义组件

组件的组织通常一个应用会以一棵嵌套的组件树的形式来组织:如图,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。Vue自定义组件自定义组件分为全局组件和局部组件1、全局注册整个项目经常用到的用全局写法,用到比较少的专供特定页面用的使用局部组件。全局组件引入写法:在项目的main.js中,例:import Vue from 'vue';import MyComponent from '@/components/MyComponent.vue'; //

2020-09-18 08:47:46 117

原创 Vue常用指令

v-model 多用于表单元素实现双向数据绑定v-for 格式: v-for="(item,index) in/of 数组json" 循环数组或jsonv-show 显示内容 ,通过display=block/none来控制元素隐藏出现v-hide 隐藏内容 同上v-if 显示与隐藏 (dom元素的删除添加 同angular中的ng-if 默认值为false)v-else-if 必须和v-if连用v-else 必须和v-if连用 不能单独使用 否则报错 模板编译错误v-bind 动态绑定 作.

2020-09-17 09:52:52 63

原创 Vue双向数据绑定的原理

vue.js是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调来渲染视图。步骤1、实现一个数据监听器Obverser,对data中的数据进行监听,若有变化,通知相应的订阅者。2、实现一个指令解析器Compile,对于每个元素上的指令进行解析,根据指令替换数据,更新视图。3、实现一个Watcher,用来连接Obverser和Compile, 并为每个属性绑定相应的订阅

2020-09-17 09:32:46 163

原创 vue生命周期

Vue生命周期beforeCreate创建 createdbeforeMount挂载mountedbeforeUpdate更新updatedbeforeDestroy销毁destroyed生命周期的执行过程简单粗暴的答案直接走起:1、创建vue实例,new Vue();2、在创建Vue实例的时候,执行了init(),在init(初始化)过程中首先调用了beforeCreate钩子函数;3、同时监听data数据,初始化vue内部事件,进行属性和方法的计算;4、以上都干完了,调用C

2020-09-15 22:04:50 68

原创 v-if和 v-show的区别

相同点:都可以动态控制dom元素的显示隐藏区别:v-if: 控制DOM元素的显示隐藏是将DOM元素整个添加或删除;v-show: 控制DOM 的显示隐藏是为DOM元素添加css的样式display,设置none或者是block,DOM元素是还存在的性能对比v-if有更高的切换消耗;v-show有更高的初始渲染消耗使用场景v-if适合运营条件不大可能改变的场景下;v-show适合频繁切换例如:v-if:在请求后台接口,用接口返回数据渲染生成多个元素的时候,由于网速太慢,导致数据刚开始

2020-09-15 21:20:39 83

原创 axios封装和api接口封装

axios封装和api接口封装axios的封装和api接口的统一管理,其主要目的是帮助我们简化代码和利于后期的更新维护。在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中。他有很多优秀的特性,例如拦截请求和响应、取消请求、转换json、客户端防御XSRF等。所以我们的尤大大也是果断放弃了对其官方库vue-resource的维护,直接推荐我们使用axios库一、axios封装步骤安装axios npm

2020-09-14 21:54:24 338

原创 事件监听 事件模型

事件监听事件监听就是让计算机等待某个事件的发生,当这个事件发生之后,对其做出一个相应,如等待鼠标单击按钮,单击发生时打开一个新的页面;但是你写的监听事件发现这件事情后,会进行阻止,让其无法跳转。事件监听涉及到三个类对象1、EventSource(事件源)事件发生的场所2、Event(事件):事件封装界面组件上面发生的特定事件3、EventListener(事件监听器):负责监听事件源发生的事件事件监听用法1、当同一个对象使用.onclick的写法触发多个方法的时候,后一个方法会把前一个方法覆

2020-09-13 21:36:55 154

原创 内存泄漏 垃圾回收

内存泄漏内存泄露是指用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。简单来说是不再用到的内存,没有及时释放。** ▲ 常见的内存泄露造成的原因:**单例造成的内存泄漏由于单例的静态特性使得其生命周期和应用的生命周期一样长,如果一个对象已经不再需要使用了,而单例对象还持有该对象的引用,就会使得该对象不能被正常回收,从而导致了内存泄漏。示例:防止单例导致内存泄漏的实例// 使用了单例模式public class AppMan

2020-09-12 21:13:51 107

原创 JS设计模式

一、什么是设计模型设计模式是在软件开发过程中面临的一般问题的解决方案。设计模式的使用是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化,设计模式是软件工程的基石,项目中合理地运用设计模式可以完美地解决很多问题。二、设计模式的分类创建型模式工厂模式(Factory Pattern)抽象工厂模式(Abstract Factory Pattern)单(Singleton Pattern)建造模式(Builder Pattern)原型模式(Prototype P

2020-09-11 21:59:41 209

原创 javaScript中常用的数组扁平化方法

数组扁平化概念数组扁平化是指将一个多维数组变为一维数组[1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]实现基本方式1、对数组的每一项进行遍历。2、判断该项是否是数组。3、如果该项不是数组则将其直接放进新数组。4、是数组则回到1,继续迭代。5、当数组遍历完成,返回这个新数组。1.常规方式 递归处理Array.prototype.flatten = function () { var resultArr = []; var len

2020-09-10 20:59:46 86

原创 常见的数组排序的方法

1、.冒泡排序法将数组中的相邻两个元素进行比较,将比较大(较小)的数通过两两比较移动到数组末尾(开始),执行一遍内层循环,确定一个最大(最小)的数,外层循环从数组末尾(开始)遍历到开始(末尾)2、选择排序法将要排序的数组分成两部分,一部分是从大到小已经排好序的,一部分是无序的,从无序的部分取出最小的放到已经排序的最后面。3、插入排序法将要排序的数组分成两部分,每次从后面的部分取出索引最小的元素插入到前一部分的适当位置4、快速排序法快速排序法号称是目前最优秀的算法之一,实现思路是,将一个数

2020-09-09 21:36:44 1717

原创 JS中数组去重大全

我们要将数组var arr = [1,1,‘true’,‘true’,true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,‘NaN’, 0, 0, ‘a’, ‘a’,{},{}]中重复的值过滤掉。1、ES6新增的set方法使用ES6中的set是最简单的去重方法,该方法可以说是最完美的方法,就是需要环境支持ES6var arr = [1,1,'true','true',true,true,15,15,fals

2020-09-09 20:01:22 246

原创 数组方法(ES5/ES6)

concat() 连接两个或更多的数组,并返回结果。copyWithin() 从数组的指定位置拷贝元素到数组的另一个指定位置中。entries() 返回数组的可迭代对象。every() 检测数值元素的每个元素是否都符合条件。fill() 使用一个固定值来填充数组。filter() 检测数值元素,并返回符合条件所有元素的数组。find() 返回符合传入测试(函数)条件的数组元素。findIndex() 返回符合传入测试(函数)条件的数组元素索引。forEach() 数组每个元素都执行一次回调函

2020-09-08 22:02:32 633

原创 ES6中的generator函数

一 、函数的定义1、Generator 函数是一个普通函数。它不同于普通函数,是可以暂停执行的,所以函数名之前要加星号,以示区别。2、整个Generator函数就是一个封装的异步任务,或者说是异步任务的容器,异步操作需要暂停的地方,都用yield语句。二、什么是Generator函数1、function 关键字和函数之间有一个星号(*),且内部使用yield表达式定义不同的内部状态。2、调用Generator函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象。f

2020-09-07 09:57:24 88

原创 async和await

定义:async 是“异步”的简写, async 用于申明一个异步函数await 可以认为是 async wait 的简写,await 用于等待一个异步方法执行完成。(异步方法:一个返回promise 对象的表达式)特点:1、asayc作为一个关键字放到函数前面,这样普通函数就变为了异步函数async function timeout() { return 'hello world'}timeout();console.log('虽然在后面,但是我先执行');2、异步asyn

2020-09-07 08:53:40 173 1

原创 Promise的特点以及在项目中的应用

一、了解Promise前言:首字母小写promise:指的是Promise实例对象首字母大写且单数形式Promise:表示Promise构造函数首字母大写且复数形式Promise:指代Promises规范为什么使用promise?同步的方式写异步的代码,用来解决回调地狱问题。此外,promise对象提供统一的接口,使得控制异步操作更加容易。————————————————————————————————————————————————————————1、 promise是什么?Pro

2020-09-06 21:14:38 1064

原创 javaScript中的var、let和const的区别

主要区别1. 是否存在变量提升2. 是否存在暂时性死区3. 是否允许重复声明变量4. 是否存在暂时性死区5. 是否存在块级作用域6. 是否允许修改声明的变量在ES5中,声明变量只有var和function两种形式。但是因为var声明的变量会有一定的缺点。ES6提出了使用let和const声明变量弥补了某些缺点。一、是否存在变量提升var声明的变量存在变量提升(即变量可以在声明之前调用,值为undefined)。let和const不存在变量提升。console.log(f) //unde

2020-09-06 20:02:07 188

原创 学习vuex

一、Vuex是什么?Vuex是一个专门为 Vue.js 应用程序开发的状态管理模式。Vuex的基本思想,就是单向数据流,一起来看一下Vuex实现单向数据流的示意图。二、Vuex的概念五个核心:state: 存储数据的地方actions: 异步操作mutations: 同步操作,只有mutations可以修改state中的数据getters: 相当于 state的计算属性。moduleas模块化 modeA, modeB,modeC三、Vuex状态管理和传统全局变量的不同之处1、Vuex的

2020-09-03 21:10:05 90

原创 JS继承

js继承实现继承首先要提供一个父类** 一、原型链继承**利用原型让一个引用类型继承另一个引用类型的属性和方法。优点:可以向父函数传参,解决了实例被共享的问题缺点:无法向父函数传参,函数不能复用二、借用构造函数在子类型的构造函数中调用超类型构造函数。优点:可以向父函数传参,解决了实例被共享的问题缺点:无法复用,不能继承原型属性或方法三、原型式继承借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。优点:不限制调用方式缺点:无法实现复用,实例会被共享四、组合

2020-09-02 21:24:41 159

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除