Hank's House


  • Home

  • About

  • Tags

  • Categories

  • Archives

算法

Posted on 2018-02-26

获取页面HTML标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//获得页面所有HTML标签。一是获取,二是去重
var a = document.getElementsByTagName('*');
var arr = [],ar=[];
function m(){
for(var i=1;i<a.length;i++){
ar.push(a[i].tagName);
}
for(var j=0;j<ar.length;j++){
if(arr.includes(ar[j])===false){
arr.push(ar[j]);
}
}
return arr;
}
1
2
3
4
5
//Best方案ES6,利用set特性去重
let tags = [...document.getElementsByTagName('*')].map((v) => {
return v.tagName
})
tags = [...new Set(tags)]

快速排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//快速排序
function quicksort(x){
if(x.length<= 1){//必须<=
return x;
}

let middle = x.splice(Math.floor(x.length/2),1);
let left = [],right = [];

for(let i = 0;i<x.length;i++){
if(x[i]<middle){
left.push(x[i]);
}else{
right.push(x[i])
}
}
return quicksort(left).concat(middle,quicksort(right));
}
var result = quicksort([2,1,4,7,3,8,5,0]);

冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//冒泡排序
function bubblesort(x){
for(let i = 0,len = x.length;i<len;i++){
for(let j = i+1;j<len;j++){//区间继续优化
if(x[i]>x[j]){
let temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
return x;
}
var result = bubblesort([2,1,4,7,3,8,5,0]);
console.log(result);

参考:https://blog.csdn.net/szu_aker/article/details/52295488

选择排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function chose(x) {
var len = x.length,
minindex, middle;
for (let i = 0; i < len; i++) {
minindex = i;
for (let j = i + 1; j < len; j++) {
if (x[j] < x[minindex]) {
minindex = j; //不断循环找最小值的索引
}
}
middle = x[i];
x[i] = x[minindex];
x[minindex] = middle;

}
console.log(x);
}
chose([2,4,0,1,2,8,5])

深拷贝

1
2
3
4
5
6
7
8
9
function deepclone(obj){
let newObj = obj.constructor=== Array?[]:{};
for(let i in obj){
newObj[i] = typeof obj[i] === 'object'?deepclone(obj[i]):obj[i];
}
return newObj;
}
var result = deepclone({m:[1,2],n:{k:5}});
console.log(result);

找重复字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var str = 'aasjhdhdhjjjsssa';
str = str.split('').sort().join(''); //排序
var value = '',
index = 0;
var re = /(\w)\1+/g;
str.replace(re, function($0, $1) {
//$0 是aaa dd ...这几项。$1是a d ..这几项
//执行时是一个个执行的,先是aaa,再是dd这样子
if (index < $0.length) {
index = $0.length; //不断覆盖长度短的,故最终的index就是最长的
value = $1; //最终的value就是最长的那个元素
//一个小bug,最长的有好几个怎么办,加入index===$0.length的判断
}
})
console.log(index + 'is' + value)

数组降维

如[[1,2],[3,4]]到[1,2,3,4].(二维数组降维)

1
2
3
4
5
6
7
8
9
10
//嵌套循环
function reduceDimension(arr){
var reduced = [];
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr[i].length;j++){
reduced.push(arr[i][j]);
}
}
return reduced;
}

1
2
3
4
5
6
7
8
//concat
function reduceDimension(arr){
var reduced = [];
for(var i=0;i<arr.length;i++){
reduced = reduced.concat(arr[i]);
}
return reduced;
}
1
2
3
4
5
//apply concat
//apply参数1为被调用函数的this,参数2为被调用对象的arguments。即数组的各个元素依次成为被调用函数的各个参数。
function reduceDimension(arr){
return Array.prototype.concat.apply([],arr);
}

多维数组递归降维。(后续补充)

hexo相关

Posted on 2018-02-23

github上传问题
在gitbash里执行;gitbash右键失效在注册表里更改,先导出更改完再运行来修复错误;github pages io 404无效,待解决。
npm install hexo-generator-index –save 这个命令真特么是个大坑!

hexo clean 清除缓存文件和已生成的静态文件
hexo generete(可简写为hexo g) 生成静态文件。-d deploy生成后立即部署网站。合起来为hexo g -d

leancloud实现hexo版面控制比如评论什么的

git config –global core.autocrlf false 解决deploy出现warning:LF will be replaced…

http2.0新特性详解

Posted on 2018-02-21

参考:http://www.alloyteam.com/2015/03/http2-0-di-qi-miao-ri-chang/

二进制分帧

应用层和传输层之间添加二进制分帧层,将传输的信息分割成更小的信息和帧进行二进制编码。更底层的二进制数据流有助于低延迟。
其中,首部信息封装到headers帧,请求体封装到Data帧中。

首部压缩

由于每次请求和响应时,请求头和响应头总有重复的部分,故在客户端和服务器端使用首部表存储键值对。对于相同的数据不再发送。
若有不同,则在headers帧中发送变化了的数据,有更改的首部帧被添加到首部表中。

一个TCP连接

TCP在长时间连接时传输数据块的效率最高(慢启动slow start)。
不同浏览器内核允许的TCP连接数不同,一个域名下最多6个。故采用域名分区,比如多个CDN,提高并行下载能力。
由于HTTP连接是一个个按顺序请求响应的,故HTTP2.0进一步改善————多路复用。

多路复用

一个HTTP连接上允许多个请求响应,资源并行交错发送。
本质:
http信息拆分为独立的帧,交错发送,在另一端根据首部信息重组。双向数据流乱序发送。(域名分区优化无效)
同时,2.0的请求优先级优化了下载。

服务器端推送

对客户端一个请求发送多个响应。
请求html时,其他资源会预推送。

###附录1:关于http1.x
无状态:不保留上一个HTTP请求的相关信息(即无上下文)。(服务端不知道客户端的状态)
注释:前期网页比较简单时数据关联度低不需要有状态。后期交互增强,数据前后有依赖,故产生了cookie、session等状态存储部件。
keep-alive:TCP长连接,一个TCP不断开,上可串行进行多个HTTP请求
参考:
http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/
https://blog.csdn.net/sundacheng1989/article/details/28239711

###附录2:关于缓存
DNS缓存:域名与IP地址的关联缓存,下次访问无需查找。
cache-control Expires:基于时间有效期,不适合随时有更新的页面资源
ETag If-None-Match:基于版本
Last-Modified If-Modified-Since:基于最后一次修改时间

vue中的axios与promise

Posted on 2018-02-21

以公共组件实例说明。

子组件son:

1
2
3
4
<button @click="getData"></button>
getData(){
this.$emit('getData');
}

父组件
1
2
3
4
5
6
7
8
<son @getData='getData'></son>
<div></div>//获取的数据显示在这里

getData(){
axios.get('url').then((res)=>{
this.here = res;
})
}

结论:axios请求放在父组件中,通过触发子组件中的自定义事件来实现。

由于axios请求多的话,参数中会有不少重复的,故可单独建立config.js

1
2
3
4
5
6
7
8
9
10
11
export default {
method: 'get',
url: 'localhost:6666',
headers: {
token: 'ftv1443qby6bdfa41t90sfvq89hg3h54u989m9imog79g4'
},
data: {
id: 666,
name: 'ColMugX'
}
}
1
2
3
4
5
6
7
8
9
10
11
12
//主文件中引入
import axios from 'axios'
import config from './config'

let conf = config;
conf.url = '';//修改与配置不同的配置
//此处可以使用请求拦截器
/*axios.interceptors.request.use((config)=>{
config.url = '';
return config;
})*/
axios(config).then(...)

post请求引入qs对编码进行格式化,处理url查询参数,如axios.post(‘foo’,qs.stringify(config.data))

axios同时执行多个请求(类似promise)

1
2
3
4
5
6
7
8
9
10
function A(){
return axios.get('');
}
function B(){
return axios.post('','');
}
axios.all([A(),B()])
.then(axios.spread((res1,res2)=>{
//对两个数据进行相应处理
}))

二次封装

目的:配置项独立(config.js)、错误统一处理、接口统一归类(api.js)

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
//axios封装为fetch,直接取链接就好 
//axio.js
import config from 'config.js'
//加个拦截器处理请求和响应
axios.interceptors.response.use(
response => {
return response
},
error => {
if(error.response){
switch (error.response.status){
case 404:
console.log('request 404');
break
case 500:
console.log('request 500')
break
}
}
console.log(error);
return Promise.reject({code:'-100',message:'wait'})
}
)
//封装请求并暴露出来
export function fetch(url,options) {
var opt = options||{}
return new Promise((resolve,reject)=>{
axios({
method:opt.type || 'get',
url: url,
params: opt.params || {},
// 判断是否有自定义头部,以对参数进行序列化。不定义头部,默认对参数序列化为查询字符串。
data: (opt.headers ? opt.data : stringify(opt.data)) || {},
responseType: opt.dataType || 'json',
// 设置默认请求头
headers: opt.headers || {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
})
.then(res => {
if(res.data.code===0){
rersolve(res.data)
}else if(res.data.code==='000'){
resolve(res.data)
}else{
reject(res.data)
}
})
.catch(error=>{
console.log(error)
})
})
}
export default axios
//父组件中调用时
fetch('url',{}).then()
//options可选,比如请求类别等均可在调用时覆盖

vuex Q&A

Posted on 2018-02-20

Q:Vue.js中ajax请求代码应该写在组件的methods中还是vuex的actions中?
详细问题:
一种是:“请求后端接口”这个ajax代码应该是写在按钮的点击事件处理函数中,然后在这个处理函数里面提交mutations
还一种是:直接将“请求后端接口”这个ajax代码写在actions中,actions中提交mutations,按钮的点击事件处理函数中只写一个分发actions的按钮
A:数据如果不是公用的,那就放在methods里;否则统一放到actions中进行调度。另,单独分离出一个api.js进行处理。

Q:关于mutations-type

居中 单列多列 双飞翼 圣杯

Posted on 2018-02-20

参考文档:
https://segmentfault.com/a/1190000008789039
https://www.cnblogs.com/woodk/p/5147085.html

居中

水平居中

子元素为行内元素还是块状元素,宽度一定还是宽度未定,采取的布局方案不同。下面进行分析:

行内元素:对父元素设置text-align:center;
定宽块状元素: 设置左右margin值为auto;
不定宽块状元素: 设置子元素为display:inline,然后在父元素上设置text-align:center;
通用方案: flex布局,对父元素设置display:flex;justify-content:center;

垂直居中

垂直居中对于子元素是单行内联文本、多行内联文本以及块状元素采用的方案是不同的。

父元素一定,子元素为单行内联文本:设置父元素的height等于行高line-height
父元素一定,子元素为多行内联文本:设置父元素的display:table-cell或inline-block,再设置vertical-align:middle;
块状元素:设置子元素position:fixed(absolute),然后设置margin:auto;
通用方案: flex布局,给父元素设置{display:flex; align-items:center;}。
对于宽高不定,使用transform:translateX(-50%)这种来进行反向居中校正。

单列/多列

单列

两种情况:
""
前者父元素{
margin:0 auto;
max-width:xxpx;
}
后者content部分设置同上即可。header和footer宽度设为100%。

两列/三列

前者:侧栏定宽,主栏自适应
后者:两侧侧栏定宽,中间栏自适应
1、float+margin
左右两侧定宽&float:left、right,中间栏margin-left\right为左右两栏的宽度。

1
2
3
4
5
<div id="content">
<div class="left">sub</div>
<div class="right">extra</div>
<div class="main">main</div>
</div> //注意先写两侧栏再写中间栏,否则侧栏会被挤到下一列

2、absolute+margin
左右两侧absolute定位定宽,中间margin:0 xxpx;
html标签顺序书写。注意,若中间栏有最小宽度限制,会出现侧边栏和中间栏重叠。(因为绝对定位了)

圣杯布局

float+负margin+padding+relative,main部分可设置最小宽度以防缩放混乱。
缺点:main最小宽度不能小于左侧栏

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
 <div id="bd">         
<div class="main"></div>
<div class="left"></div>
<div class="right"></div>
</div>
<style>
.main {
float: left;
width: 100%;
}
.left {
float: left;
width: 190px;
margin-left: -100%;
position: relative;
left: -190px;
}
.right {
float: left;
width: 230px;
margin-left: -230px;
position: relative;
right: -230px;
}
#bd {
padding: 0 230px 0 190px;
}
</style>

双飞翼布局

float+负margin+margin

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
<div id="main-wrap" class="column">
<div id="main">#main</div>
</div>
<div class="left"></div>
<div class="right"></div>
<style>
#main-wrap {
float: left;
width: 100%;
}
.left {
float: left;
width: 190px;
margin-left: -100%;
height:400px;
}
.right {
float: left;
width: 230px;
height:400px;
margin-left: -230px;
}
#main {
margin: 0 230px 0 190px;
}
</style>

