鹦鹉螺

即使成功无望 我亦欣然上场


  • 首页

  • 标签

  • 分类

  • 归档

  • 随笔

  • 关于

【Vue学习】vue-router跳转页面

发表于 2019-07-10 | 分类于 Vue

使用 Vue.js 做项目的时候,一个页面是由多个组件构成的,所以在跳转页面的时候,并不适合用传统的 href,于是 vue-router 应运而生。

官方文档: https://router.vuejs.org/zh-cn/essentials/getting-started.html

阅读全文 »

【Vue学习】组件传值

发表于 2019-07-10 | 分类于 Vue

Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据。必须使用特定的方法才能实现组件之间的数据传递。

阅读全文 »

【Vue学习】vue-cli 3.x搭建项目

发表于 2019-07-10 | 分类于 Vue

Vue Cli 3 官方文档:https://cli.vuejs.org/zh/guide/

一、安装 @vue/cli

更新到 3.x 之后,vue-cli 的包名从 vue-cli 改成了 @vue/cli

如果之前全局安装了旧版本的 vue-cli (1.x 或 2.x),首先需要使用以下命令卸载掉

如果没有安装旧版本的 vue-cli 可以跳过卸载直接安装

1
2
3
npm uninstall vue-cli -g
# OR
yarn global remove vue-cli

然后重新安装新版本的 @vue/cli

1
2
3
npm install -g @vue/cli
# OR
yarn global add @vue/cli
阅读全文 »

钩子函数和回调函数的区别

发表于 2019-07-09 | 分类于 Vue

一般认为,钩子函数就是回调函数的一种,其实还是有差异的,差异地方就是:触发的时机不同。

阅读全文 »

移动端页面开发及常用CSS框架

发表于 2019-07-09 | 分类于 HTML , 移动web

了解移动端页面与PC端页面开发的区别,学习移动端页面的开发流程。

阅读全文 »

Vue的生命周期

发表于 2019-07-08 | 分类于 Vue

Vue的生命周期包括beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed 这8个钩子函数。

阅读全文 »

Vue项目部署至GitHub Pages

发表于 2019-07-02 | 分类于 实践过程 , 项目部署

Vue项目部署至GitHub Pages

1.在 vue.config.js 中设置正确的 publicPath。

如果打算将项目部署到 https://<USERNAME>.github.io/ 上 , publicPath 将默认被设为 "/",你可以忽略这个参数。

如果打算将项目部署到 https://<USERNAME>.github.io/<REPO>/ 上, (换句话说 仓库地址为 https://github.com/<USERNAME>/<REPO>), 可将 publicPath 设为 "/<REPO>/" 。 举个例子, 如果仓库名字为 “my-project”,vue.config.js 的内容应如下所示:

1
2
3
4
5
module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? '/my-project/'
: '/'
}

注意:此处是将原来的vue.config.js文件中的所有内容删除,然后复制上述内容进去,修改仓储名称即可

阅读全文 »

前端常见跨域解决方案

发表于 2019-06-22 | 分类于 实践过程 , 后端相关

转载自前端常见跨域解决方案(全)

什么是跨域?

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。

广义的跨域:

1
2
3
1.) 资源跳转: A链接、重定向、表单提交
2.) 资源嵌入: <link>、<script>、<img>、<frame>等dom标签,还有样式中background:url()、@font-face()等文件外链
3.) 脚本请求: js发起的ajax请求、dom和js对象的跨域操作等

其实我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景。

阅读全文 »

call,apply,bind三者的区别

发表于 2019-06-20 | 分类于 含义理解

为什么要改变this指向?

我们知道bind,call,apply的作用都是用来改变this指向的,那为什么要改变this指向呢?请看下面的例子:

1
2
3
4
5
6
7
8
9
var name="lucy";
let obj={
name:"martin",
say:function () {
console.log(this.name);
}
};
obj.say(); //martin,this指向obj对象
setTimeout(obj.say,0); //lucy,this指向window对象

可以观察到,正常情况下 say 方法中的 this 是指向调用它的 obj 对象的,而定时器 setTimeout 中的 say 方法中的 this 是指向window对象的(在浏览器中),这是因为 say 方法在定时器中是作为回调函数来执行的,因此回到主栈执行时是在全局执行上下文的环境中执行的,但我们需要的是 say 方法中 this 指向obj对象,因此我们需要修改 this 的指向。

