追风

我的前端之路


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

ajax封装

发表于 2019-05-21 | 分类于 前端三剑客

ajax

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
;(function anonymous(window) {
function AJAX(options) {
return new init(options);
}

let init = function init(options = {}) {
//=>INIT PARAM
let {
url,
method = 'GET',
data = null,
dataType = 'JSON',
async = true,
cache = true,
success,
error
} = options;

//=>MOUNT:把配置项挂载到实例上
['url', 'method', 'data', 'dataType', 'async', 'cache', 'success', 'error'].forEach(item => {
this[item] = eval(item);
});

//=>SEND:发送AJAX请求
this.sendAjax();
};

AJAX.prototype = {
constructor: AJAX,
init,
//=>发送AJAX请求
sendAjax() {
this.handleData();
this.handleCache();

//=>SEND
let {method, url, async, error, success, data} = this,
xhr = new XMLHttpRequest;
xhr.open(method, url, async);
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
//=>ERROR
if (!/^(2|3)\d{2}$/.test(xhr.status)) {
error && error(xhr.statusText, xhr);
return;
}
//=>SUCCESS
let result = this.handlDataType(xhr);
success && success(result, xhr);
}
};
xhr.send(data);
},
//=>处理DATA-TYPE
handlDataType(xhr) {
let dataType = this.dataType.toUpperCase(),
result = xhr.responseText;
switch (dataType) {
case 'TEXT':
break;
case 'JSON':
result = JSON.parse(result);
break;
case 'XML':
result = xhr.responseXML;
break;
}
return result;
},
//=>处理CACHE
handleCache() {
let {url, method, cache} = this;
if (/^GET$/i.test(method) && cache === false) {
//=>URL末尾追加时间辍
url += `${this.check()}_=${+(new Date())}`;
this.url = url;
}
},
//=>处理DATA
handleData() {
let {data, method} = this;
if (!data) return;
//=>如果是个OBJECT对象,我们把它转换为x-www-form-urlencoded这种模式,方便后期传递给服务器
if (typeof data === 'object') {
let str = ``;
for (let key in data) {
if (data.hasOwnProperty(key)) {
str += `${key}=${data[key]}&`;
}
}
data = str.substring(0, str.length - 1);
}

//=>根据请求方式不一样,传递给服务器的方式也不同
if (/^(GET|DELETE|HEAD|TRACE|OPTIONS)$/i.test(method)) {
this.url += `${this.check()}${data}`;
this.data = null;
return;
}
this.data = data;//=>POST系列
},
//=>检测URL中是否存在问号
check() {
return this.url.indexOf('?') > -1 ? '&' : '?';
}
};

init.prototype = AJAX.prototype;
window.ajax = AJAX;
})(window);
阅读全文 »

git常用命令

发表于 2019-05-16 | 分类于 git

git使用指南

​ 公司一直是使用git作为代码管理,现在整理一些常用的git命令,供大家查看,不再依赖图形化工具

基本使用

1、克隆仓库

克隆仓库会下载仓库完整的文件、分支和历史记录。

1
git clone [<options>] [--] <repo> [<dir>]
1
2
3
4
# 克隆完整的仓库到 ./git-learning 目录下
git clone git@github.com:x-cold/git-learning.git
# 只克隆 dev 分支到 ./dev 目录下
gti clone -b dev git@github.com:x-cold/git-learning.git dev

2、将文件变更记录写入到本地的索引库

1
git add [<option>] [--] [pathsec]...
1
2
3
4
# 添加当前目录下所有文件
git add .
# 添加部分文件
git add src/ app/ index.js

3、提交变更到工作区

1
git commit [<options>] [--] <pathsec>...
1
2
3
4
5
6
# 最普通的提交
git commit -m'feat: support canvas'
# 修改当前的 commit message
git commit --amend
# 重置当前的 commit author 和 message
git commit --amend --reset-author

4、推送代码到远程仓库

1
git push [<options>] [<repository>] [<refspec>...]]
1
2
3
4
# 提交本地仓库当前分支到远程仓库的 master 分支
git push origin master
# 提交本地仓库 dev 分支到远程的 master 分支
git push origin master:dev

​ Git 是一个分布式的版本控制工具,因此远程和本地可以视为两个独立的 Git 仓库。上图是一张经典的 Git 中的数据流与存储级别的介绍,其中储存级别主要包含几部分:

  • 工作区 (Working Files),指的是我们时刻在编辑的文件的目录,通常来说我们修改文件都是在工作区体现的
  • 暂存区(Stage),暂存将本地的修改,然后提交到本地仓库
  • 本地仓库(Local),commit 后 形成的历史记录区
  • 远程仓库

总体的流程就是::工作区 -> 暂存区 -> 本地仓库 -> 远程仓库

阅读全文 »

Function&Object原型

发表于 2019-05-15 | 分类于 前端三剑客

      深入探究下 Function.proto === Function.prototype 引起的鸡生蛋蛋生鸡问题,并在这个过程中深入了解 Object.prototype、Function.prototype、function Object 、function Function 之间的关系。