因为main外面套了一个div,故其margin变化不影响侧栏。省掉了圣杯布局中对侧栏进行relative设置。

flex布局 grid布局

flex无法同时满足水平和垂直两个维度的布局。

响应式布局(响应式图片)

Posted on 2018-02-14

缩放布局:元素缩放
流式布局:百分比+min-width,容器缩放
弹性布局:rem em
响应式设计:媒体和媒体查询、弹性网格布局(流式布局)、弹性图片
关注点:浏览器(web端五种;移动端主要是内置、可下载、代理、WebView)视口(浏览器窗口)

meta标签

content为必须属性(定义与name或http-equiv相关的元信息),可选属性有name(添加关键词,利于SEO)、http-equiv(发送到服务器请求头包含的内容比如expires、charset等)、scheme。
如

1
<meta http-equiv="refresh" content="2;url=http://www.baidu.com">

意味着2秒后页面重定向到百度。name和http-equiv均配合content进行使用。
常用标签:
charset=”utf-8”
name=”keywords” content=”your keywords”
name=”description” content=””
name=”author” content=””
name=”robots” content=”index,follow”//搜索引擎抓取方式
name=”viewport” content=”width=device-width,initial-scale=1,maximum-scale=1,user-scalable=yes”//移动端布局(高宽度、初始缩放比例、最大/最小缩放比例、是否允许用户缩放)
name=”apple-moblile-web-app-capable” content=”yes”//删除苹果默认工具栏菜单栏
http-equiv=”X-UA-Compatible” content=”IE=edge,chrome=1” 优先使用最新的IE和chrome

