diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0ee1622 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea/* +*.iml \ No newline at end of file diff --git "a/2017/03/01/Angular\345\256\236\346\227\266\347\233\221\346\216\247/index.html" "b/2017/03/01/Angular\345\256\236\346\227\266\347\233\221\346\216\247/index.html" deleted file mode 100644 index eecc595..0000000 --- "a/2017/03/01/Angular\345\256\236\346\227\266\347\233\221\346\216\247/index.html" +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - Angular-AOT - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Angular-AOT

-
- -
-

什么是AOT?

Angular2在早起版本中的打包文件过于庞大, Angular团队为此做的优化, AOT(ahead-of-time)为了编译出更高效的Angular程序
-
1.AOT做了什么?
没有AOT之前是怎么做的
-
-    1.下载资源
-    2.Angular渲染页面(Angular bootstraps)
-    3.Augular进行JIT编译过程,生成我们每个模块的JavaScript。
-    4.应用被渲染(rendered)完成,展示给用户
-
-    Angular2的AOT省去了浏览器中Angular加载后自身的编译过程,即上边的第三步,所以使得应用渲染更加快速
-
-
- -
- -
- - \ No newline at end of file diff --git "a/2017/03/01/JavaScript\345\237\272\347\241\200(1)/index.html" "b/2017/03/01/JavaScript\345\237\272\347\241\200(1)/index.html" deleted file mode 100644 index 0802453..0000000 --- "a/2017/03/01/JavaScript\345\237\272\347\241\200(1)/index.html" +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - JavaScript基础(1) - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

JavaScript基础(1)

-
- -
-

1.prototype与proto的区别

prototype是函数的属性
-    _proto_是对象的属性
-    函数也是对象,所以函数两者都有
-

2.什么是原型链

_proto_是对象的属性,在JS中一切都是对象,所以会形成一条链,递归访问最终到头,最终为null,
-当JS引擎查找对象的属性时,会先查找对象本身,之后顺着原型连向上查找
-

3.什么是闭包

闭包就是能够读取其他函数内部变量的函数,闭包就是将函数内部和函数外部连接起来的一座桥梁
-    function f(){
-    var n=0;
-    function d(){
-      console.log(n);
-    }
-    return n;
-  }
-
-闭包作用:1.读取函数内部变量;2.变量值不被回收,始终放在内存;
-注意点:便面过多使用,以免内存溢出
-

4.JavaScript事件流

1.事件捕捉阶段:事件开始由顶层对象触发,然后逐级向下传播,直到目标的元素;
-    2.处于目标阶段:处在绑定事件的元素上;
-    3.事件冒泡阶段:事件由具体的元素先接收,然后逐级向上传播,直到不具体的元素;
-

5.阻止事件冒泡

阻止冒泡行为及默认行为
-IE:event.cancelBubble=true; event.returnValue=false;
-非IE:event.stopPropagation();event.preventDefault();
-

6.事件委托

了解了事件流,那么就不难理解事件委托,我们的DOM是有层级的,例如ul > n*li事件委托就是当点击子元素的时候,利用事件流机制
-将子元素的操作委托到父元素来代理,用target判断具体的触发位置
-    someDom.addEventListener('click',function(ev){
-        console.log('当前点击区域为'+target.tagName);
-    })
-

7.call、apply、bind区别

三者均用于改变当前执行环境的this指向,call和apply参数列表不同,两者均为立即执行,bind可非立即调用
-bind可将多个参数的函数变成只带一个参数的函数
-a.call(a,b,c); a.apply(a,[b,c]);
-var sum = function(x,y) { return x + y };
-var succ = sum.bind(null, 1);
-succ(2);
-

8.同源策略

三点 ip:host:port
-

9.JSONP原理

同源策略是有限制的,但是我们却可以调用非本域名的script脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用
-某个函数的js代码,在src中进行了调用,这样实现了跨域
-

10.JS事件循环

JavaScript是单线的,这一点我相信大家都知道,那么只能在一条线程上执行,是如何实现异步的呢,我们来
了解一下Js的执行机制

-
1.JS首先判断操作是否同步,同步继续执行,异步则进入event table
-    2.异步任务在event table中注册函数,当满足触发条件后,任务被推入event queue
-    3.同步任务一直执行,直到主线程空闲时,才会去event queue中查看是否有可执行的异步任务,如果有就推入主进程中
-

异步任务还分为宏任务(I/O,setTimeout,setInterval,setImmediate)和微任务(Promise,process.nextTick)

- -
- -
- -
- - \ No newline at end of file diff --git a/2017/03/12/Angular-AOT/index.html b/2017/03/12/Angular-AOT/index.html deleted file mode 100644 index 1f5d387..0000000 --- a/2017/03/12/Angular-AOT/index.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - Angular监控变化 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Angular监控变化

-
- -
-

Angular2如何实时监控变化?

先了解一个这样的问题,Javascript在整个运行时都可以被重写
-
1.覆盖浏览器的默认机制
Angular2启动的时候会对浏览器API打低级补丁,例如AddEventListener(),会覆盖原有的方法,对原有方法进行扩展
-这样才有机会进行更改检测,并做相关处理,对于浏览器的低级API补丁,Angular2采用Zonejs来完成,这是一种通用
-的机制,我们可以为浏览器添加额外的功能,Angular2内部使用Zone来触发更改机制,还有一种可能是执行应用程序
-分析,或跟踪多个虚拟机的堆栈信息进行跟踪
-    ZoneJS对浏览器所有基础事件进行了补丁,timeOut,interval,Ajax,click,hover等等,但是它是有限制的,因为zonejs不
-支持异步浏览器API,例如indexDB的回调,这样就解释了为什么他的变化会被检测到
-
2.检测机制触发后是如何工作
Angular2启动的时候,每一个组件都有一个关联的更改检测器
-1.缺省的变更机制
-    对于模板中使用的表达式,现有值与原来的值进行比较,默认情况的检查不会做深度对比,仅仅会对使用的属性进行对比
-2.changeDetection.OnPush && Immutable.js类似库
-    此种情况下引用的变更才会触发,而属性的改变不会触发,这样的检查显然是不靠谱的,所以引入了Immutable.js,来确保
-对象的不可变性,同时Angular2采用的是单向的数据流,这样就避免了angular1的双向绑定那个三重的for循环,进而提升了
-性能,Angular2的dev和生产模式下也是不同的,对于检查,在生产环境只会检查一次
-
3.是否可以手动关闭脏值检查,比如1秒触发一次脏值检查
1
2
3
4
 constructor(private ref:ChangeDetectorRef){
ref.detach();
setInterval(()=>{this.ref.detectChanges();},1000)
}
-
4.结论
Angular2和angular1的默认检查还是有很大不同的,做了一些优化,而且在Angular2中,变化检测是可以选择的
-
-
- -
- -
- - \ No newline at end of file diff --git "a/2017/05/01/css\345\261\205\344\270\255\351\227\256\351\242\230/index.html" "b/2017/05/01/css\345\261\205\344\270\255\351\227\256\351\242\230/index.html" deleted file mode 100644 index a284544..0000000 --- "a/2017/05/01/css\345\261\205\344\270\255\351\227\256\351\242\230/index.html" +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - css居中问题 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

css居中问题

-
- -
-

居中问题

1.行内元素居中

text-align:center;
-

2.块元素居中

1.定宽  margin:0 auto;
-    2. 非定宽 采用flex justify-content: center;
-

3.行内元素垂直居中

1.height === line-height
-    2. 非定宽 采用flex justify-content: center;
-

4.块元素垂直居中

1.display:flex;
-    align-items:center;
-    2.display:table-cell;
-    vertical-align:middle
-
-
- -
- -
- - \ No newline at end of file diff --git "a/2017/05/28/\346\265\217\350\247\210\345\231\250\346\270\262\346\237\223\350\277\207\347\250\213/index.html" "b/2017/05/28/\346\265\217\350\247\210\345\231\250\346\270\262\346\237\223\350\277\207\347\250\213/index.html" deleted file mode 100644 index 1af7948..0000000 --- "a/2017/05/28/\346\265\217\350\247\210\345\231\250\346\270\262\346\237\223\350\277\207\347\250\213/index.html" +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - 浏览器渲染过程 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

浏览器渲染过程

-
- -
-

1.浏览器简介

我们常用的浏览器由以下几个部分组成

-
用户界面:地址栏,书签栏...简单说就是除了请求页面之外的内容
-    浏览器引擎:协调UI和渲染引擎
-    渲染引擎:展示请求内容
-    网络组件:负责网络调用
-    UI后端:绘制基本UI组件
-    JavaScript解析器:解析和执行JavaScript代码
-    数据存储:浏览器的本地存储
-

2.解析和渲染过程

简单来说分为五部 loading->parsing->rending->Layout>painting

-

2.1 loading

loading指浏览器的加载顺序,它起始于navigationStart,终止于loadEventEnd

-
1.首先浏览器会判断,你是如何到达当前页面的,是重定向还是直接加载
-    if(unload)  unloadStart->unloadEnd
-    if(redirect)  redirectStart->redirectEnd
-    2.接下来浏览器会开始发起资源请求,首先判断是否有缓存,如果没有要做DNS解析查询
-    fetchStart: cache ? cache : domainLookupStart->domainLookupEnd
-    3.接下来使用解析的地址来建立TCP连接,发起http请求,等候资源
-    domain:connectStart->connectEnd,requestStart->responseStart
-    4.有了资源那么就开始加载DOM,直到DOM加载完毕
-    resource:DomLoading->DomContentLoaded
-

2.2 parsing

parsing是浏览器将HTML文档转换为DOM树并下载资源的过程

-
HTML解析器的任务是将HTML标记解析成解析树,解析树是由DOM元素和属性节点构成的树结构,根节点是为Document
-    解析主要包括两个部分:标记化和树的构建
-    (1)标记化:标记化是词法分析过程,将输入内容解析成多个标记
-    (2)树的构建:在创建解析器的同时,也会创建Document对象。在树构建阶段,以Document为根节点的DOM树也会不断进行修改,添加
-    各种元素。标记生成器发送的每个节点都会由树构建器进行处理。每个标记都有对应的DOM元素,这些元素会在接收到标记时创建
-    <html> --> <head> --> </head> --> <body> --> </body> -- </html>
-
-    在HTML解析器解析HTML的同时,CSS 解析器会构建CSS规则树
-

2.3 rending

在 DOM 树构建的同时,浏览器还会构建呈现树。这是由可视化元素按照其显示顺序而组成的树,也是文档的可视
化表示.呈现器是和 DOM 元素相对应的,但并非一一对应。非可视化的 DOM 元素不会插入呈现树中

-
这此阶段会发生重绘和回流
-    重绘:css属性改变,尺寸不变
-    回流:尺寸改变,虽然浏览器会异步增量回流,但是消耗也是很大的,所以成本特别高
-

2.4 Layout

Layout是计算页面上具体的展示位置

-
rending时呈现树构建完毕,此时并不包含位置和大小信息,计算这些值的过程就是布局.HTML 采用基于流的布局模型,这意味着大多
-数情况下只要一次遍历就能计算出几何信息。处于流中靠后位置元素通常不会影响靠前位置元素的几何特征,因此布局可以按从左至
-右、从上至下的顺序遍历文档。
-

2.5 painting

painting才是最终的绘制页面

-
在绘制过程中,图形处理层可能使用通用CPU,也可能使用图形处理器GPU,当使用GPU用于图形渲染时,图形驱动软件会把任务分成多个
-部分,这样可以充分利用GPU的并行计算,用于在渲染过程中进行大量的浮点计算。
-

2.6 理顺一下思路

(1)渲染引擎把HTML文档解析成DOM树,把标签转换成DOM节点。
-   (2)解析文档的同时,渲染引擎会把样式解析成CSS规则树
-   (3)渲染器是在文档解析和创建DOM节点后创建的,会计算DOM节点的样式信息(display:none除外),渲染树的节点。DOM树和CSS规则
-   树结合之后,形成了Style Content Tree,将其和渲染树关联,就完成了渲染树。
-   (4)渲染树构建出来之后,就进入布局阶段,为渲染树的每个节点分配一个屏幕上的确切坐标。
-   (5)最后遍历渲染树,通过用户界面后端将每个节点绘制出来。
-
-
- -
- -
- - \ No newline at end of file diff --git "a/2017/06/01/webpack\345\205\245\351\227\250/index.html" "b/2017/06/01/webpack\345\205\245\351\227\250/index.html" deleted file mode 100644 index b05ba7f..0000000 --- "a/2017/06/01/webpack\345\205\245\351\227\250/index.html" +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - webpack入门 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

webpack入门

-
- -
-

Webpack

Webpack本质是一个Js应用程序的静态模块打包器,它为前端的工程化开发提供了一套相对容易和完整的解决方
案,当webpack处理应用程序的时候,它会递归构建一个依赖关系图,然后进行打包任务
webpack有四个核心概念:entry、output、loader、plugins

-

一、entry(简单概念)

entry作为webpack起始的入口,告诉webpack我的应用程序是从何处开始,entry的配置可以一个或多个起点
示例:

-
// 单入口
-    entry: './src/main.js' // 你可以这样
-    entry: { main : './src/main.js' } // 你还可以这样
-    // 多入口
-    entry: { main : './src/main.js', vendors: './src/lib/vendors.js' } // 你可以这样
-    entry: { main : './src/main.js', vendors: './src/lib/vendors.js' } // 你还可以这样
-

二、output(简单概念)

output作为webpack起始的出口,告诉webpack我的应用程序打包后的文件如何安置
示例:

-
// 分别对应是否多入口打包
-    output: { filename : 'app.js', path: './build/assets/js' }
-    output: { filename : [name].js, publicPath: '/assets/',path: __dirname + '/build/assets/js' }
-    output: { filename : [name].[chunkhash].js, publicPath: '/assets/',path: __dirname + '/build/assets/js' }
-

3.loader(我认为的核心)

loader用于对模块代码进行转换,如果使用Angular2,采用TypeScript进行编写,那么打包时就需要转为
JavaScript,亦或是我们的代码中采用scss less,那么都需要进行转换
示例:

-
// 分别对应是否多入口打包
-    module: {
-        rules: [
-          { test: /\.ts$/, use: 'ts-loader' }
-        ]
-   }
-

4.plugins(我认为的核心)

plugins其实是弥补了一些loader无法完成的事情,比如压缩
示例:

-
// 分别对应是否多入口打包
-    plugins: {
-        new webpack.optimize.UglifyJsPlugin()
-   }
-

这样看起来,是不是webpack很简单,好像没有很难

- -
- -
- -
- - \ No newline at end of file diff --git "a/2017/08/01/Vue\344\273\216\351\233\266\345\215\225\346\216\222(1)/index.html" "b/2017/08/01/Vue\344\273\216\351\233\266\345\215\225\346\216\222(1)/index.html" deleted file mode 100644 index 649b862..0000000 --- "a/2017/08/01/Vue\344\273\216\351\233\266\345\215\225\346\216\222(1)/index.html" +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - Vue从零单排(1) - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Vue从零单排(1)

-
- -
-

Vue

最近因为公司整体业务方向调整,项目组频繁波动 ~ ~ ~ ,经过了慎重的考虑,我们决定要用Vue来代替原有
的Angular2技术栈,我们这些老油条是无所谓的,什么轮子都能跑,但是Angular2不适合新人,学习曲线太陡
峭,不利于新人培养,以此为背景,我将记录下这一段的学习历程

-

1.怎么学

一贯的原则都是先上官网,直接撸,顺便记录下,好做培训官网地址

-

2.DEMO

从官网上直接找的一个DEMO,其实就是展示一个字符串
<div id="app">{{ message }}</div>
-    var app = new Vue({
-      el: '#app',
-      data: { message: 'Hi!' }
-    });
-
之前也有接触过EmberJS和Angular1,Angular2,大致看了一下,有太多的似曾相识

3.一点交互

一个系统与用户的交流是非常重要的,那么我们就在DEMO的基础上来添加一些交互
<div id="app" @click="resetMessage" >{{ message }}</div>
-    var app = new Vue({
-      el: '#app',
-      data: { message: 'Hi!' },
-      methods: { resetMessage(){ this.message = '我被点击了';}}
-    });
-
@click就是我们所添加的第一个交互,完整的写法是这样的=> v-on:click = “resetMessage”, 当Div被点击的时候,
我们改变页面上的message,怎么样是不是很简单,于此相同的我们也有一些其他的原生DOM事件,比如:click,
hover,mouseEnter,mouseOut,focus,keyUp,keyDown,change… ,那么这个v-on到底是什么呢,就是Vue自身提供
指令集中的一个

4.指令

官方的API给出了14个指令,v-text,v-html,v-show,v-if,v-else,v-else-if…我们挑几个看一下,还是那段DEMO
v-text很明显就可以看到是做什么的,用来展示信息。不多说
<div id="app" v-text="message" ></div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: 'Hi!' }
-        });
-
v-html 其实就是更新元素的innerHtml,不会作为Vue模板进行编译
<div id="app" v-html="message" ></div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: 'Hi!' }
-        });
-
v-show && v-if(v-if v-else-if v-else) 展示与隐藏
两者是有区别的,v-show是控制DOM的display属性,而v-if是直接创建或销毁组件或者模板
<div id="app" v-if="message" ></div>
-    <div id="app" v-show="message" ></div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: true }
-        });
-
v-for列表渲染
<div id="app"><span  v-for="m in message" :key="m">{{m}}</span></div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: [1,2,3] }
-        });
-
v-model绑定在组件,select,输入框上,双向绑定
<input id="app" v-model="message">
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: '' }
-        });
-
v-once适合用于提升性能,只渲染一次,重新渲染的时候会视为静态内容,不进行编译渲染
<div id="app" v-once>{{message}}</div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: '不变' }
-        });
-
v-bind动态绑定属性
<div id="app" v-bind:title = "message">{{message}}</div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: 'title' }
-        });
-
v-pre(跳过编译) v-cloak(最后编译)
<div id="app" v-pre>{{message}}</div>
-    <div id="app" v-clock>{{message}}</div>
-
-
- -
- -
- - \ No newline at end of file diff --git "a/2017/08/01/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\270\270\347\224\250\346\214\207\344\273\244(1)/index.html" "b/2017/08/01/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\270\270\347\224\250\346\214\207\344\273\244(1)/index.html" deleted file mode 100644 index f0ba54b..0000000 --- "a/2017/08/01/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\270\270\347\224\250\346\214\207\344\273\244(1)/index.html" +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - Vue从零单排_常用指令(1) - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Vue从零单排_常用指令(1)

-
- -
-

Vue

最近因为公司整体业务方向调整,项目组频繁波动 ~ ~ ~ ,经过了慎重的考虑,我们决定要用Vue来代替原有
的Angular2技术栈,我们这些老油条是无所谓的,什么轮子都能跑,但是Angular2不适合新人,学习曲线太陡
峭,不利于新人培养,以此为背景,我将记录下这一段的学习历程

-

1.怎么学

一贯的原则都是先上官网,直接撸,顺便记录下,好做培训官网地址

-

2.DEMO

从官网上直接找的一个DEMO,其实就是展示一个字符串
<div id="app">{{ message }}</div>
-    var app = new Vue({
-      el: '#app',
-      data: { message: 'Hi!' }
-    });
-
之前也有接触过EmberJS和Angular1,Angular2,大致看了一下,有太多的似曾相识

3.一点交互

一个系统与用户的交流是非常重要的,那么我们就在DEMO的基础上来添加一些交互
<div id="app" @click="resetMessage" >{{ message }}</div>
-    var app = new Vue({
-      el: '#app',
-      data: { message: 'Hi!' },
-      methods: { resetMessage(){ this.message = '我被点击了';}}
-    });
-
@click就是我们所添加的第一个交互,完整的写法是这样的=> v-on:click = “resetMessage”, 当Div被点击的时候,
我们改变页面上的message,怎么样是不是很简单,于此相同的我们也有一些其他的原生DOM事件,比如:click,
hover,mouseEnter,mouseOut,focus,keyUp,keyDown,change… ,那么这个v-on到底是什么呢,就是Vue自身提供
指令集中的一个

4.指令

官方的API给出了14个指令,v-text,v-html,v-show,v-if,v-else,v-else-if…我们挑几个看一下,还是那段DEMO
v-text很明显就可以看到是做什么的,用来展示信息。不多说
<div id="app" v-text="message" ></div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: 'Hi!' }
-        });
-
v-html 其实就是更新元素的innerHtml,不会作为Vue模板进行编译
<div id="app" v-html="message" ></div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: 'Hi!' }
-        });
-
v-show && v-if(v-if v-else-if v-else) 展示与隐藏
两者是有区别的,v-show是控制DOM的display属性,而v-if是直接创建或销毁组件或者模板
<div id="app" v-if="message" ></div>
-    <div id="app" v-show="message" ></div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: true }
-        });
-
v-for列表渲染
<div id="app"><span  v-for="m in message" :key="m">{{m}}</span></div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: [1,2,3] }
-        });
-
v-model绑定在组件,select,输入框上,双向绑定
<input id="app" v-model="message">
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: '' }
-        });
-
v-once适合用于提升性能,只渲染一次,重新渲染的时候会视为静态内容,不进行编译渲染
<div id="app" v-once>{{message}}</div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: '不变' }
-        });
-
v-bind动态绑定属性
<div id="app" v-bind:title = "message">{{message}}</div>
-    <div id="appDemo" >{{ message }}</div>
-        var app = new Vue({
-          el: '#app',
-          data: { message: 'title' }
-        });
-
v-pre(跳过编译) v-cloak(最后编译)
<div id="app" v-pre>{{message}}</div>
-    <div id="app" v-clock>{{message}}</div>
-
-
- -
- -
- - \ No newline at end of file diff --git "a/2017/08/02/Vue\344\273\216\351\233\266\345\215\225\346\216\222(2)/index.html" "b/2017/08/02/Vue\344\273\216\351\233\266\345\215\225\346\216\222(2)/index.html" deleted file mode 100644 index 26b47e9..0000000 --- "a/2017/08/02/Vue\344\273\216\351\233\266\345\215\225\346\216\222(2)/index.html" +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - Vue从零单排(2) - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Vue从零单排(2)

-
- -
-

Vue

上一篇是说Vue的指令,那么接下来就要实际搭建一个Vue的项目,可能只有指令貌似不够用,那么接下来,遇到什么
问题解决什么问题就可以了,其实做项目没有那么复杂,最首要的就是思路要清晰,其他的都好办

-

1.怎么搭建环境

好像有一套CLI可以用

-

2.CLI

官网地址就在这里:Vue-Cli

-
npm install -g vue-cli
-    vue init webpack myProject
-    cd myProject
-    npm run dev
-

等待的时间不是很长,就这样,一套基础的环境搭建完毕,启动之后打开 http://localhost:8080/ ,发现一个问题,为什
么我的路由多了一个#号,那么是不是可以去掉hash路由,打开路由文件,这东西属于路由范畴的,我没有配置server,
那么它一定是前端路由管理的,我用的是IDEA可以直接点进去,看具体是怎么用的

-
node_modules -> vue-router ->router.d.ts
-    关注这段代码
-    export type RouterMode = "hash" | "history" | "abstract";
-    export declare class VueRouter {
-      constructor (options?: RouterOptions);
-      app: Vue;
-      mode: RouterMode;
-      currentRoute: Route;
-    }
-    解决了,向下边这样写,默认给的路由是hash路由
-    export default new Router({
-      mode: 'history',
-      routes: [
-        {
-          path: '/',
-          name: 'HelloWorld',
-          component: HelloWorld
-        }]})
-

3.有了基础环境,那么开始写代码

我们新建一个路由,就叫demo,按照上边的规则,可以这样写

-
export default new Router({
-  mode: 'history',
-  routes: [
-    { path: '/',name: 'HelloWorld',component: HelloWorld },
-    { path: '/demo',name: 'demo',component: Demo }
-    ]})
-

刚好用到component,那就看看吧

-

4.component属于内置组件

Vue内置了五个组件,Component,transition,transition-group,keep-alive,slot

Component

这不就就是组件么!!简单的说,我要造一台车,是不是要有轮子,那么轮子就是一个组件,组成的构件,有了轮子,套在轴承上是不是就可以滚了
那就写一个,当访问/demo的时候我希望看到一个有数据的页面,之前学到的指令恰巧可以用在这里,没毛病
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<template>
<div class="hello">
<h1 v-if="msg" @click="hideMessage">{{ msg }}</h1>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
},
methods:{
hideMessage(){
this.msg = undefined;
}
}
}
</script>
<style scoped></style>
-
三部分组成,template script style 是不是很熟悉

transition(被缓存而不销毁的组件实例) & transition-ground(被缓存而不销毁的组件实例)

翻译一下,过渡(动画),过渡组(批量动画),这就是动画啊,不多解释了,直接上DEMO,就在刚才我们新建的component下写

-
<div class="hello">
-  <h1 v-if="msg" @click="show = !show">{{ msg }}</h1>
-   <transition name="fade">
-      <p v-show="show">hello</p>
-    </transition>
-</div>
-<style scoped>
-   &.fade-enter-active, &.fade-leave-active
-     {transition: all 0.5s ease}
-   &.fade-enter, &.fade-leave-active
-    { opacity: 0}
-   </style>
-

keep-alive(被缓存而不销毁的组件实例)

<div class="hello">
-   <keep-alive include="demo">
-       这里将会缓存名字叫做demo的组件
-    </keep-alive>
-   </div>
-

Slot

这个是一个比较好的功能,react中并没有,不过github上边有一个react-slot包,可以拿来用,其实就是一种多态思想,
slot可以提供这样的功能,我使用一个组件,默认我不传递props时候,它会展现一种状态,当我传递props并且
附带我自定义的内容时候,我希望能展示我自定义的内容,如果你学过Angular,那么就是其中的transclusion

-
<my-input>
-      // 我有一个input组件,我期望在我的组件后边附加一个单位
-     <template slot="append">美元</template>
-   </my-input>
-
-
- -
- -
- - \ No newline at end of file diff --git "a/2017/08/02/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\206\205\347\275\256\347\273\204\344\273\266(2)/index.html" "b/2017/08/02/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\206\205\347\275\256\347\273\204\344\273\266(2)/index.html" deleted file mode 100644 index b36abfe..0000000 --- "a/2017/08/02/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\206\205\347\275\256\347\273\204\344\273\266(2)/index.html" +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - Vue从零单排_内置组件(2) - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Vue从零单排_内置组件(2)

-
- -
-

Vue

上一篇是说Vue的指令,那么接下来就要实际搭建一个Vue的项目,可能只有指令貌似不够用,那么接下来,遇到什么
问题解决什么问题就可以了,其实做项目没有那么复杂,最首要的就是思路要清晰,其他的都好办

-

1.怎么搭建环境

好像有一套CLI可以用

-

2.CLI

官网地址就在这里:Vue-Cli

-
npm install -g vue-cli
-    vue init webpack myProject
-    cd myProject
-    npm run dev
-

等待的时间不是很长,就这样,一套基础的环境搭建完毕,启动之后打开 http://localhost:8080/ ,发现一个问题,为什
么我的路由多了一个#号,那么是不是可以去掉hash路由,打开路由文件,这东西属于路由范畴的,我没有配置server,
那么它一定是前端路由管理的,我用的是IDEA可以直接点进去,看具体是怎么用的

-
node_modules -> vue-router ->router.d.ts
-    关注这段代码
-    export type RouterMode = "hash" | "history" | "abstract";
-    export declare class VueRouter {
-      constructor (options?: RouterOptions);
-      app: Vue;
-      mode: RouterMode;
-      currentRoute: Route;
-    }
-    解决了,向下边这样写,默认给的路由是hash路由
-    export default new Router({
-      mode: 'history',
-      routes: [
-        {
-          path: '/',
-          name: 'HelloWorld',
-          component: HelloWorld
-        }]})
-

3.有了基础环境,那么开始写代码

我们新建一个路由,就叫demo,按照上边的规则,可以这样写

-
export default new Router({
-  mode: 'history',
-  routes: [
-    { path: '/',name: 'HelloWorld',component: HelloWorld },
-    { path: '/demo',name: 'demo',component: Demo }
-    ]})
-

刚好用到component,那就看看吧

-

4.component属于内置组件

Vue内置了五个组件,Component,transition,transition-group,keep-alive,slot

Component

这不就就是组件么!!简单的说,我要造一台车,是不是要有轮子,那么轮子就是一个组件,组成的构件,有了轮子,套在轴承上是不是就可以滚了
那就写一个,当访问/demo的时候我希望看到一个有数据的页面,之前学到的指令恰巧可以用在这里,没毛病
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<template>
<div class="hello">
<h1 v-if="msg" @click="hideMessage">{{ msg }}</h1>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
},
methods:{
hideMessage(){
this.msg = undefined;
}
}
}
</script>
<style scoped></style>
-
三部分组成,template script style 是不是很熟悉

transition(被缓存而不销毁的组件实例) & transition-ground(被缓存而不销毁的组件实例)

翻译一下,过渡(动画),过渡组(批量动画),这就是动画啊,不多解释了,直接上DEMO,就在刚才我们新建的component下写

-
<div class="hello">
-  <h1 v-if="msg" @click="show = !show">{{ msg }}</h1>
-   <transition name="fade">
-      <p v-show="show">hello</p>
-    </transition>
-</div>
-<style scoped>
-   &.fade-enter-active, &.fade-leave-active
-     {transition: all 0.5s ease}
-   &.fade-enter, &.fade-leave-active
-    { opacity: 0}
-   </style>
-

keep-alive(被缓存而不销毁的组件实例)

<div class="hello">
-   <keep-alive include="demo">
-       这里将会缓存名字叫做demo的组件
-    </keep-alive>
-   </div>
-

Slot

这个是一个比较好的功能,react中并没有,不过github上边有一个react-slot包,可以拿来用,其实就是一种多态思想,
slot可以提供这样的功能,我使用一个组件,默认我不传递props时候,它会展现一种状态,当我传递props并且
附带我自定义的内容时候,我希望能展示我自定义的内容,如果你学过Angular,那么就是其中的transclusion

-
<my-input>
-      // 我有一个input组件,我期望在我的组件后边附加一个单位
-     <template slot="append">美元</template>
-   </my-input>
-
-
- -
- -
- - \ No newline at end of file diff --git "a/2017/08/03/Vue\344\273\216\351\233\266\345\215\225\346\216\222(3)/index.html" "b/2017/08/03/Vue\344\273\216\351\233\266\345\215\225\346\216\222(3)/index.html" deleted file mode 100644 index 0645976..0000000 --- "a/2017/08/03/Vue\344\273\216\351\233\266\345\215\225\346\216\222(3)/index.html" +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - Vue从零单排(3) - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Vue从零单排(3)

-
- -
-

Vue

上一篇是说Vue的内置组件,其中的slot使用的是了Vue实例中的属性,那么接下来我们就认识一下,介绍一个Vue
的实例属性

-

1.$slots $scopedSlots

上次是说这样的一个input组件,我期望在文本后边附加单位,很常见的场景,没有给出具体的实现,那么我们现
在来实现这样的一个组件,可以分发内容

-
<template>
-     <input type="text">
-     <span  v-if="$slots.append">
-         <slot name="append"></slot>
-     </span>
-    </template>
-    <script>
-         //为什么可以直接使用$slots,因为它是绑定在Vue实例上的属性 vm.$slots
-         //方便我们拿到我们传递的slot属性
-    </script>
-    <style>
-    </style>
-

$scopedSlots与之类似,只不过是用来访问作用域slot, $slots可以说更宽泛一些

-

2.$refs $children $parent $root $el

这五个实例属性,都是与DOM操作相关的,所以把他们放在一起,这样好记忆也好理解

-
<template id="parent">
-     <div>
-         <child ref="childOne"></child>
-         <child ref="childTwo"></child>
-     </div>
-    </template>
-    <script>
-        // 查找 一个人的儿子,一种是直接看他的儿子是谁,另一种是看他的下一辈有中有谁的名字是XXX
-        // 就这样,在父组件中访问子组件的DOM,有两种方式,
-        this.$child[0] === this.$ref.childOne //true
-        this.$child[1] === this.$ref.childTwo //true
-        // 相同的,找组件的父元素DOM
-        this.$parent
-        // 同样的,当前组件树的根
-         this.$root
-        // 同样的,Vue的根DOM元素
-         this.$el
-    </script>
-    <style>
-    </style>
-

这四个实例主要是用来操作相关的DOM

-

3.$props $data

$props是组件传入的属性,$data是当前组件使用的初始化数据

-
<template>
- <my-input :data="someObj">
-</template>
-<script>
-     export default {
-         data() {
-             this.initializeData = {}
-         },
-         props:{someObj}
-     }
-</script>
-

4.$isServer $options

<script>
-     // 判断当前实例是否运行在服务器(比如服务端渲染用到)
-    this.$isServer
-    // Vue实例的初始化选项
-    this.$options
-</script>
-

5.$attrs $listeners

这两个是作为创建更高层次的组件时使用

-
<script>
-     // 父作用域中不作为 prop 被识别 (且获取) 的特性绑定
-    this.$attrs
-    // 父作用域中的事件监听器
-    this.$listeners
- </script>
-
-
- -
- -
- - \ No newline at end of file diff --git "a/2017/08/03/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\256\236\344\276\213\345\261\236\346\200\247(3)/index.html" "b/2017/08/03/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\256\236\344\276\213\345\261\236\346\200\247(3)/index.html" deleted file mode 100644 index 51da25f..0000000 --- "a/2017/08/03/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\256\236\344\276\213\345\261\236\346\200\247(3)/index.html" +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - Vue从零单排_实例属性(3) - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Vue从零单排_实例属性(3)

-
- -
-

Vue

上一篇是说Vue的内置组件,其中的slot使用的是了Vue实例中的属性,那么接下来我们就认识一下,介绍一个Vue
的实例属性

-

1.$slots $scopedSlots

上次是说这样的一个input组件,我期望在文本后边附加单位,很常见的场景,没有给出具体的实现,那么我们现
在来实现这样的一个组件,可以分发内容

-
<template>
-     <input type="text">
-     <span  v-if="$slots.append">
-         <slot name="append"></slot>
-     </span>
-    </template>
-    <script>
-         //为什么可以直接使用$slots,因为它是绑定在Vue实例上的属性 vm.$slots
-         //方便我们拿到我们传递的slot属性
-    </script>
-    <style>
-    </style>
-

$scopedSlots与之类似,只不过是用来访问作用域slot, $slots可以说更宽泛一些

-

2.$refs $children $parent $root $el

这五个实例属性,都是与DOM操作相关的,所以把他们放在一起,这样好记忆也好理解

-
<template id="parent">
-     <div>
-         <child ref="childOne"></child>
-         <child ref="childTwo"></child>
-     </div>
-    </template>
-    <script>
-        // 查找 一个人的儿子,一种是直接看他的儿子是谁,另一种是看他的下一辈有中有谁的名字是XXX
-        // 就这样,在父组件中访问子组件的DOM,有两种方式,
-        this.$child[0] === this.$ref.childOne //true
-        this.$child[1] === this.$ref.childTwo //true
-        // 相同的,找组件的父元素DOM
-        this.$parent
-        // 同样的,当前组件树的根
-         this.$root
-        // 同样的,Vue的根DOM元素
-         this.$el
-    </script>
-    <style>
-    </style>
-

这四个实例主要是用来操作相关的DOM

-

3.$props $data

$props是组件传入的属性,$data是当前组件使用的初始化数据

-
<template>
- <my-input :data="someObj">
-</template>
-<script>
-     export default {
-         data() {
-             this.initializeData = {}
-         },
-         props:{someObj}
-     }
-</script>
-

4.$isServer $options

<script>
-     // 判断当前实例是否运行在服务器(比如服务端渲染用到)
-    this.$isServer
-    // Vue实例的初始化选项
-    this.$options
-</script>
-

5.$attrs $listeners

这两个是作为创建更高层次的组件时使用

-
<script>
-     // 父作用域中不作为 prop 被识别 (且获取) 的特性绑定
-    this.$attrs
-    // 父作用域中的事件监听器
-    this.$listeners
- </script>
-
-
- -
- -
- - \ No newline at end of file diff --git "a/2017/08/04/Vue\344\273\216\351\233\266\345\215\225\346\216\222(4)/index.html" "b/2017/08/04/Vue\344\273\216\351\233\266\345\215\225\346\216\222(4)/index.html" deleted file mode 100644 index 2992636..0000000 --- "a/2017/08/04/Vue\344\273\216\351\233\266\345\215\225\346\216\222(4)/index.html" +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - Vue从零单排(4) - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Vue从零单排(4)

-
- -
-

Vue生命周期

重新认识一下,Vue整个的生命周期,无论学什么框架,都需要了解整个的生命周期,这对于我们的开发是十分重
要的,让我们知道,什么时候可以做什么事

-

1.new Vue()

我们的整个Vue应用都是从这里开始的,在这里我们可以选择初始化参数,可以配置相应的路由,可以决定我们在
-    哪个DOM元素上来初始化我们的应用,一个Vue项目就从这里开始,我们将通过几个方法来认识一下Vue
-

2.beforeCreate

此时的组件实例刚被创建,我们赋予组件的初始数据,data还没有运行,具体有哪些应用场景,这个才是我关
心的问题,我们以前写JQuery的时候会有这样的一段代码,用来判断是否页面加载完毕,举个栗子:

-
$(function(){ alert('页面加载完毕')})
-    那么换成Vue了,beforeCreate就做了同样的事情
-

2.created

此时的组件实例刚被创建完成,组件实例中的属性已经计算完毕,但是DOM还未生成,这个时候就是我们的
create函数所处的阶段,那么此时,我们可以做什么呢,举个栗子:

-
我们的页面经常需要从后台获取数据,我们会给我们的组件赋一些初始值,等到后续数据载入后替换,那就是这里了
-    created(){ setTimeOut(function(){this.initData = { name:1, value:2 }})}
-

3.beforeMount

此时的组件实例刚被创建完成,组件实例中的属性已经计算完毕,DOM已经首次生成,但是还没有挂载到具体的
DOM,这个时候就是我们的beforeMount函数所处的阶段,那么此时,我们可以做什么呢,举个栗子:

-
此时Vue的根DOM元素已经被初始化,在这里,我们拿到我们的虚拟DOM,虽然现在看起来像是占位符
-    beforeMount(){
-        console.log(this.$el); // <div id="root">{{hello}}</div>
-    }
-

4.mounted

此时的组件实例刚被创建完成,组件实例中的属性已经计算完毕,DOM已经首次生成,已经挂载到具体的DOM,
这个时候就是我们的mounted函数所处的阶段,需要注意的一点就是,不一定所有的子组件都也都一起被挂载
那么此时,我们可以做什么呢,举个栗子:

-
此时Vue的根DOM元素已经被初始化,在这里,我们可以拿到真实的DOM
-    mounted(){
-        console.log(this.$el); // <div id="root">你好</div>
-    }
-

5.beforeUpdate

此时的组件实例刚被创建完成,组件实例中的属性已经计算完毕,DOM已经首次生成,已经挂载到具体的DOM,
在此之后我们的数据发生了变化,有变化还没有及时重新渲染之前,这个时候就是我们的beforeUpdate函数

-

6.updated

此时的组件实例刚被创建完成,组件实例中的属性已经计算完毕,DOM已经首次生成,已经挂载到具体的DOM,
在此之后我们的数据发生了变化,DOM已经重新渲染之后,这个时候就是我们的updated函数调用的触发点
那么此时,我们可以做什么呢,举个栗子:

-
我们的页面有这样一个滚动视窗,我们需要知道初始化之后的一个按钮的展示位置,如果超过了某一个height
-那么动态的计算展示窗体的宽高,此时可以封装在这里
-updated(){ this.computeHeight()}
-

7.activated

在第二节中,我们提到了一个内置组件keep-alive,当此组件被激活的时候,会调用改方法

-

8.deactivated

keep-alive组件被停用的时候,会调用改方法

-

9.beforeDestroy

此时的组件实例还未被销毁,我们可以利用组件的当前实例做一些操作

-

10.destroyed

销毁整个Vue实例,回收所有的资源

- -
- -
- -
- - \ No newline at end of file diff --git "a/2017/08/04/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\347\224\237\345\221\275\345\221\250\346\234\237(4)/index.html" "b/2017/08/04/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\347\224\237\345\221\275\345\221\250\346\234\237(4)/index.html" deleted file mode 100644 index 27cd662..0000000 --- "a/2017/08/04/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\347\224\237\345\221\275\345\221\250\346\234\237(4)/index.html" +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - Vue从零单排_生命周期(4) - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Vue从零单排_生命周期(4)

-
- -
-

Vue生命周期

重新认识一下,Vue整个的生命周期,无论学什么框架,都需要了解整个的生命周期,这对于我们的开发是十分重
要的,让我们知道,什么时候可以做什么事

-

1.new Vue()

我们的整个Vue应用都是从这里开始的,在这里我们可以选择初始化参数,可以配置相应的路由,可以决定我们在
-    哪个DOM元素上来初始化我们的应用,一个Vue项目就从这里开始,我们将通过几个方法来认识一下Vue
-

2.beforeCreate

此时的组件实例刚被创建,我们赋予组件的初始数据,data还没有运行,具体有哪些应用场景,这个才是我关
心的问题,我们以前写JQuery的时候会有这样的一段代码,用来判断是否页面加载完毕,举个栗子:

-
$(function(){ alert('页面加载完毕')})
-    那么换成Vue了,beforeCreate就做了同样的事情
-

2.created

此时的组件实例刚被创建完成,组件实例中的属性已经计算完毕,但是DOM还未生成,这个时候就是我们的
create函数所处的阶段,那么此时,我们可以做什么呢,举个栗子:

-
我们的页面经常需要从后台获取数据,我们会给我们的组件赋一些初始值,等到后续数据载入后替换,那就是这里了
-    created(){ setTimeOut(function(){this.initData = { name:1, value:2 }})}
-

3.beforeMount

此时的组件实例刚被创建完成,组件实例中的属性已经计算完毕,DOM已经首次生成,但是还没有挂载到具体的
DOM,这个时候就是我们的beforeMount函数所处的阶段,那么此时,我们可以做什么呢,举个栗子:

-
此时Vue的根DOM元素已经被初始化,在这里,我们拿到我们的虚拟DOM,虽然现在看起来像是占位符
-    beforeMount(){
-        console.log(this.$el); // <div id="root">{{hello}}</div>
-    }
-

4.mounted

此时的组件实例刚被创建完成,组件实例中的属性已经计算完毕,DOM已经首次生成,已经挂载到具体的DOM,
这个时候就是我们的mounted函数所处的阶段,需要注意的一点就是,不一定所有的子组件都也都一起被挂载
那么此时,我们可以做什么呢,举个栗子:

-
此时Vue的根DOM元素已经被初始化,在这里,我们可以拿到真实的DOM
-    mounted(){
-        console.log(this.$el); // <div id="root">你好</div>
-    }
-

5.beforeUpdate

此时的组件实例刚被创建完成,组件实例中的属性已经计算完毕,DOM已经首次生成,已经挂载到具体的DOM,
在此之后我们的数据发生了变化,有变化还没有及时重新渲染之前,这个时候就是我们的beforeUpdate函数

-

6.updated

此时的组件实例刚被创建完成,组件实例中的属性已经计算完毕,DOM已经首次生成,已经挂载到具体的DOM,
在此之后我们的数据发生了变化,DOM已经重新渲染之后,这个时候就是我们的updated函数调用的触发点
那么此时,我们可以做什么呢,举个栗子:

-
我们的页面有这样一个滚动视窗,我们需要知道初始化之后的一个按钮的展示位置,如果超过了某一个height
-那么动态的计算展示窗体的宽高,此时可以封装在这里
-updated(){ this.computeHeight()}
-

7.activated

在第二节中,我们提到了一个内置组件keep-alive,当此组件被激活的时候,会调用改方法

-

8.deactivated

keep-alive组件被停用的时候,会调用改方法

-

9.beforeDestroy

此时的组件实例还未被销毁,我们可以利用组件的当前实例做一些操作

-

10.destroyed

销毁整个Vue实例,回收所有的资源

- -
- -
- -
- - \ No newline at end of file diff --git "a/2017/08/05/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\347\273\204\344\273\266\351\200\232\344\277\241(5)/index.html" "b/2017/08/05/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\347\273\204\344\273\266\351\200\232\344\277\241(5)/index.html" deleted file mode 100644 index d84880b..0000000 --- "a/2017/08/05/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\347\273\204\344\273\266\351\200\232\344\277\241(5)/index.html" +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - Vue从零单排_组件通信(5) - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Vue从零单排_组件通信(5)

-
- -
-

Vue组件通信

上面几篇介绍了一些基础的概念,但是实际项目中往往会用到更多,接下来会介绍一些项目中会用到的点

-

1.基础组件通信

经常我们会遇到这样的情况,当我们操作一个component的时候,我们需要让另外的component知道,我
操作了当前的component,方便后续组件做一些操作,比如:刷新

-

1.1 父 =>子 组件的通信

我们定义component的时候,有时候需要传递一些属性,这样方便我们更好的控制组件,比如说我的组件
是否展示一个DOM区域,那么此时你可能会用到props,这就是父子通信的一种,在父组件中定义一些属性
告诉子组件 ,我需要展示哪些东西,比如:我们的Table组件,需要一个数据源来遍历出表格

-
<template>
-    <div>
-        <child-component :data="formData"></child-component>
-    </div>
-    </template>
-    <script>
-        created(){
-            this.formData=[1,2,3];
-        }
-    </script>
-

1.2 子 => 父 组件的通信

为了增加我们的控制力度,我们有时候需要一些操作,我的子组件某一个属性发生变化,我需要让父组件
知道有这么一件事情,比如:当分页组件点击的时候,我需要更新父组件中的Table组件的数据,那么我就
需要去跟父组件之间进行通信,此时你可以这样做,父组件就可以收到子组件的信息,做相关操作

-
<!-- child-component -->
-<template>
-    <div @click=sendMessage>
-
-    </div>
-    </template>
-    <script>
-        sendMessage(){
-            this.$emit('sendMessage','我被点击')
-        }
-    </script>
-  <!-- parent-component -->
-    <template>
-        <div>
-            <child-component v-on:sendMessage="receiveMessage"></child-component>
-        </div>
-        </template>
-        <script>
-            receiveMessage(obj){
-                console.log(obj);
-            }
-        </script>
-

1.3 兄弟组件的通信

其实学会了父子组件的通信,那么兄弟间的通信就水到渠成了,其实就是这样的关系 子 => 父 =>子

-

2.升级版组件通信

如果你写的多了,那么你应该会觉得有些麻烦,尤其是层级过多的父子组件,这个时候我们有这样的解决方案,
那就是eventhub事件中心,你不需要去在template上绑定事件,只需要发送和接收

-
//根注册
-    data: {
-        eventHub: new Vue()
-    }
-    //发送方
-    this.$root.eventHub.$emit('sendMessage', data)
-    //接收方
-    this.$root.eventHub.$on('sendMessage', Func)
-

这里可能会有这样的一个问题,比如说你有两个页面组件的时候,在页面A发送事件,在页面B接收事件,这个时
候有可能会发生接收不到的情况,为什么?因为生命周期的问题,按照Vue的生命周期,销毁事件是在当前组件完
全判定为未引用时候才会收回,上面的情况下,B页面组件的创建是在A页面组件销毁之前的,所以需要注意,而且
不要重名

-

3.进阶版组件通信

如果有使用过react的同学可能会说,我们react用redux,说白了,其实就是状态机,无论是Vuex还是Redux其
实本质上都是一样的,就是状态管理,最早出现的是Flux,后边围绕着Flux出现了很多的前端状态管理架构思想,
专门解决软件的结构问题,中小型项目不建议使用,因为还要额外的安装包,引入一些列的概念,不要想的太神秘,
工具不就是拿来用的么,我感觉暂时用不到,用到的时候直接看API

- -
- -
- -
- - \ No newline at end of file diff --git "a/2017/08/06/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\217\214\345\220\221\347\273\221\345\256\232(6)/index.html" "b/2017/08/06/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\217\214\345\220\221\347\273\221\345\256\232(6)/index.html" deleted file mode 100644 index 064440e..0000000 --- "a/2017/08/06/Vue\344\273\216\351\233\266\345\215\225\346\216\222_\345\217\214\345\220\221\347\273\221\345\256\232(6)/index.html" +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - Vue从零单排_双向绑定(6) - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Vue从零单排_双向绑定(6)

-
- -
-

Vue原理

学东西要知其然,知其所以然,我用过AngularJs/Angular,以此对比,便于理解

-

1、数据绑定

它们都有双向绑定的概念,但是实现的方式是不同的,简要对比一下

-

1.1 AngularJs(脏值检查)

AngularJs其实就是Angular1,后来Angular2更名未Angular,AngularJs采用的是脏值检查,AngularJs在 scope 模型上设置了一个监听队
-列,用来监听数据变化并更新 view 。每次绑定一个东西到 view 上时 AngularJS 就会往 $watch 队列里插入一条 $watch,用来检测它监视的
-model 里是否有变化的东西。当浏览器接收到可以被 AngularJs context 处理的事件时,$digest 循环就会触发,遍历所有的 $watch,最后
-$apply应用到dom,从而更新视图
-

1.2 Angular(脏值检查)

Angular是AngularJs的升级版,Angular中引入了zoneJs,将JavaScript的异步任务都包裹了一层,这些异步任务都将运行在ZoneJs的
-content中,这也是为什么Angular选择了拥抱浏览器原生的对象和方法的原因,当ZoneJs钩子被调用的时候,通知Angular,Angular
-此时再做相应的脏值检查,更新DOM即可
-

1.3 Vue(数据劫持)

vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时
-发布消息给订阅者,触发相应的监听回调
-
-
- -
- -
- - \ No newline at end of file diff --git a/2018/01/01/Angular-AOT/index.html b/2018/01/01/Angular-AOT/index.html deleted file mode 100644 index 89b6857..0000000 --- a/2018/01/01/Angular-AOT/index.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - Angular监控变化 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Angular监控变化

-
- -
-

Angular2如何实时监控变化?

先了解一个这样的问题,Javascript在整个运行时都可以被重写
-
1.覆盖浏览器的默认机制
Angular2启动的时候会对浏览器API打低级补丁,例如AddEventListener(),会覆盖原有的方法,对原有方法进行扩展
-这样才有机会进行更改检测,并做相关处理,对于浏览器的低级API补丁,Angular2采用Zonejs来完成,这是一种通用
-的机制,我们可以为浏览器添加额外的功能,Angular2内部使用Zone来触发更改机制,还有一种可能是执行应用程序
-分析,或跟踪多个虚拟机的堆栈信息进行跟踪
-    ZoneJS对浏览器所有基础事件进行了补丁,timeOut,interval,Ajax,click,hover等等,但是它是有限制的,因为zonejs不
-支持异步浏览器API,例如indexDB的回调,这样就解释了为什么他的变化会被检测到
-
2.检测机制触发后是如何工作
Angular2启动的时候,每一个组件都有一个关联的更改检测器
-1.缺省的变更机制
-    对于模板中使用的表达式,现有值与原来的值进行比较,默认情况的检查不会做深度对比,仅仅会对使用的属性进行对比
-2.changeDetection.OnPush && Immutable.js类似库
-    此种情况下引用的变更才会触发,而属性的改变不会触发,这样的检查显然是不靠谱的,所以引入了Immutable.js,来确保
-对象的不可变性,同时Angular2采用的是单向的数据流,这样就避免了angular1的双向绑定那个三重的for循环,进而提升了
-性能,Angular2的dev和生产模式下也是不同的,对于检查,在生产环境只会检查一次
-
3.是否可以手动关闭脏值检查,比如1秒触发一次脏值检查
1
2
3
4
 constructor(private ref:ChangeDetectorRef){
ref.detach();
setInterval(()=>{this.ref.detectChanges();},1000)
}
-
4.结论
Angular2和angular1的默认检查还是有很大不同的,做了一些优化,而且在Angular2中,变化检测是可以选择的
-
-
- -
- -
- - \ No newline at end of file diff --git "a/2018/01/01/Angular\345\256\236\346\227\266\347\233\221\346\216\247/index.html" "b/2018/01/01/Angular\345\256\236\346\227\266\347\233\221\346\216\247/index.html" deleted file mode 100644 index 6cabca9..0000000 --- "a/2018/01/01/Angular\345\256\236\346\227\266\347\233\221\346\216\247/index.html" +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - Angular-AOT - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Angular-AOT

-
- -
-

什么是AOT?

Angular2在早起版本中的打包文件过于庞大, Angular团队为此做的优化, AOT(ahead-of-time)为了编译出更高效的Angular程序
-
1.AOT做了什么?
没有AOT之前是怎么做的
-
-    1.下载资源
-    2.Angular渲染页面(Angular bootstraps)
-    3.Augular进行JIT编译过程,生成我们每个模块的JavaScript。
-    4.应用被渲染(rendered)完成,展示给用户
-
-    Angular2的AOT省去了浏览器中Angular加载后自身的编译过程,即上边的第三步,所以使得应用渲染更加快速
-
-
- -
- -
- - \ No newline at end of file diff --git a/2018/01/01/dialog/index.html b/2018/01/01/dialog/index.html deleted file mode 100644 index 1833594..0000000 --- a/2018/01/01/dialog/index.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - dialog - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

dialog

-
- -
-

初识Dialog

HTML5新推出的Dialog,感觉就和之前废弃的marquee差不多,下面就是它的一个基本例子

-
<dialog>
-        <div style="width:300px;height:200px;">我是新版的Dialog</div>
-    </dialog>
-

Dialog基础方法

let MyDialog = document.getElementsByTagName('dialog')[0];
-    MyDialog.showModal();//展示对话框
-    MyDialog.close();//关闭对话框
-   其实还有很多,想详细了解,很简单,复制上边代码试一下就可以了
-

Dialog事件

作为一个DOM元素,基本的事件都可以应用在Modal身上
-    let MyDialog = document.getElementsByTagName('dialog')[0];
-    MyDialog.onclick = function(){ console.log('我被点击了')};
-    MyDialog.onblur = function(){ console.log('我失去了焦点')};
-    MyDialog.onclose = function(){ console.log('我被关闭了')};
-

Dialog样式覆盖

一如我们覆盖默认的滚动条样式一样,我们可以设置其伪元素来达到覆盖样式的目的
-    dialog {
-        width: 300px;
-        height:200px
-    }
-    dialog::backdrop {
-        background-color: #dddddd;
-    }
-

Dialog支持度

Chrhome已经支持了,其他浏览器,应该不久之后也会支持
-

Dialog支持度Dialog官方文档

- -
- -
- -
- - \ No newline at end of file diff --git a/2018/01/01/html_dialog/index.html b/2018/01/01/html_dialog/index.html deleted file mode 100644 index 21b4c65..0000000 --- a/2018/01/01/html_dialog/index.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - html_dialog - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

html_dialog

-
- -
-

初识Dialog

HTML5新推出的Dialog,感觉就和之前废弃的marquee差不多,下面就是它的一个基本例子

-
<dialog>
-        <div style="width:300px;height:200px;">我是新版的Dialog</div>
-    </dialog>
-

Dialog基础方法

let MyDialog = document.getElementsByTagName('dialog')[0];
-    MyDialog.showModal();//展示对话框
-    MyDialog.close();//关闭对话框
-   其实还有很多,想详细了解,很简单,复制上边代码试一下就可以了
-

Dialog事件

作为一个DOM元素,基本的事件都可以应用在Modal身上
-    let MyDialog = document.getElementsByTagName('dialog')[0];
-    MyDialog.onclick = function(){ console.log('我被点击了')};
-    MyDialog.onblur = function(){ console.log('我失去了焦点')};
-    MyDialog.onclose = function(){ console.log('我被关闭了')};
-

Dialog样式覆盖

一如我们覆盖默认的滚动条样式一样,我们可以设置其伪元素来达到覆盖样式的目的
-    dialog {
-        width: 300px;
-        height:200px
-    }
-    dialog::backdrop {
-        background-color: #dddddd;
-    }
-

Dialog支持度

Chrhome已经支持了,其他浏览器,应该不久之后也会支持
-

Dialog支持度Dialog官方文档

- -
- -
- -
- - \ No newline at end of file diff --git "a/2018/01/01/webpack\345\205\245\351\227\250/index.html" "b/2018/01/01/webpack\345\205\245\351\227\250/index.html" deleted file mode 100644 index c1b0b93..0000000 --- "a/2018/01/01/webpack\345\205\245\351\227\250/index.html" +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - webpack入门 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

webpack入门

-
- -
-

Webpack

Webpack做了什么,它为前端的工程化开发提供了一套相对容易和完整的解决方案
-

1.entry

2.output

3.module

4.plugins

-
- -
- -
- - \ No newline at end of file diff --git a/2018/01/31/Parcel/index.html b/2018/01/31/Parcel/index.html deleted file mode 100644 index 24a47c7..0000000 --- a/2018/01/31/Parcel/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - Parcel - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-
-

Parcel

-
- -
-

ParcelJs

新的打包工具,他的名字叫Parcel,让你眼前一亮的感觉,Parcel GitHub地址

-

1.Parcel安装

如果你有Node/Yarn都可以 ,安装还是很简单

-
yarn global add parcel-bundler
-    npm install -g parcel-bundler
-

2.五行代码的DEMO

//打开命令行,新建文件,parcel index.html
-<html>
-    <body>
-      <script> console.log(1);</script>
-    </body>
-    </html>
- //打开你的浏览器 http://localhost:1234
-

有没有惊爆你的眼球,这。。。居然可以这样运行,简直是匪夷所思啊!

-

2.五行代码的DEMO

//打开命令行,新建文件,parcel index.html
-<html>
-    <body>
-      <script> console.log(1);</script>
-    </body>
-    </html>
- //打开你的浏览器 http://localhost:1234
-

有没有惊爆你的眼球,这。。。居然可以这样运行,简直是匪夷所思啊

-

3.Parcel特性

Parcel是无需任何配置的,是基于资源的,这意味着你的入口文件不必像之前一样,你的入口文件可以是任
意形态的资源,Parcel会自动的分析这些文件和包的依赖关系,同类资源会被组合到统一bundle中,同时
Parcel支持CommonJS 和 ES6 两种模块语法,无论是required还是import

-

4.如何使用其他依赖

虽然Parcel零配置,但是你需要额外的工具库,那么请安装它,parcel会自动扫描package.json文件,之后就可
以直接在项目中使用,比如我想构建scss

-
// 一行搞定
-npm install node-sass --save
-
-
- -
- -
- - \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b3e1a54 --- /dev/null +++ b/README.md @@ -0,0 +1,204 @@ +# RXJS + +## 简介 +RxJS是一套Js库,专注于解决非同步问题的完整解决方案,对于异步,我们会有很多种解答的方式,例如:ajax,XhrRequest,promise... + +## 基础知识 + +先看两个简单的DEMO,用这两段代码来描述一件事 + +> 遍历器模式(Iterator Pattern) + + let arr=['A','B']; + let iterator = arr[Symbol.iterator](); + +> 观察者模式(Observer Pattern) + + document.body.addEventListener('click',(e)=>{console.log(e)}); + Observable.fromEvent(document.body,'click').subscribe((e)=>{console.log(e)}); + +这两个都是异步获取元素的,差异在于前者主动请求,后者等待推送,Observable就是这两者概念的结合,陆续的我们会介绍一些概念 + +Observable: Observer,Subscription,Operator + +Subject + +Schedulers + + +## Observable 之 Observer + +Observer是一个简单的概念,就是一个观察者,一个由回调函数组成的对象,一个属性{closed},三个方法{next?,error?,complete?}, +Observer是可选的。在next、error 和 complete处理逻辑部分缺失的情况下,Observable仍然能正常运行,为包含的特定通知类型的处理逻辑会被自动忽略,当我们订阅的时候,最常用的就是next和error,例: + + var Subscription1=Observable.subscribe((res)=>{console.log(res)},(error)=>{console.log(error)}) + +## Observable 之 Subscription + +Subscription是可以关闭当前订阅的,拿上面的Subscription1来说,我如果不想订阅的时候,我可以调用Subscription1.unsubscribe()来解除订阅,Subscription有两个比较实用的方法,一个是unsubscribe(),unsubscribe()上边已经解释了,另外一个是remove(),remove()可以移除嵌套在内的子subscriber + +## Observable 之 Operator + +操作符将会占用很大的篇幅来描述,Observable的操作符实在是太多了,仅介绍比较常用的,对于其他操作符有兴趣,可以直接看API + +### 创建 Operator:create,of,from,fromPromise,fromEvent + + //create用于创建一个Observable对象,of用于同步请求,用来下面的observable1和observable2是等价的,就当前的情况,from也可以写出等价式子, + //from接收的是一个iterator对象,甚至你可以传递一个字符串给他 + var observable1 = Observable.create((observer)=>{observer.next('A');observer.next('B')};) + + //创建同步Observable的最佳方式 + var observable2 = Observable.of('A','B'); + + //神奇的from + var observable3 = Observable.from(['A','B']); + var observable4 = Observable.from('AB'); + var observable5 = Observable.from(new Promise((resolve, reject) => {resolve('AB')})); + var observable5 = Observable.fromPromise(new Promise((resolve, reject) => {resolve('AB')})); + var observable6 = Observable.fromEvent(document.body,'click').subscribe((e)=>{console.log(e)}); + observable1.subscribe((res)=>{console.log(res)}); + + +### 创建 Operator:empty, never, throw,interval, timer + + //empty 明确的告诉你,什么事情都没有做 + var observable1 = Observable.empty(); + + //never 订阅周期无穷,永远订阅不到 + var observable2 = Observable.never() + + //throw 手动抛出异常 + var observable3 = Observable.throw('Fail') + + //interval setInterval + var observable4 = Observable.interval(1000) + + //timer setTimeOut + var observable5 = Observable.timer(1000,?5000) + + +### 过滤 Operator:take,takeUntil,first,Last,takeLast + + //take 取前几个,比如最初的例子,我仅仅取一次点击事件 + var observable1 = Observable.fromEvent(document.body,'click').take(1).subscribe(); + + //takeUntil 直到发生某些事情,才会终止当前的订阅行为 + var observable2 = Observable.interval(1000); + var click = Observable.fromEvent(document.body,'click'); + observable2.takeUntil(click).subscribe(); + + //first 与take表现相似,不过功能简单仅仅取第一个,take(1) == first() + var observable3 = Observable.interval(1000); + observable3.first().subscribe() + + //Last,takeLast获取最后一个和获取最后几个 + var observable4 = Rx.Observable.interval(1000).take(6); + var observable5 = observable4.Last(); + var observable6 = observable4.takeLast(2); + + +### 过滤 Operator:skip,filter,map,mapTo,startWith + + //skip 与take相反,可以跳过几个 + var observable1 = Observable.interval(1000).take(4).skip(2); + + //filter 过滤器,根据字意就可以知道,是一个功能强大的过滤器 + var observable2 = Observable.interval(1000).filter((x) => (x>3)); + + //map 传参一个回调函数 + var observable3 = Observable.interval(1000).map((x) => (x++)); + + //mapTo 将Observable的返回值置为特定值 + var observable4 = Observable.interval(1000).mapTo(20); + + //startWith 将指定Observable的初始值 + var observable5 = Observable.interval(1000).startWith(80000); + + +### 合并 Operator:concat,concatAll,merge,combineLatest,zip + + //concat,concatAll类似,用于顺序合并流,1-2-3顺序发生的顺序表现 + var observable1 = Observable.from('ABC'); + var observable2 = Observable.interval(500).take(2); + var observable3 = Observable.of('K','J'); + Observable.concat(observable1,observable2,observable3); + var source = Observable.of(observable1, observable2, observable3).concatAll().subscribe(); + + //merge,用于合并并行的流,当有多个推送值时,哪个先来用哪个 + var observable4 = Observable.interval(500).mapTo(0); + var observable5 = Observable.interval(500).mapTo(1); + + //combineLatest 合并两个流的每一次最新的数据,之后返回,表现形式比较特殊 + var observable6 = Observable.interval(500).take(3); + var observable7 = Observable.interval(300).take(6); + var example = observable6.combineLatest(observable7, (x, y) => x + y); + + //zip 多个流,取相同顺位的数据进行合并 + var observable8 = Observable.interval(500).take(3); + var observable9 = Observable.interval(300).take(6); + var example = observable8.zip(observable9, (x, y) => x + y); + + +### 合并 Operator:scan,buffer{buffer,bufferCount,bufferTime,bufferToggle,bufferWhen} + + //scan类似于原生Js的reduce方法,及其的相似 + var observable1 = Observable.from('rxjs').zip(Rx.Observable.interval(600), (x, y) => x); + var observable2 = observable1.scan((origin, next) => origin + next, ''); + + //buffer当触发某些事件的时候,一次性发出相关数据流 + var observable3 = Observable.interval(300); + var observable4 = Observable.interval(1000); + var observable5 = observable3.buffer(observable4);//每次observable4有数据,observable3之前累积的为一组 + var observable6 = observable3.bufferTime(1000);//一秒一组 + var observable7 = observable3.bufferCount(3);//三个一组 + var observable8 = Observable.fromEvent(document, 'click'); + var observable9 = observable8.bufferWhen(() =>Observable.interval(1000 + Math.random() * 4000)); + var observable10 = observable8.bufferToggle(openings, i =>* i % 2 ? Observable.interval(500) : Observable.empty();); + + +### 优化 Operator:delay,delayWhen,throttle,debounce,distinct + + +### 优化 Operator:catch,retry,repeat,retryWhen + + +### 优化 Operator:mergeAll,switch,switchMap,concatMap,mergeMap + + +## Observable 之 Subject + +首先Subject可以订阅Observable,所以代表他是一個Observer,同时Subject又可以被Observer订阅,代表他是一个Observable + + +### Subject Operator:Subject, BehaviorSubject, ReplaySubject, AsyncSubject + + var subject = new Rx.Subject(); + subject.subscribe(observerA); + subject.subscribe(observerB); + subject.next(); + //BehaviorSubject用于获取当前流的实时状态,它总是获取最新的 + var subject = new Rx.BehaviorSubject(0); + subject.subscribe(observerA); + setTimeout(()=>{subject.subscribe(observerB);},1000) + //ReplaySubject用于订阅重复值,AsyncSubject用于订阅最后一个 + ReplaySubject(1) = BehaviorSubject(0); + + +## Observable 之 Scheduler + + +### Scheduler Operator:queue, asap, async, animationFrame + + + + + + + + + + + + + + diff --git a/archives/2017/03/index.html b/archives/2017/03/index.html deleted file mode 100644 index e3d12ca..0000000 --- a/archives/2017/03/index.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - 归档 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git a/archives/2017/05/index.html b/archives/2017/05/index.html deleted file mode 100644 index 5e0b99f..0000000 --- a/archives/2017/05/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - 归档 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git a/archives/2017/06/index.html b/archives/2017/06/index.html deleted file mode 100644 index 2187d98..0000000 --- a/archives/2017/06/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - 归档 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git a/archives/2017/08/index.html b/archives/2017/08/index.html deleted file mode 100644 index e9baba1..0000000 --- a/archives/2017/08/index.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - 归档 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git a/archives/2017/index.html b/archives/2017/index.html deleted file mode 100644 index a129c09..0000000 --- a/archives/2017/index.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - 归档 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - - - -
- - \ No newline at end of file diff --git a/archives/2017/page/2/index.html b/archives/2017/page/2/index.html deleted file mode 100644 index 21cb5b8..0000000 --- a/archives/2017/page/2/index.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - 归档 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - - - -
- - \ No newline at end of file diff --git a/archives/2018/01/index.html b/archives/2018/01/index.html deleted file mode 100644 index 3e5a628..0000000 --- a/archives/2018/01/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - 归档 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git a/archives/2018/index.html b/archives/2018/index.html deleted file mode 100644 index 3e5a628..0000000 --- a/archives/2018/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - 归档 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git a/archives/index.html b/archives/index.html deleted file mode 100644 index 8651274..0000000 --- a/archives/index.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - 归档 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - - - -
- - \ No newline at end of file diff --git a/archives/page/2/index.html b/archives/page/2/index.html deleted file mode 100644 index 9249e39..0000000 --- a/archives/page/2/index.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - 归档 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - - - -
- - \ No newline at end of file diff --git a/css/style.css b/css/style.css deleted file mode 100644 index 21a88be..0000000 --- a/css/style.css +++ /dev/null @@ -1,317 +0,0 @@ -body { - margin: 0; - text-shadow: 0 6px 10px #c4b59d, 0px -2px 3px #fff; - background: linear-gradient(to bottom, #ece4d9 0%, #e9dfd1 100%); - border-radius: 20px; -} -html, -body, -.container { - height: 100%; - font-family: "Arial Rounded MT Bold", "Helvetica Rounded", Arial, sans-serif; - color: #444; -} -.container { - max-width: 840px; - margin: 0 auto; -} -a { - color: #000; - text-decoration: none; -} -.home { - display: table; - width: 100%; - height: 100%; -} -.home .info { - display: table-cell; - vertical-align: middle; - text-align: center; -} -.home .info .logo { - font-size: 2.5em; - font-weight: bold; -} -.home .info .subtitle { - font-size: 14px; - color: #808080; -} -.home .info .sns { - margin: 1em auto; -} -.home .info .sns a { - width: 55px; - color: #999; - display: inline-block; -} -.home .info .sns a:hover { - color: #000; -} -.home .info footer { - border: 0; - color: #000; - padding: 0; -} -.page { - margin: 0 20px; - margin-bottom: 2em; -} -.page p { - line-height: 1.5em; -} -/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ -/* Tomorrow Comment */ -.highlight .comment, -.highlight .quote { - color: #8e908c; -} -/* Tomorrow Red */ -.highlight .variable, -.highlight .template-variable, -.highlight .tag, -.highlight .name, -.highlight .selector-id, -.highlight .selector-class, -.highlight .regexp, -.highlight .deletion { - color: #c82829; -} -/* Tomorrow Orange */ -.highlight .number, -.highlight .built_in, -.highlight .builtin-name, -.highlight .literal, -.highlight .type, -.highlight .params, -.highlight .meta, -.highlight .link { - color: #f5871f; -} -/* Tomorrow Yellow */ -.highlight .attribute { - color: #eab700; -} -/* Tomorrow Green */ -.highlight .string, -.highlight .symbol, -.highlight .bullet, -.highlight .addition { - color: #718c00; -} -/* Tomorrow Blue */ -.highlight .title, -.highlight .section { - color: #4271ae; -} -/* Tomorrow Purple */ -.highlight .keyword, -.highlight .selector-tag { - color: #8959a8; -} -.highlight { - display: block; - overflow-x: auto; - background: #fff; - color: #4d4d4c; - padding: 0.5em; -} -.highlight .emphasis { - font-style: italic; -} -.highlight .strong { - font-weight: bold; -} -.header { - height: 2rem; - padding: 0 20px; -} -.header .blog-title { - font-size: 2.5em; - text-align: center; - padding-top: 0.5em; -} -.header .subtitle { - font-size: 14px; - color: #808080; -} -.header .menu { - margin: 0; - padding: 0; - margin-top: 20px; -} -.header .menu .menu-item { - margin: 0 15px 0 0; - padding: 20px 0 3px 0; - float: left; - display: inline-block; -} -.header .menu .menu-item-link { - color: #999; -} -.header .menu .menu-item-link:hover { - color: #000; -} -.post { - padding: 0 20px; - margin-bottom: 1.5em; - text-shadow: initial; -} -.post img { - max-width: 100%; -} -.post table { - border-collapse: collapse; - border-spacing: 0; -} -.post table td, -.post table th { - padding: 6px 13px; - border: 1px solid #dfe2e5; -} -.post hr { - margin: 1.5em 0; -} -.post .post-content { - text-align: justify; -} -.post .post-content a { - border-bottom: 1px dotted; -} -.post .post-content a:hover { - border-bottom: 1px solid; -} -.post .post-content ul, -.post .post-content ol { - text-align: left; -} -.post .post-content ul li, -.post .post-content ol li { - padding: 5px; - line-height: 1.5em; -} -.post figure { - margin: 0; -} -.post figure table { - width: 100%; -} -.post figure table .code { - border: 0; - padding: 0; -} -.post figure .gutter { - display: none; -} -.post blockquote { - margin: 0; - padding: 0 15px; - color: #777; - border-left: 4px solid #ddd; -} -.post pre { - font-family: initial; - margin: 0; - padding: 0.5em 1.5em; - overflow: auto; - font-size: 85%; - line-height: 1.8; - background-color: #f7f7f7; - border: 1px solid #ccc; -} -.post code { - background: #f7f7f7; - font-family: inherit; - font-size: 90%; - margin: 5px; - padding: 0 5px; -} -.post p { - line-height: 1.5em; -} -.post .post-footer { - line-height: 1; - min-height: 1em; - padding-top: 2rem; -} -.post .post-footer .top { - float: right; - color: #666; -} -.post .post-footer .top:hover { - color: #000; -} -.post .post-footer .post-tag-list { - display: inline-block; - padding: 0; - margin: 0 0 0.5em 0; - color: #999; -} -.post .post-footer .post-tag-list .post-tag-list-item { - display: inline-block; - margin: 0 1em 0 0; -} -.post .post-footer .post-tag-list .post-tag-list-item a { - font-size: 85%; -} -.post .post-footer .post-tag-list .post-tag-list-item:before { - content: '标签:'; -} -.article-title { - line-height: 2.2em; - border-bottom: 1px solid #eee; - text-align: center; - font-size: 2rem; -} -.archive { - padding: 0 20px; - margin-bottom: 1em; -} -.archive .post-archive { - list-style: none; - padding: 0; -} -.archive .post-archive .post-item { - margin: 10px 0 20px 0; - line-height: 1.5; -} -.archive .post-archive .post-item .post-date { - float: right; -} -@media screen and (max-width: 425px) { - .archive .post-archive .post-item .post-date { - float: none; - margin-left: 0.5em; - font-size: 90%; - color: #999; - } -} -.archive .post-archive .post-item .post-title { - border-bottom: 1px dotted; -} -.archive .post-archive .post-item .post-title:hover { - border-bottom: 1px solid; -} -.page-nav { - padding: 0 20px; -} -.page-nav .prev, -.page-nav .page-number { - padding: 10px 20px 10px 0; -} -.page-nav .next { - float: right; -} -.page-nav a { - color: #777; -} -.page-nav a:hover { - color: #000; -} -footer { - position: fixed; - color: #000; - text-align: right; - right: 20px; - bottom: 20px; -} diff --git a/index.html b/index.html index 0f85925..85ab829 100644 --- a/index.html +++ b/index.html @@ -1,45 +1,10 @@ - - - - - - 小韩 - - - - - - - - - - - - + + - -
-
-
- -
-
- - Blog - - GitHub - -
- -
-
-
- + + Han,C + \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html deleted file mode 100644 index 0f85925..0000000 --- a/page/2/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - 小韩 - - - - - - - - - - - - - - -
-
-
- -
-
- - Blog - - GitHub - -
- -
-
-
- - \ No newline at end of file diff --git a/tags/Angular/index.html b/tags/Angular/index.html deleted file mode 100644 index a10f58b..0000000 --- a/tags/Angular/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - 标签 : Angular - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git a/tags/HTML5/index.html b/tags/HTML5/index.html deleted file mode 100644 index 4623dcc..0000000 --- a/tags/HTML5/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - 标签 : HTML5 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git a/tags/JavaScript/index.html b/tags/JavaScript/index.html deleted file mode 100644 index bb095fa..0000000 --- a/tags/JavaScript/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - 标签 : JavaScript - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git a/tags/Vue/index.html b/tags/Vue/index.html deleted file mode 100644 index bef53b3..0000000 --- a/tags/Vue/index.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - 标签 : Vue - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git a/tags/css/index.html b/tags/css/index.html deleted file mode 100644 index 6b17efc..0000000 --- a/tags/css/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - 标签 : css - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git a/tags/webpack/index.html b/tags/webpack/index.html deleted file mode 100644 index 81ae72e..0000000 --- a/tags/webpack/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - 标签 : webpack - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git "a/tags/\345\211\215\347\253\257\346\236\204\345\273\272/index.html" "b/tags/\345\211\215\347\253\257\346\236\204\345\273\272/index.html" deleted file mode 100644 index 1ca73af..0000000 --- "a/tags/\345\211\215\347\253\257\346\236\204\345\273\272/index.html" +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - 标签 : 前端构建 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file diff --git "a/tags/\346\265\217\350\247\210\345\231\250/index.html" "b/tags/\346\265\217\350\247\210\345\231\250/index.html" deleted file mode 100644 index 75e7912..0000000 --- "a/tags/\346\265\217\350\247\210\345\231\250/index.html" +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - 标签 : 浏览器 - 小韩 - - - - - - - - - - - - - - -
-
- -
-
-

人若没有梦想,和咸鱼有什么区别

- -
- - - -
- - \ No newline at end of file