iview树组件源码阅读笔记
好久没有记一些东西了,本菜鸡又来水文章了。
写在前面
iview里面的树组件思路跟vue官网上的树形视图示例类似,应用了组件的递归使用(好像是废话
整个树组件里有两个vue文件,一个是递归使用的node.vue,一个是父组件tree.vue
组件内的事件大致分为三种:expand(展开)、select(点击节点title触发)和check(复选框的选中与取消触发)
node.vue
这个组件内包括树组件的一个选项,以及它的children(如果有)
template
1 | <template> |
collapse-transition
应该是父节点展开收起的动画效果,ul
则是包括一个父节点,里面的tree-node
是这个父节点的所有子节点,通过v-for
循环渲染出来,而其子节点的每一项跟父节点是一样的结构,所以tree-node
实际上就是node.vue
组件本身。
然后是script部分
主要props
使用git fetch和git rebase处理多人开发同一分支的问题
情景
有的时候会遇到这种问题,比如说有两个人,在同一个分支进行开发,假设是我自己,跟我的同伴;现在,我写了一部分代码,准备push到远程了,于是我执行git add、git commit,一切ok,没问题,然后git push,这下问题来了,git告诉我说我的push被rejected了,原来,我的同伴在我执行push之前,已经push了若干个commit到远程,因此我不能直接push,而是需要先把他的commits拉到我本地的repo才行。git的提示如下图。
按照git的提示做
好,git的提示已经很清楚了,rejected的原因通常是远程有了另外的push,询问了同伴,我们知道,就是ta先进行了push。那么,根据git的提示,我们可能想要先把远程的改变进行整合,再来push。那怎么整合呢,rejected那行告诉我们,要“fetch first”,而下面的e.g.说,我们可以用git pull来整合。也就是说,我们可以用git fetch,也可以用git pull来整合远程的改变到我们本地仓库中。
使用git pull
由于我本人对fetch不太了解,看着pull好像跟push是反义词比较亲切,那就用它吧。于是我执行了git pull,然后git push。emmmm,好像没什么问题,但是…在source tree里面看着分支的图谱怎么怪怪的?
图谱里面显示,我提交了两个commit,但实际上我改动的地方只进行了一次提交。我们看看多出来的commit的描述,写着“Merge branch ‘master’ of github.com:ChuChencheng/test”。
嗯?意思是这个提交做的改动是把远端的master分支进行合并。
git的基本使用流程
Handlebars学习之——块表达式
1 | {{#hello}} |
1 | Handlebars.registerHelper('hello', function(options){ |
1 | { |
1 | Handlebars.registerHelper('with', function(context, options) { |
1 | <div class="entry"> |
1 | { |
1 | <div class="comments"> |
1 | Handlebars.registerHelper('each', function(context, options) { |
1 | {{#list nav}} |
1 | { |
Handlebars学习之——HTML转义
1 | <div>{{title}}</div> |
1 | { |
1 | <div><Hello world></div> |
Hello world
` 如果不想进行html的转义,有两种方法: * {{{ * SafeString # {{{ 在模板中将两个花括号替换成三个花括号,即可避免html字符串被转义1 | <div>{{title}}</div> |
1 | { |
1 | <div><Hello world></div> |
1 | <p>Hello world</p> |
1 | {{sayhi}} |
1 | Handlebars.registerHelper('sayhi', function(){ |
Handlebars学习之——表达式
1 | <h1>{{title}}</h1> |
1 | <h1>{{article.title}}</h1> |
1 | 空格 ! " # % & ' ( ) * + , . / ; < = > @ [ \ ] ^ ` { | } ~ |
1 | {{#each articles.[10].[#comments]}} |
1 | Handlebars.registerHelper('link', function(str){ |
1 | Handlebars.registerHelper('link', function(str){ |
1 | {{{link 'hello'}}} |
1 | {{{hash 'hello' href='world'}}} |
1 | handlebars.registerHelper('hash', function(str, options){ |
1 | { href: 'world' } |
在Express中使用Handlebars模板引擎
Handlebars介绍
Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板。它采用”Logic-less template”(无逻辑模版)的思路,在加载时被预编译,而不是到了客户端执行到代码时再去编译, 这样可以保证模板加载和运行的速度。Handlebars兼容Mustache,你可以在Handlebars中导入Mustache模板。
在Express中使用
在Express中使用Handlebars,有一个hbs模块,对Handlebars进行了包装,可以代替Express自带的jade或ejs模板引擎
安装
1 | npm install hbs --save |
在app.js中设置view engine
1 | app.set('view engine', 'hbs'); |
如果要在不同扩展名的文件中使用Handlebars(如.html文件)
1 | app.set('view engine', 'html'); |
webpack打包生成的bundle.js文件过大的问题
JavaScript +new Array(017)
根据前序、中序构造二叉树,并输出后序
用js写的根据前序、中序构造二叉树,并输出后序的一段代码,不知道有没有问题。
先上树:
1 | A |
1 | var preOrder = 'ABDHECFG'; |
输出结果:
1 | { A: { r: 'C', l: 'B' }, |
var x=y=1;
页面两列布局高度填满
问题来源
昨天早上某面试提出的一个问题,脑子一热漏写了一个条件,心塞。
问题大概是写一个两列布局,左边固定,高度都是默认填满页面,右边内容高度超出浏览器窗口出现滚动条。
解决办法
今天仔细想了下,用浮动做的话,高度不好弄成填满的。折腾了一会儿,搞出两种方案(不使用js的)。
- 左侧:fixed,右侧:absolute,min-height:100%,width为calc(100% - [左侧的width]),同时margin-left也为左侧的width
- html的overflow-x设置为hidden,右侧就可以不用calc了,直接width: 100%,不过这样的话,右侧元素使用margin 0 auto居中就会向右边偏移,偏移的长度为左侧的width
测试代码:
1 | <!doctype html> |
jsfiddle: https://jsfiddle.net/g9j8mcf4/1/
Array.prototype.filter()的实现
来源
今年某前端笔试的一道题,大概就是实现一遍filter,包括一个可以改变上下文的要求,其实就是改变this啦,跟原生的filter一样的功能跟参数。
解析
filter的功能就是过滤,传入一个函数作为条件,返回true则将元素加入最终返回的数组中。
实现
1 | Array.prototype.filter = function(cb, context){ |
要点
个人觉得考察的是call的使用
JavaScript数组去重的几种方法
div直接包裹行内元素高度变高的问题
问题的发现
最近搞一个页面,用div直接包裹了两个button,本以为很寻常的东西,div的高度却被莫名其妙的撑开了。
1 | <style> |
想来想去怀疑是line-height的问题,于是查了一下,搜到zxx的一篇文章CSS深入理解vertical-align和line-height的基友关系
于是把div的line-height设置成0,button的vertical-align设置成top或bottom,问题解决。
1 | <style> |
不过vertical-align设置成middle时button距离上边会有1px的间隙。
1 | <style> |
研究中…
贴上测试代码
ES6学习笔记(一)
声明:本篇blog部分内容摘自阮一峰老师的ECMAScript 6入门,全部内容参考自上述链接
声明变量的方法
var | function | let | const | import | class | |
---|---|---|---|---|---|---|
作用域 | 函数或全局 | 顶层、函数和块级作用域 | 所在代码块 | 所在代码块 | - | - |
变量提升 | 存在 | 存在 | 不存在 | 不存在 | 存在 | 不存在 |
暂时性死区 | 无 | 无 | 有 | 有 | 无 | 有 |
重复声明 | 允许 | 允许 | 不允许 | 不允许 | - | 不允许 |
值可变 | 是 | 是 | 是 | 否 | - | 是 |
属于全局对象 | 是 | 是 | 否 | 否 | - | 否 |
作用域
可访问到变量的代码区块
1 | { |
变量提升
不存在变量提升的声明方式,变量一定要在声明后使用,否则会报错。
1 | console.log(foo); // 输出undefined |
暂时性死区
移动端Web适配的两种做法思路总结
看了几篇文章,理一下网易跟淘宝移动端适配的思路,主要是参考 从网易与淘宝的font-size思考前端设计稿与工作流
像素相关概念
物理像素(physical pixel)
一个物理像素是显示器(手机屏幕)上最小的物理显示单元,在操作系统的调度下,每一个设备像素都有自己的颜色值和亮度值。
其值也就是我们常说的分辨率
设备独立像素(density-independent pixel)
设备独立像素(也叫密度无关像素),可以认为是计算机坐标系统中得一个点,这个点代表一个可以由程序使用的虚拟像素(比如: css像素),然后由相关系统转换为物理像素。
简称dip,也可以称为CSS像素
设备像素比(device pixel ratio)
设备像素比(简称dpr)定义了物理像素和设备独立像素的对应关系,它的值可以按如下的公式的得到:
CentOS 7 防止端口自动关闭
tl;dr
1 | firewall-cmd --permanent --zone=public --add-port=2888/tcp |
永久配置firewalld开启端口。
之前的一些坑
之前的一篇文章CentOS 7部署Node.js+MongoDB:在VPS上从安装到Hello world中,讲到了CentOS开启端口用这个命令
1 | firewall-cmd --add-port=3000/tcp |
这样是没错,开启了端口,但是后面发现这个端口会莫名其妙的被关闭
Google一番后了解到这样添加端口是运行时配置(Runtime configuration),在重载或重启firewalld后,这个配置就失效了。
自动关闭原因
CentOS 7 采用了firewalld作为防火墙服务,在Red Hat官方文档的Security Guide中有介绍firewalld