媒介查询media queries(自适应布局)

写于style中,针对不同屏幕尺寸使用不同的css格式。(含浏览器缩放)

1
2
3
4
5
@media screen and (min-width:300px) { //横竖屏切花也是使用media screen
body{
background-color:red;//当屏幕宽度小于300px时背景变红。
}
} //设置多种视图宽度,比如在200px-500px之间的格式...

图片自适应:max-width设置为100%

弹性布局

包裹文字的部分使用rem em,划分区域仍使用百分比或px。
布局不变,只会缩放。

流式布局

百分比。布局不变,屏幕尺度跨度过大时无法正常显示。

响应式布局

综合上述方法。

###响应式图片
1、resize事件判断屏幕
2、srcset:

1
2
3
4
5
6
7
<img srcset="1-320w.jpg 320w,
2-480w.jpg 480w,
3-800w.jpg 800w"
sizes="(max-width:320px) 280px,
(max-width:480px) 440px,
800px"
src="3-800w.jpg" alt="xx">

详解:
srcset:多张图+图片的固有宽度(注意单位w)
sizes:屏幕最大宽度320px时,选择最接近280px(图像填充的槽宽度)的图片,默认是800px
提供src图片用于无法识别srcset的浏览器,保证兼容性
另:按需请求相应图片,能少就少,极大减少了带宽
另:分辨率切换,不需要设置sizes,只需把320w等换成描述分辨率的即可。
3、picture标签:里面包含source和img标签,source提供多样的img资源,比如设置srcset和media设置不同屏幕的显示图片
1
2
3
4
5
<picture>
<source media="(max-width: 600px)" srcset="111.jpg">
<source media="(min-width: 800px)" srcset="11.jpg">
<img src="11.jpg" alt="Chris standing up holding his daughter Elva">
</picture>