apply方法

apply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入,且当第一个参数为null、undefined的时候,默认指向window(在浏览器中),使用apply方法改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次。

日常用法:改变this指向

示例:

回调函数绑定this指向:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var name="martin";
var obj={
name:"lucy",
say:function(year,place){
console.log(this.name+" is "+year+" born from "+place);
}
};
var say=obj.say;
setTimeout(function(){
say.apply(obj,["1996","China"])
} ,0);
//lucy is 1996 born from China,this改变指向了obj
say("1996","China")
//martin is 1996 born from China,this指向window,说明apply只是临时改变一次this指向

小技巧:改变参数传入方式

示例:

求数组中的最大值:

1
2
var arr=[1,10,5,8,3];
console.log(Math.max.apply(null, arr)); //10

其中Math.max函数的参数是以参数列表,如:Math.max(1,10,5,8,3)的形式传入的,因此我们没法直接把数组当做参数,但是apply方法可以将数组参数转换成列表参数传入,从而直接求数组的最大值。

call方法

call方法的第一个参数也是this的指向,后面传入的是一个参数列表(注意和apply传参的区别)。当一个参数为null或undefined的时候,表示指向window(在浏览器中),和apply一样,call也只是临时改变一次this指向,并立即执行。

示例:

1
2
var arr=[1,10,5,8,3];
console.log(Math.max.call(null,arr[0],arr[1],arr[2],arr[3],arr[4])); //10

采纳以参数列表的形式传入,而apply以参数数组的形式传入。

bind方法

bind方法和call很相似,第一参数也是this的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入,call则必须一次性传入所有参数),但是它改变this指向后不会立即执行,而是返回一个永久改变this指向的函数。

示例:

1
2
3
var arr=[1,10,5,8,12];
var max=Math.max.bind(null,arr[0],arr[1],arr[2],arr[3])
console.log(max(arr[4])); //12,分两次传参

可以看出,bind方法可以分多次传参,最后函数运行时会把所有参数连接起来一起放入函数运行。

实现bind方法(面试题):

简易版

1
2
3
4
5
6
7
8
9
Function.prototype.bind=function () { 
var _this=this;
var context=arguments[0];
var arg=[].slice.call(arguments,1);
return function(){
arg=[].concat.apply(arg,arguments);
_this.apply(context,arg);
}
};

完美版

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
//实现bind方法 
Function.prototype.bind = function(oThis) {
if (typeof this !== 'function') {
// closest thing possible to the ECMAScript 5
// internal IsCallable function
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function() {},
fBound = function() {
// this instanceof fBound === true时,说明返回的fBound被当做new的构造函数调用
return fToBind.apply(this instanceof fBound
? this
: oThis,
// 获取调用时(fBound)的传参.bind 返回的函数入参往往是这么传递的
aArgs.concat(Array.prototype.slice.call(arguments)));
};
// 维护原型关系
if (this.prototype) {
// 当执行Function.prototype.bind()时, this为Function.prototype
// this.prototype(即Function.prototype.prototype)为undefined
fNOP.prototype = this.prototype; }
// 下行的代码使fBound.prototype是fNOP的实例,因此
// 返回的fBound若作为new的构造函数,new生成的新对象作为this传入fBound,新对象的__proto__就是fNOP的实例
fBound.prototype = new fNOP();
return fBound;
};
var arr=[1,11,5,8,12];
var max=Math.max.bind(null,arr[0],arr[1],arr[2],arr[3]);
console.log(max(arr[4])); //12

apply,call,bind三者的区别

  • 三者都可以改变函数的this对象指向。
  • 三者第一个参数都是this要指向的对象,如果如果没有这个参数或参数为undefined或null,则默认指向全局window。
  • 三者都可以传参,但是apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入。
  • bind 是返回绑定this之后的函数,便于稍后调用;apply 、call 则是立即执行 。

三次握手和四次挥手

发表于 2019-06-15 | 分类于 含义理解

TCP(Transmission Control Protocol)网络传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,数据传输前建立连接的工作要经过三次握手,数据传输后断开连接的工作要经过四次挥手。

阅读全文 »
1234
鹦鹉螺

鹦鹉螺

前端在路上

34 日志
16 分类
32 标签
GitHub E-Mail
© 2019 鹦鹉螺
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4