Object.prototype

      Object.prototype表示 Object 的原型对象,其 Object.prototype.__proto__ 是 null ,因此 Object.prototype 并不是通过 Object 函数创建的。其实 Object.prototype 是浏览器底层根据 ECMAScript 规范创造的一个对象。

      Object.prototype 就是原型链的顶端(不考虑 null 的情况下),所有对象继承了它的 toString 等方法和属性。
iamge

Function.prototype

      Function.prototype 对象是一个函数(对象),其 [[Prototype]] 内部属性值指向内建对象 Object.prototype。Function.prototype 对象自身没有 valueOf 属性,其从 Object.prototype 对象继承了valueOf 属性。

image

      Function.prototype 的 [[Class]] 属性是 Function,所以这是一个函数,但又不大一样。为什么这么说呢?因为我们知道只有函数才有 prototype 属性,但并不是所有函数都有这个属性,因为 Function.prototype 这个函数就没有。

1
2
3
4
5
6
7
8
9
10
Function.prototype
// ƒ () { [native code] }

Function.prototype.prototype
// undefined
let fun = Function.prototype.bind()
// ƒ () { [native code] }

fun.prototype
// undefined

我的理解是 Function.prototype 是引擎创建出来的函数,引擎认为不需要给这个函数对象添加 prototype 属性,不然 Function.prototype.prototype… 将无休无止并且没有存在的意义。

function Object

      Object 作为构造函数时,其 [[Prototype]] 内部属性值指向 Function.prototype,即

1
2
Object.__proto__ === Function.prototype
// true

阅读全文 »

redux04

发表于 2019-05-11 | 分类于 redux

react-redux梳理

Provider根组件

  • PROVIDER:当前项目的“根”组件
  • 接收通过属性传递进来的STORE,把STOR>挂载到上下文中,这样当前项目中任何一个组>中,想要使用REDUX中的STORE,直接通过上下文>取即可
  • 在组件的RENDER中,把传递给PROVIDE>的子元素渲染
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import React from 'react';
import PropsTypes from 'prop-types';

class Provider extends React.Component{
//=>设置上下文信息类型
static childContextTypes = {
store:PropsTypes.object
}
//=>设置上下文信息值
getChildContext(){
return {
store:this.props.store
}
}

constructor(props,context){
super(props,context)
}

render(){
return this.props.children;
}
}
阅读全文 »

redux03

发表于 2019-05-06 | 分类于 redux

redux梳理

  • createStore:创建REDUX容器的
  • @PARAMS
  • reducer:函数
  • @RETURN
  • store : {
  • getState,
  • dispatch,
  • subscribe
  • }
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
46
47
48
49
50
51
52

function createStore(reducer){
//=>创建一个STORE,STATE用来存储管理的状态信息,LISTEN-ARY用来存储事件池中的方法
//=>STATE不用设置初始值,因为第一次DISPATCH执行REDUCER,STATE没有值,走的是REDUCER中赋值的默认值信息,我们自己会在创建容器的时候就把DISPATCH执行一次!
let state,
listenAry = [];
//=>DISPATCH:基于DISPATCH实现任务派发
function dispatch(action){
//1.执行REDUCER,修改容器中的状态信息(接收REDUCER的返回值,把返回的信息替换原有的STATE),值得注意的是:我们是把返回值全部替换STATE,所有要求REDUCER中在修改状态之前,要先把原始的状态信息克隆一份,在进行单个的属性修改
state = reducer(state,action);

//2.容器中状态信息经过REDUCER修改后,通知事件池中的方法依次执行
for(let i=0;i < listenAry.length; i++){
let item = listenAry[i];
if (typeof item === 'function') {
item();
} else {
listenAry.splice(i, 1);
i--;
}
}
}
//=>GET-STATE:获取容器中的状态信息
function getState(){
//1.我们需要保证返回的状态信息不能和容器中的STATE是同一个堆内存(否则外面获取状态信息后,直接就可以修改容器中的状态了,这不符合DISPATCH->REDUCER才能改状态的规范)
/*//[浅克隆]
AAAFFF111:{vote:BBBFFF111}
{...state} => AAAFFF222:{vote:BBBFFF111}*/
return JSON.parse(JSON.stringify(state));//=>深度克隆对象
}
dispatch({type: '$$INIT_DEFAULT_STATE'});//=>创建容器的时候执行一次DISPATCH,目的是把REDUCER中的默认状态信息赋值给REDUX容器中的状态

//=>SUBSCRIBE:向事件池中追加方法
function subscribe(fn){
//1.向容器中追加方法(重复验证)
let isExit = listenAry.includes(fn);
!isExit ? listenAry.push(fn) : null;
//2.返回一个方法:执行返回的方法会把当前绑定的方法在事件池中移除掉

return function unsubscribe(){
let index = listenAry.indexOf(fn)
// listenAry.splice(index, 1);//=>可能会引发数组塌陷
listenAry[index] = null;
}
}

return {
dispatch,
getState,
subscribe
}
}
阅读全文 »
1…789…15
陈虎

陈虎

记录学习,记录生活,记录点滴

74 日志
12 分类
27 标签
RSS
© 2020 陈虎
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4