选择这个还是上一种方法因人而异,通常web开发者习惯选择picture,而浏览器开发者大概会选择上一种。
4、svg

vue学习-父子组件通信(一)

Posted on 2018-02-14

第一部分:Vue的组件基础

变量写到data中,而不是设为全局对象。否则会导致各组件耦合程度加深。组件本身相当于闭包。

反例:

1
2
3
4
var data = {counter:0}
data(){
return data //在使用多个计算器按钮子组件时,避免互相之前影响数值变化。
}

第二部分:props(父组件传给子组件)

props写在子组件中,参数为父组件传入的参数。

1
2
3
4
5
6
7
8
9
10
*子组件 son.vue:*
//props:['xx'] //这个xx的值由父组件传入,在模板中使用可以为``
props:{xx:{
type:String,
default:'', //也可以是函数
validator:function(value){
return value>1
}
}
}

父组件:
引入son.vue命名为son,模板中为
通过 v-bind:xx 实现动态更新参数xx的值,该值即传入子组件中。
注意:props支持驼峰命名,父组件中xx部分可化为短横线。
如果参数很多且属于同一体系中,可直接props接受一个对象作为参数。示例:
template中为modal.title等参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
props:['modalOption']
computed:{
modal:{
get(){
let modal = this.modalOption;//此处接收父组件的参数并赋值给modal
modal = {//再次赋值是为了初始化默认值,比如有的父组件未传参,直接取默认值就好
title:modal.title,
text:typeof modal.text==='String'?modal.text:'a'
}
return modal;//这样最终得到的参数兼具传参和默认值了
}
}
}

父组件:


data()….modaldata:{
title:’xx’,
text:’xx’
}

## 第三部分:自定义事件(子组件传给父组件)

1
2
3
4
5
6
7
8
9
10
11
 
*子组件*
<button @click="dothis"></button>
dothis(){
this.$emit("dothis","data")//将data传到父组件后直接执行相应事件
}
*父组件*
<div @dothis="showdata"></div>
showdata(data){
console.log(data) //父组件中使用了子组件传过来的参数
}

常用的示例:
公共组件中既有自定义事件(用于将click等事件在父组件中设置),也有props用于父组件传参。比如todosX号按钮和todo的公共组件。

组件绑定原生事件:
正常DOM绑点:
组件绑定:

第四部分:slot的使用

子组件

xxx //this.$slots包括各个命名slot
父组件

content



h1的内容会覆盖slot中的xxx。适用于扩展性复用组件中的预留接口,比如按钮上写的字样,可供后续更改。
父组件中无内容则显示slot中的部分,有内容则替换slot中的部分。

第五部分:ref的使用

即子组件索引,仅作为访问子组件的应急方案。
父组件

1
2
3
4
5
6
7
8
 
<son ref="son"></son>
import son from 'son.vue'
methods:{
x(){
this.$refs.son.someMethod();//执行子组件son中的方法。this指的是当前vue实例。
}
}

组件间方法传递。

第六部分:is的使用

is特性扩展为原生组件

1
2
3
4
 
<ul>
<li :is="son"></li>
</ul>

其中li实际为名为son的子组件。
配合keep-alive
1
2
3
4
 
<keep-alive>
<component :is='currentView'></component>//currentView可以设置为任意子组件,keep-alive保证切换出去的子组件仍然保留在内存中。
</keep-aliev>

第七部分:filters computed watch

过滤器&计算属性&监视器:
前者用于mustache绑定即双大括号,如{{ message|cap }}

1
2
3
4
5
6
 
filters:{
cap(value){
return value.split('');
}//将message绑定的字符串转换为数组
}

后者用于指令中的绑定,
data中有message的值,对于{{reMes}},反转message
1
2
3
4
5
6
 
computed:{//依赖缓存!!!如只要message不变,多次访问reMes也不变
reMes(){
return this.message.split('').reverse().join('');//本质是属性reMes的getter
}
}

关于setter属性,类似反向解析,已知reMes得出其他结果。
watch:用于执行异步操作时,时刻监测异步执行的进度。如在输入时显示正在输入。

第八部分:指令解惑

v-if v-show:
前者满足条件才会渲染,用于运行环境不太可能更改的情况,如登录注册;
后者初始化时即渲染,用于频繁切换的场景,如下拉菜单(只是css切换,相当于display)
v-model:

1
2
3
4
5
 
<input v-model="input"></input>
data:{
input:'' //输入值
}

语法糖,相当于v-bind:value=”input”和v-on:input=”input=$event.target.value”
v-for:
:key 用于VUE识别节点
key value index的灵活使用
v-once:表示只渲染一次,建议使用在纯静态界面,不会再次渲染耗时。如

实践:可复用组件封装modal

Hello World

Posted on 2018-01-10

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

123

Hank

29 posts
11 tags
© 2019 Hank
Powered by Hexo
|
Theme — NexT.Mist v5.1.4