阅读本文之前,先看下面这个webpack的配置文件,如果每一项你都懂,那本文能带给你的收获也许就比较有限,你可以快速浏览或直接跳过;如果你和十天前的我一样,对很多选项存在着疑惑,那花一段时间慢慢阅读本文,你的疑惑一定一个一个都会消失;如果你以前没怎么接触过Webpack,而你又你对webpack感兴趣,那么动手跟着本文中那个贯穿始终的例子写一次,写完以后你会发现你已明明白白的走进了Webpack的大门。
1 | // 一个常见的`webpack`配置文件 |
现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包。为了简化开发的复杂度,前端社区涌现出了很多好的实践方法
这些改进确实大大的提高了我们的开发效率,但是利用它们开发的文件往往需要进行额外的处理才能让浏览器识别,而手动处理又是非常繁琐的,这就为WebPack类的工具的出现提供了需求。
WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。
WebPack和Grunt以及Gulp相比有什么特性
其实Webpack和另外两个并没有太多的可比性,Gulp/Grunt是一种能够优化前端的开发流程的工具,而WebPack是一种模块化的解决方案,不过Webpack的优点使得Webpack在很多场景下可以替代Gulp/Grunt类的工具。
Grunt和Gulp的工作方式是:在一个配置文件中,指明对某些文件进行类似编译,组合,压缩等任务的具体步骤,工具之后可以自动替你完成这些任务。
Webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个(或多个)浏览器可识别的JavaScript文件。
如果实在要把二者进行比较,Webpack的处理速度更快更直接,能打包更多不同类型的文件。
初步了解了Webpack工作方式后,我们一步步的开始学习使用Webpack。
Webpack可以使用npm安装,新建一个空的练习文件夹(此处命名为webpack sample project),在终端中转到该文件夹后执行下述指令就可以完成安装。
1 | //全局安装 |
npm init
命令可以自动创建这个package.json文件1 | npm init |
输入这个命令后,终端会问你一系列诸如项目名称,项目描述,作者等信息,不过不用担心,如果你不准备在npm中发布你的模块,这些问题的答案都不重要,回车默认即可。
1 | // 安装Webpack |
回到之前的空文件夹,并在里面创建两个文件夹,app文件夹和public文件夹,app文件夹用来存放原始数据和我们将写的JavaScript模块,public文件夹用来存放之后供浏览器读取的文件(包括使用webpack打包生成的js文件以及一个index.html文件)。接下来我们再创建三个文件:
index.html
–放在public文件夹中;Greeter.js
– 放在app文件夹中;main.js
– 放在app文件夹中;
此时项目结构如下图所示:
我们在index.html
文件中写入最基础的html代码,它在这里目的在于引入打包后的js文件(这里我们先把之后打包后的js文件命名为bundle.js
,之后我们还会详细讲述)。
1 | <!-- index.html --> |
我们在Greeter.js
中定义一个返回包含问候信息的html元素的函数,并依据CommonJS规范导出这个函数为一个模块:
1 | // Greeter.js |
main.js
文件中我们写入下述代码,用以把Greeter
模块返回的节点插入页面。
1 | //main.js |
webpack可以在终端中使用,在基本的使用方法如下:
1 | # {extry file}出填写入口文件的路径,本文中就是上述main.js的路径, |
指定入口文件后,webpack将自动识别项目所依赖的其它文件,不过需要注意的是如果你的webpack不是全局安装的,那么当你在终端中使用此命令时,需要额外指定其在node_modules中的地址,继续上面的例子,在终端中输入如下命令
1 | # webpack非全局安装的情况 |
结果如下:
可以看出webpack
同时编译了main.js
和Greeter.js
,现在打开index.html
,可以看到如下结果
有没有很激动,已经成功的使用Webpack
打包了一个文件了。不过在终端中进行复杂的操作,其实是不太方便且容易出错的,接下来看看Webpack
的另一种更常见的使用方法。
Webpack
拥有很多其它的比较高级的功能(比如说本文后面会介绍的loaders
和plugins
),这些功能其实都可以通过命令行模式实现,但是正如前面提到的,这样不太方便且容易出错的,更好的办法是定义一个配置文件,这个配置文件其实也是一个简单的JavaScript模块,我们可以把所有的与打包相关的信息放在里面。
继续上面的例子来说明如何写这个配置文件,在当前练习文件夹的根目录下新建一个名为webpack.config.js
的文件,我们在其中写入如下所示的简单配置代码,目前的配置主要涉及到的内容是入口文件路径和打包后文件的存放路径。
1 | module.exports = { |
注:
__dirname
是node.js中的一个全局变量,它指向当前执行脚本所在的目录。
有了这个配置之后,再打包文件,只需在终端里运行webpack(非全局安装需使用node_modules/.bin/webpack)
命令就可以了,这条命令会自动引用webpack.config.js
文件中的配置选项,示例如下:
又学会了一种使用Webpack
的方法,这种方法不用管那烦人的命令行参数,有没有感觉很爽。如果我们可以连webpack(非全局安装需使用node_modules/.bin/webpack)
这条命令都可以不用,那种感觉会不会更爽~,继续看下文。
在命令行中输入命令需要代码类似于node_modules/.bin/webpack这样的路径其实是比较烦人的,不过值得庆幸的是npm可以引导任务执行,对npm进行配置后可以在命令行中使用简单的npm start命令来替代上面略微繁琐的命令。在package.json中对scripts对象进行相关设置即可,设置方法如下。
1 | { |
注:
package.json
中的script
会安装一定顺序寻找命令对应位置,本地的node_modules/.bin
路径就在这个寻找清单中,所以无论是全局还是局部安装的Webpack
,你都不需要写前面那指明详细的路径了
npm的start
命令是一个特殊的脚本名称,其特殊性表现在,在命令行中使用npm start
就可以执行其对于的命令,如果对应的此脚本名称不是start,想要在命令行中运行时,需要这样用npm run {script name}
如npm run build
,我们在命令行中输入npm start
试试,输出结果如下:
现在只需要使用npm start
就可以打包文件了,有没有觉得webpack也不过如此嘛,不过不要太小瞧webpack,要充分发挥其强大的功能我们需要修改配置文件的其它选项,一项项来看。
开发总是离不开调试,方便的调试能极大的提高开发效率,不过有时候通过打包后的文件,你是不容易找到出错了的地方,对应的你写的代码的位置的,Source Maps
就是来帮我们解决这个问题的。
通过简单的配置,webpack就可以在打包时为我们生成的source maps
,这为我们提供了一种对应编译文件和源文件的方法,使得编译后的代码可读性更高,也更容易调试。
在webpack的配置文件中配置source maps
,需要配置devtool
,它有以下四种不同的配置选项,各具优缺点,描述如下:
devtool选项 | 配置结果 |
---|---|
source-map | 在一个单独的文件中产生一个完整且功能完全的文件。这个文件具有最好的source map ,但是它会减慢打包速度; |
cheap-module-source-map | 在一个单独的文件中生成一个不带列映射的map ,不带列映射提高了打包速度,但是也使得浏览器开发者工具只能对应到具体的行,不能对应到具体的列(符号),会对调试造成不便; |
eval-source-map | 使用eval 打包源文件模块,在同一个文件中生成干净的完整的source map 。这个选项可以在不影响构建速度的前提下生成完整的sourcemap ,但是对打包后输出的JS文件的执行具有性能和安全的隐患。在开发阶段这是一个非常好的选项,在生产阶段则一定不要启用这个选项; |
cheap-module-eval-source-map | 这是在打包文件时最快的生成source map 的方法,生成的Source Map 会和打包后的JavaScript 文件同行显示,没有列映射,和eval-source-map 选项具有相似的缺点; |
正如上表所述,上述选项由上到下打包速度越来越快,不过同时也具有越来越多的负面作用,较快的打包速度的后果就是对打包后的文件的的执行有一定影响。
对小到中型的项目中,eval-source-map
是一个很好的选项,再次强调你只应该开发阶段使用它,我们继续对上文新建的webpack.config.js
,进行如下配置:
1 | module.exports = { |
cheap-module-eval-source-map
方法构建速度更快,但是不利于调试,推荐在大型项目考虑时间成本时使用。
想不想让你的浏览器监听你的代码的修改,并自动刷新显示修改后的结果,其实Webpack提供一个可选的本地开发服务器,这个本地服务器基于node.js构建,可以实现你想要的这些功能,不过它是一个单独的组件,在webpack中进行配置之前需要单独安装它作为项目依赖
1 | npm install --save-dev webpack-dev-server |
devserver作为webpack配置选项中的一项,以下是它的一些配置选项,更多配置可参考 这里
devserver的配置选项 | 功能描述 |
---|---|
contentBase | 默认webpack-dev-server会为根文件夹提供本地服务器,如果想为另外一个目录下的文件提供本地服务器,应该在这里设置其所在目录(本例设置到“public”目录) |
port | 设置默认监听端口,如果省略,默认为”8080” |
inline | 设置为true ,当源文件改变时会自动刷新页面 |
historyApiFallback | 在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向index.html |
把这些命令加到webpack的配置文件中,现在的配置文件webpack.config.js
如下所示
1 | module.exports = { |
在package.json
中的scripts
对象中添加如下命令,用以开启本地服务器:
1 | "scripts": { |
在终端中输入npm run server
即可在本地的8080
端口查看结果
Loaders
是webpack
提供的最激动人心的功能之一了。通过使用不同的loader
,webpack
有能力调用外部的脚本或工具,实现对不同格式的文件的处理,比如说分析转换scss为css,或者把下一代的JS文件(ES6,ES7)转换为现代浏览器兼容的JS文件,对React的开发而言,合适的Loaders可以把React的中用到的JSX文件转换为JS文件。
Loaders需要单独安装并且需要在webpack.config.js
中的modules
关键字下进行配置,
Loaders的配置包括以下几方面:
test:一个用以匹配loaders所处理文件的拓展名的正则表达式(必须)
loader:loader的名称(必须)
include/exclude:手动添加必须处理的文件(文件夹)或屏蔽不需要处理的文件(文件夹)(可选);
query:为loaders提供额外的设置选项(可选)
此时项目结构如下图所示:
我们在 index.html 文件中写入最基础的html代码,它在这里目的在于引入打包后的js文件(这里我们先把之后打包后的js文件命名为bundle.js
,之后我们还会详细讲述)。
1 | <!-- index.html --> |
我们在Greeter.js
中定义一个返回包含问候信息的html
元素的函数,并依据CommonJS
规范导出这个函数为一个模块:
1 | // Greeter.js |
main.js
文件中我们写入下述代码,用以把Greeter模块
返回的节点插入页面。
1 | //main.js |
使用:1
<canvas width="600" height="600">你的浏览器不支持canvas,请升级浏览器</canvas>
canvas坐标系,从最左上角0,0开始。x向右增大, y向下增大
上下文:工具包,是所有的绘制操作api的入口或者集合
1 | var canvas = document.querySelector('canvas'); |
beginPath() 开启一个新状态,基于之前的状态开启新的状态,新的状态会保持之前的设置
1 | ctx.beginPath(); |
rect(x,y,width,height) 绘制矩形路径
x, y是矩形左上角坐标, width和height都是以像素计(下同)
PS: rect方法只是规划了矩形的路径,并没有填充和描边
strokeRect(x,y,width,height) 绘制描边矩形
clearRect(x,y,width,height) 清除矩形区域,
PS:重新设置canvas的宽/高也能达到清空的效果
arc(x,y,radius,startAngle,endAngle,counterclockwise) 画圆弧/画圆
1 | 弧度和角度的转换公式: rad = deg*Math.PI/180; |
**绘图步骤(5步):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
281、获得画布
var canvas = document.getElementById( 'cavsElem' );
2、获得canvas上下文
var ctx = canvas.getContext( '2d' );
3、绘制路径
//设置绘制起点(移动画笔位置)
ctx.moveTo(100,100);
ctx.lineTo(200,100);
ctx.lineTo(100,200);
4、设置样式
//设置线宽
ctx.lineWidth = 4;
//设置描边样式(默认黑色)
ctx.strokeStyle = 'red';
//设置填充样式(默认黑色)
ctx.fillStyle = '#f60';
5、描边/填充
ctx.stroke();
ctx.fill();
PS:fill()方法会自动闭合路径
textAlign 设置或返回文本内容的当前对齐方式
right : 文本右对齐。
textBaseline 设置或返回在绘制文本时使用的当前文本基线
bottom : 文本基线是 em 方框的底端
1 | ctx.drawImage(img,x,y); |
1 | ctx.drawImage(img,x,y,width,height); |
1 | ctx.drawImage(img,sx,sy,swidth,sheight,x,y,width,height); |
示例:1
2
3
4
5
6ctx.fillStyle = '#fc0';
ctx.shadowColor = '#333';
ctx.shadowBlur = 50;
ctx.shadowOffsetX = 5;
ctx.shadowOffsetY = 5;
ctx.fillRect(100,100,100,100);
线性渐变是一个对象
语法:ctx.createLinearGradient(x0,y0,x1,y1);
参数:x0,y0起始坐标,x1,y1结束坐标
addColorStop(stop,color)
1 | //创建线性渐变的对象, |
1 | var rlg = ctx.createRadialGradient(300,300,10,300,300,200); |
ctx.createPattern(img,repeat) 方法在指定的方向内重复指定的元素了解
1 | var ctx=c.getContext("2d"); |
注意:画布变换仅仅是改变画布状态,不会影响之前画布上的内容
缩放
scale(scaleWidth,scaleHeight) 方法缩放当前绘图,参数为0~1的值
位移画布
translate(x,y) 方法重新映射画布上的 (0,0) 位置
旋转
rotate(angle) 方法旋转当前的绘图,注意参数是弧度
ctx.save() 保存当前环境的状态
可以把当前绘制环境context保存到缓存中。
ctx.restore() 返回之前保存过的路径状态和属性
获取最近通过save()方法缓存的context
PS:必须在服务器环境下使用
1 | var canvas = document.getElementById("canvas"); |
quadraticCurveTo(cpx,cpy,x,y)
bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)
提示:三次贝塞尔曲线需要三个点。前两个点是用于三次贝塞尔计算中的控制点,第三个点是曲线的结束点
很多女孩都说我是一个直男!!!
那么如何改变自己呢?
情操 + 情商 = 完美 ?
在我们的生活中,我们不但要让我们的物质世界获得满足,作为万物灵长的我们,还应该注重我们
内心世界的渴求,去获得我们内心世界的满足,去丰富我们的精神世界,让我们的内心世界不再是
一片荒芜的沙漠,去做一个有才情的人,那么,如何去
丰富我们的精神世界呢?如何去培养我们的情操呢?
想要培养我们的情操,首先要热爱读书,所谓书中自有黄金屋,书中自有颜如玉,崇高的道德操守
来源于一代又一代人的积累,只有从书中汲取养分,我们才能不断的成长,才能够真正地培养和提
高我们的情操。
想要培养自己的情操,就要不断反思自己,只有不断反思自己,才能够不断的提高自己,同时在反
思自我中,我们也在提高我们的情操,让我们更加的完善,做更好的自己。
所以情操,就是道德操守,要想培养情操,就应该从自身出发,推己及人,像关爱自己那样去关爱
他人,只有这样才能算是一个有情操的人,因此在生活中,我们应该更多地关爱别人。
有情操的人,他们有气度,有胸襟,不会因为他们的无意一句话而发怒,也不会因为别人无意的错
误而生气,他们懂的宽容别人。他们对自己严格要求,但他们对别人要求宽松,只有胸襟宽广的人
才能成为有情操的人。
有情操的人,他们不会整天夸夸其谈,不会整天吹嘘自己,也不会整天奉承别人,有情操的人懂的
谦虚,他们不会自满,他们愿意接受别人的批评,所以他们能都不断提高自身的素养和情操,所以
想要做有情操的人,一定要学会谦虚。
只有经过岁月洗礼的人,他们才能够不断丰富自己,不断提高自己,让自己变得更加优秀,同样也
只有这样才能培养自己的情操,培养情操是一个长期的过程,只有拥有丰富的生活阅历,慢慢地培
养,坚持不懈才能够做一个有情操的人。
人每当生气的时候,肾上腺素会大量分泌,情绪会不受控制。
和关系不好的陌生人生气时
和陌生人生气时会毫无顾忌的说一下难听的话甚至粗鄙之语,你讲的越多对方可能越生气,最
糟糕的是发生肢体冲突
和亲人或者爱人生气时
有时候你或者是在气头上说话没有分寸,一旦说出令人伤心的话得不偿失,毕竟是我们所亲所
爱,没有过不去的坎。
有时候一句话不同的人说出来的效果却完全不一样呢,为什么会这样呢?正所谓伸手不打笑脸人,
你有求于人或者冒犯别人时,笑着说话不仅可以掩饰自己的尴尬,还可以让对方不对你产生抵触,
但是,记住不要做舔狗。
吾之所爱,吾当勇敢去爱,不要表现的过于懦弱;但是不要满嘴跑火车,这样会适得其反。
古人云:‘言必信,行必果。’,说过话就要办到,切勿失信于人。
古人云:“人非圣贤,孰能无过,知错能改,善莫大焉。”,做人要大度,懂得宽容别人,这样别人
就会更加尊敬你,你的威望也会上升。
古人语:“多万卷书,行万里路。”,我们可以从书中学到很多知识不断充实自己,以史为鉴,换位
思考,时刻警醒自己。
每个人诞生下来都有自己生活的权利。或许有些人诞生在王宫贵族,名门望族,有些人诞生在十恶
不赦的杀人犯家里,不能以歧视的目光看待他人。获取你会谄媚首富之子,蔑视乞丐之子,殊不知
三十年河东,三十年河西,莫欺少年穷!有钱人终究有一天会家道中落,没钱的人会终有一天有钱
又有优势。你嘲笑别人,殊不知虎落平阳被犬欺!
古人云:“君子坦荡荡,小人常戚戚。”,在背后嚼舌根是小人行径,你妄论的人在得知你的言语之
后,只会使你们的关系更加糟糕。
古人云:“宰相肚里能撑船”,“海纳百川,有容乃大”,宽阔的胸怀和胸襟是一个高情操的人所必需
的优秀品质。
古人云:“人无完人,金无赤足。”,或许你自己在某方面很优秀,但是别人不如你,你不能够按照
自己的标准要求别人。或许别人某些方面比你优秀呢,换位思考一下呢?是不是有一些强人所难?
自己都做不到的不要强加与别人
重新整理了一下hexo命令
1 | npm install hexo -g #安装 |
1 | hexo n "我的博客" == hexo new "我的博客" #新建文章 |
1 | hexo server #Hexo 会监视文件变动并自动更新,您无须重启服务器。 |
1 | hexo clean #清除缓存 网页正常情况下可以忽略此条命令 |
1 | hexo generate #使用 Hexo 生成静态文件快速而且简单 |
两个命令的作用是相同的
1 | hexo generate --deploy |
1 | hexo deploy -g |
1 | hexo publish [layout] <title> |
1 | hexo new "postName" #新建文章 |
1 | hexo new [layout] <title> |
变量 | 描述 |
---|---|
layout | 布局 |
title | 标题 |
date | 文件建立日期 |
1 | title: 使用Hexo搭建个人博客 |
hexo new photo “My Gallery”
变量 | 描述 |
---|---|
layout | 布局 |
title | 标题 |
date | 文件建立日期 |
1 | 以上是文章摘要 <!--more--> 以下是余下全文 |
开始学习Java了
Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习
和使用。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动的废料收集,使得程序员不必为内存管理而担忧。
Java语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。
Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。
Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。
如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。
在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
]]>想写博客记录自己学习的点点滴滴吗?点开这里 =>传送门
这是一篇讲解如何正确使用 Markdown 的排版示例,学会这个很有必要,能让你的文章有更佳清晰的排版。
引用文本:Markdown is a text formatting syntax inspired
这段内容展示了在内容里面一些小的格式,比如:
**加粗**
*倾斜*
~~删除线~~
Code 标记
- Code 标记
[超级链接](https://github.com)
[username@gmail.com](mailto:username@gmail.com)
支持大部分标准的表情符号,可使用输入法直接输入
:smile: :laughing: :dizzy_face: :sob: :cold_sweat: :sweat_smile: :cry: :triumph: :heart_eyes: :relaxed:
:+1: :-1: :100: :clap: :bell: :gift: :question: :bomb: :heart: :coffee: :cyclone: :bow: :kiss: :pray: :anger:
效果如图所示:
你可以选择使用 H1 至 H6,使用 ##(N) 打头。
NOTE: 别忘了 # 后面需要有空格!
1 | ![alt 文本](https://lee981265.github.io/img/Leebolg.png) |
效果如图所示:
支持复制粘贴直接上传。
1 | *emphasize* **strong** |
如果在 1
2
3
4
5
6
7
8
9
10
11
##### 演示 Go 代码高亮
```Go
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
1 | public class HelloWorld { |
效果如图所示:
Tip: 语言名称支持下面这些:
ruby
,python
,js
,html
,erb
,css
,coffee
,bash
,json
,yml
,xml
…
如果需要展示数据什么的,可以选择使用表格。
header 1 | header 3 |
---|---|
cell 1 | cell 2 |
cell 3 | cell 4 |
cell 5 | cell 6 |
留空白的换行,将会被自动转换成一个段落,会有一定的段落间距,便于阅读。
请注意后面 Markdown 源代码的换行留空情况。
$$a^2 + b^2 = \color{red}c^2$$
效果如图所示:
command line
doc
1 | st=>start: Start |
效果如图所示:
1 | 张三->李四: 嘿,小四儿, 写博客了没? |
效果如图所示:
弹指间2018悄然溜走,我也在昨天渡过22岁生日。新的一年祝大家好运常来,在2019我决定开始学习python和java,也会在这里和大家分享一下我踩过的坑和笔记。2019加油! :smirk_cat:)
]]>现有如下场景,点击父组件的li元素跳转到子组件中,并携带参数,便于子组件获取数据。
父组件中:
1 | <li v-for="article in articles" @click="getDescribe(article.id)"> |
methods:
1 | getDescribe(id) { |
case1需要对应路由配置如下:
1 | { |
很显然,需要在path中添加/:id来对应 $router.push 中path携带的参数。在子组件中可以使用来获取传递的参数值。1
$route.params.id
父组件中:通过路由属性中的name来确定匹配的路由,通过params来传递参数。
1 | this.$router.push({ |
对应路由配置: 注意这里不能使用:/id来传递参数了,因为父组件中,已经使用params来携带参数了。
1 | { |
子组件中: 这样来获取参数
1 | $route.params.id |
父组件:使用path来匹配路由,然后通过query来传递参数
这种情况下 query传递的参数会显示在url后面?id=?
1 | this.$router.push({ |
对应路由配置:
1 | { |
对应子组件: 这样来获取参数
1 | $route.query.id |
1 | CREATE DATABASE database-name |
1 | drop database dbname |
1 | USE master |
开始 备份
1 | BACKUP DATABASE pubs TO testBack |
1 | create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) |
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
1 | drop table tabname |
1 | Alter table tabname add column col type |
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
说明:几个简单的基本的sql语句
选择:select from table1 where 范围*
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select from table1 where field1 like ’%value1%’* —like的语法很精妙,查资料!
排序:select from table1 order by field1,field2 [desc]*
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
1 | select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c |
B:right (outer) join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full/cross (outer) join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
12、分组:Group by:
一张表,一旦分组 完成后,查询后只能得到组相关的信息。
组相关的信息:(统计信息) count,sum,max,min,avg 分组的标准)
在SQLServer中分组时:不能以 text,ntext,image 类型的字段作为分组依据
在selecte统计函数中的字段,不能和普通的字段放在一起;
13、对数据库进行操作:
分离数据库: sp_detach_db;
附加数据库:sp_attach_db 后接表明,附加需要完整的路径名
14.如何修改数据库的名称:
1 | sp_renamedb 'old_name', 'new_name' |
法一:select into b from a where 1<>1*(仅用于SQlServer)
法二:select top 0 into b from a*
1 | insert into b(a, b, c) select d,e,f from b; |
1 | insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件 |
例子: ..from b in ‘“&Server.MapPath(“.”)&”\data.mdb” &”‘ where..
1 | select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) |
1 | select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b |
1 | select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c |
1 | select * from (SELECT a,b,c FROM a) T where t.a > 1; |
1 | select * from table1 where time between time1 and time2 |
1 | select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) |
1 | delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) |
1 | select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... |
说明:日程安排提前五分钟提醒
SQL:
1 | select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 |
说明:一条sql 语句搞定数据库分页
1 | select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 |
具体实现:
关于数据库分页:
1 | declare @start int,@end int |
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)
1 | select top 10 * form table1 where 范围 |
说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
1 | select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) |
说明:包括所有在 TableA中但不在 TableB和TableC中的行并消除所有重复行而派生出一个结果表
1 | (select a from tableA ) except (select a from tableB) except (select a from tableC) |
说明:随机取出10条数据
1 | select top 10 * from tablename order by newid() |
1 | select newid() |
说明:删除重复记录
1.
1 | delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) |
2.
1 | select distinct * into temp from tablename |
评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
1 | alter table tablename |
添加一个自增列
1
2
3
4 add column_b int identity(1,1)
delete from tablename where column_b not in(
select max(column_b) from tablename group by column1,column2,...)
alter table tablename drop column column_b
说明:列出数据库里所有的表名
1 | select name from sysobjects where type='U' // U代表用户 |
1 | select name from syscolumns where id=object_id('TableName') |
1 | select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type |
显示结果:1
2
3
4
5
6
7type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
1 | TRUNCATE TABLE table1 |
1 | select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc |
“where 1=1” 是表示选择全部 “where 1=2”全部不选,
如:1
2
3
4
5
6
7
8if @strWhere !=''
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
我们可以直接写成
错误!未找到目录项。
1 | set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 2、收缩数据库 |
重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
dbcc shrinkdatabase(dbname)
exec sp_change_users_login ‘update_one’,’newname’,’oldname’
go
1 | RESTORE VERIFYONLY from disk='E:\dvbbs.bak' |
1 | ALTER DATABASE [dvbbs] SET SINGLE_USER |
1 | SET NOCOUNT ON |
1 | exec sp_changeobjectowner 'tablename','dbo' |
1 | CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch |
1 | declare @i int |
案例:
有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:
1 |
|
1 | Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多 |
1 | select encrypt('原始密码') |
1 | declare @list varchar(1000), |
4.查看硬盘分区:
1 | EXEC master..xp_fixeddrives |
1 | if (select checksum_agg(binary_checksum(*)) from A) |
1 | DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses |
开头到N条记录
1 | Select Top N * From 表 |
N到M条记录(要有主索引ID)
1 | Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc |
N到结尾记录
1 | Select Top N * From 表 Order by ID Desc |
案例
例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录。
1 | select top 10 recid from A where recid not in(select top 30 recid from A) |
分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。
select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。
解决方案
用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题
在那个子查询中也加条件:select top 30 recid from A where recid>-1
例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。
1 | set @s = 'select top 1 * from T where pid not in (select top ' + str(@count-1) + ' pid from T)' |
获取当前数据库中的所有用户表
1 | select Name from sysobjects where xtype='u' and status>=0 |
获取某一个表的所有字段
1 | select name from syscolumns where id=object_id('表名') |
查看与某一个表相关的视图、存储过程、函数
1 | select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%' |
1 | select name as 存储过程名称 from sysobjects where xtype='P' |
1 | select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa') |
1 | select column_name,data_type from information_schema.columns |
不同服务器数据库之间的数据操作
1 | exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' |
1 | select * from ITSV.数据库名.dbo.表名 |
1 | select * into 表 from ITSV.数据库名.dbo.表名 |
1 | exec sp_dropserver 'ITSV ', 'droplogins ' |
连接远程/局域网数据(openrowset/openquery/opendatasource)
查询示例
select * from openrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)
生成本地表
select * into 表 from openrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)
2. 把本地表导入远程表 1
2
3
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
select *from 本地表
3. 更新本地表 1
2
3
4
5
6
7
update b
set b.列A=a.列A
from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1
4. openquery用法需要创建一个连接 >首先创建一个连接创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 5. 查询 1
2
3
select *
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
6. 把本地表导入远程表 1
2
3
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
select * from 本地表
7. 更新本地表 1
2
3
4
5
6
7
update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a
inner join 本地表 b on a.列A=b.列A
8. opendatasource/openrowset 1
2
3
SELECT *
FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta
9. 把本地表导入远程表1
2
3
4
5
6
7
insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
select * from 本地表
SQL Server基本函数
SQL Server基本函数
字符串函数 长度与分析用
datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格
substring(expression,start,length) 取子串,字符串的下标是从“1”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度
right(char_expr,int_expr) 返回字符串右边第int_expr个字符,还用left于之相反
isnull( check_expression , replacement_value )如果check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操作类
Sp_addtype自定義數據類型
例如. EXEC sp_addtype birthday, datetime, ‘NULL’
set nocount {on|off}
使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。
常识
在SQL查询中:from后最多可以跟多少张表或视图:256在SQL语句中出现 Order by,查询时,先排序,后取在SQL中,一个字段的最大容量是8000,而对于nvarchar(4000),由于nvarchar是Unicode码。
1 | 一、 预备工作 |
–更新修改过的数据
1 | update b set name=i.name,telphone=i.telphone |
–插入新增的数据insert srv2.库名.dbo.author(id,name,telphone)
1 | select id,name,telphone from author i |
–删除已经删除的数据(如果需要的话)
1 | delete b |
`
前端萌新学习Python之旅,跟随廖雪峰大神的步伐,一天一天的进步!
python | git bush开启python |
---|---|
winpty python | - |
python -i | - |
python | bash.bashrc追加 alias python=’winpty python ‘ |
1 | name = input('please your name:') |
1 | #缩进4个空格 |
类型 | 表现形式 | 注意 |
---|---|---|
整数 | 100 | |
浮点数 | 3,14 | |
字符串 | ‘abc’,”xyz” | I’m ok |
注意:对于字符串中含有特殊字符的这一点和正则有点像这时候我们要用到转译字符 ‘\‘或者使用双引号在外=>”I’m OK”
1 | 'I\'m \"OK\"!' |
转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\表示的字符就是\
1 | print('I\'m ok.') |
如果字符串里面有很多字符都需要转义,就需要加很多\,为了简化,Python还允许用r’’表示’’内部的字符串默认不转义
1 | print(r'\\有一个姑娘,\她有些任性\\') |
如果字符串内部有很多换行,用\n写在一行里不好阅读,为了简化,Python允许用’’’…’’’的格式表示多行内容
1 | print(''' |
符号 | 作用 | 注意 |
---|---|---|
\ | 转义特殊字符 | 字符串末尾至少加2个 |
\n | 表示换行 | 在r’’或r’’’ ‘’’内无效 |
\t | 表示制表符 | 在r’’或r’’’ ‘’’内无效 |
r’’ | 不转义引号里面的内容 | |
‘’’ ‘’’ | 多次换行 | 书写时多敲几次换行 |
注意:在python环境中布尔值开头必须大写
运算符有 and,or,not
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 #and
>>>True and True
True
>>>Fslse and False
False
>>>True and False
False
#or
>>>True or True
True
>>>False or False
False
>>>True or False
True
## not
>>>not True
False
>>>not False
True
>>>not 1<8
True
#条件语句
if a>=100
print('大于等于')
else:
print('小于')
空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值
变量规则:变量名必须是大小写英文、数字和_的组合,且不能用数字开头,变量的声明不用像js那样加var ,let,const
1 | a = 100 |
变量是可以赋值的,且可以多次赋值,后面的覆盖前面的赋值
1 | a = 10086 |
这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下(// 表示注释):
1 | int a = 123; // a是整数类型变量 |
所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量
1 | PI = 3.14159265359 |
运算符 / , // , %
1 | >>>10/3 |
ECMAScript (or ES) is a trademarked scripting-language specification standardized by Ecma International in ECMA-262 and ISO/IEC 16262. It was created to standardize JavaScript, so as to foster multiple independent implementations. JavaScript has remained the best-known implementation of ECMAScript since the standard was first published, with other well-known implementations including JScript and ActionScript. ECMAScript is commonly used for client-side scripting on the World Wide Web, and it is increasingly being used for writing server applications and services using Node.js.
判断是否为数组
区别就是一个从前往后找,一个从后往前找
indexOf/lastIndexOf(keyword [,startIndex])
方法返回keyword所在数组中的索引值,如果数组不存在keyword,则返回-1
forEach(fn)
遍历方法,for循环没有太大差别,比for循环方便
map(fn)
返回每次函数调用的结果组成的数组
filter(fn)
得到执行fn后返回true时对应的数组元素,利用这个方法可对数组元素进行过滤筛选
every(fn)
如果该函数对每一项都返回 true,则返回true
some(fn)
如果该函数对任何一项返回 true,则返回true
以上方法都对数组中的每一项运行给定函数fn,,函数中有三个形参分别为
- item:数组中的每一项,
- index:遍历过程中对应的索引值,
- array:对数组的引用
这两个方法都会迭代数组中的所有项,然后生成一个最终返回值。
reduceRight(fn,initVal)
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,但实际上后两者是ECMA-262标准的实现和扩展。
ES6允许我们对数组和对象中提取值,对变量进行赋值,这被叫做“解构”
1 | 1. var [a,b,c] = [1,2,3] //a=1,b=2,c=3 |
1 | var {a:test} ={a:'html',b:'css'} //test=>html |
1 | var [a]=[],[b]=1,[c]='jiegou',[d]=false //a,b,c,d都得到undefined |
1 | var [a=true]=[] |
var {a=10} = {}> 解构同样适用于let和const> PS:解构只能用于数组和对象,如果解构不成功,变量会返回undefined,但如果对undefined和null解构则会报错
1 | var [x,y] = [y,x]; |
1 | function example(){ |
函数的参数定义方式, 不用再考虑参数的顺序1
function test({x,y,z}){}
//传参1
2
3
4test({x:10,y:20,z:30})
//参数可以设置默认值
fuction test({x=10,y=20,z}){}
`
判断是否包含某个字符,返回布尔值1
2
3
4
5
6
7
8
9```
- startsWith/endsWith
是否以某一字符开头/结尾
```js
let str='google';
str.startsWith('g'); //true
str.endsWith('le'); //true
`
得到字符串重复n次后的结果,n可以为小数,但不能为负数1
'laoxie'.repeat(2);//laoxielaoxie
你可以通过一种更加美观、更加方便的方式向字符串中插入变量
格式:${变量|函数},
1 | 你好,我的名字叫${username},接下来是我的自我介绍:${introduce()} |
模板字符串中所有的空格、新行、缩进,都会原样输出在生成的字符串中。
1 | var arr = [10,12,18,30] |
合并对象1
Object.assign({a:1},{b:2},{b:4,c:3}); //{a:1,b:4,c:3}
ES6允许在对象之中直接写变量,如
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 //@属性简写
var myName = 'laoxie';
var obj = {myName};//属性名为变量名, 属性值为变量的值
//等效于
var obj = {myName:'laoxie'}
//使用变量值作为属性名
var obj = {
[myName]:18
}
//等效于
var obj = {laoxie:18}
//@方法简写
var obj = {
coding(){
}
}
//等效于
var obj = {
coding:function(){
}
}
格式:标识符=>表达式省略了function、return关键字和大括号。
1 | //传统写法 |
1 | //传统函数写法 |
1 | // ES5 |
ES6中的规则是,紧随箭头的{被解析为块的开始,而不是对象的开始
1
2
3
4
5
6
7
8
9 // ES5
$("#confetti-btn").click(function (event) {
playTrumpet(); fireConfettiCannon();
});
// ES6
$("#confetti-btn").click(event => {
playTrumpet();
fireConfettiCannon();
});
1 | //传统写法 |
默认参数。
1 | var func1 = (x = 1, y = 2) => x + y; |
剩余参数
1 | var func2 = (x, ...args) => { console.log(args) }; |
箭头函数没有它自己的this值,箭头函数内的this值继承自外围作用域
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值,一旦创建后就不可更改。
1 | // 没有参数的情况 |
Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了标识和区分,对调式非常有用
1 | // 有参数的情况 |
Symbol值不能与其他类型的值进行运算
给对象创建私有属性
1 | var mySymbol = Symbol(); |
Symbol.for()
有时我们希望重新使用同一个Symbol值,Symbol.for方法可以做到这一点,首先在全局中搜索已登记的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值> 直接用Symbol()方法创建的Symbol值不会被登记
1 | let one = Symbol("laoxie"); |
Symbol.keyFor()
获取被登记的Symbol值> 直接使用Symbo()创建的Symbol值的键不会被登记,所以也就获取不到
Map集合,即映射
1 | let map = new Map(); |
1 | map.get("s2"); //王五 |
1 | for(let [key,value] of map){ |
Set集合,类似于数组,但是成员的值都是唯一的,没有重复的值。
1 | let imgs = new Set(); |
Set集合是默认去重复的,但前提是两个添加的元素严格相等,所以5和”5”不相等,两个new出来的字符串不相等
SET集合没有提供下标方式的访问,因此只能使用for…of来遍历。由于Set集合本质上还是一个map,因此会有以下几种遍历方法
1 | var imgs = new Set(['a','b','c']); //根据KEY遍历 |
随着项目需求,我们有时候会用到vue+echarts;有时候ecahrts图表需要在适当的时候进行显示隐藏,对于众多vue使用者来说显示隐藏==>v-show;我也不例外。使用v-show的确可以做到显示隐藏但是echarts图表的宽高会不受控制。
在此之前我们先来理解一下vue的显示隐藏:
1 | 这两个都可以进行显示隐藏,不过v-show相当于加了属性=>display:none;而v-if是不渲染改节点,这两者有着质的区别 |
1 | 对于单纯的显示隐藏使用v-if,切在的当前页面只渲染一次;这种情况使用v-if即可。当然还有给echarts图表添加属性 grid:{containLabel:true} |
对于需要反复重新渲染的echarts图表如果使用v-if的话,初始化时是可行的,但是切换重新渲染会抛出错误 attributes is not defined。因此我们不能使用v-if;
思路:
代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<div id="charts" style="display:none;">
<div class="indent">
<div class="indent_icon"></div>
<span class="indent_ratio">订单占比</span>
<div class="indent_kong"></div>
</div>
<div id="myChart" ></div>
<div class="indent_two">
<div class="indent_icon"></div>
<span class="indent_ratio">订单趋势</span>
<span class="rise" v-show="isactive!=1">{{huanbi}}</span>
<span class="increase" v-show="isactive!=1">环比增长</span>
<div class="indent_kong"></div>
</div>
<div id="myChart_two" :style="{width: '100%', height: '300px','margin-bottom':'1rem',}"></div>
</div>
重新渲染: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
39getEcharts:function(){
//echarts图表数据
var USaferss={
Action:"/Itil/face/V1801090100.G.JSON",
Result:{},
Values:{
// select:'time',
//staDate:'2017-03-06'
find:'time2',
type:this.isactive,
f_itil_1801090105_E01:this.companycode,
},
Upload:false,
Finish:(v)=>{
var Sv=v.data.OutData;
this.times = Sv;
this.huanbi = this.times.seq;
this.all = this.times.all;
console.log( this.huanbi);
console.log(this.times.appli);
console.log(Sv);
var charts = document.getElementById('charts');
if( this.all==0){
charts.style.display="none";
}else{
charts.style.display="block";
this.drawLine(this.times);
this.drawLinetwo(this.times);
}
},
Errors:(v)=>{}
};
this.PstData(USaferss,"G");
},
这样我们就可以实时切换图表了,无数据则隐藏,有数据就显示;默认一定要是隐藏状态o,希望对你有所帮助!
]]>最近写了很多动态添加类名或者tab标签切换的表达式,遇到过很多的坑,下面为大家分享一下我遇到的几种。
v-show后面可以在引号里面直接写true or false1
2
3<span class="rise" v-show="isactive!=1">{{huanbi}}</span>
<span class="rise" v-show="false">{{huanbi}}</span>
<span class="rise" v-show="true">{{huanbi}}</span>
1 | wx:if在引号里面必须有{{}} |
1 | <view wx:if="{{false}}" class="Theuser" style="height:85rpx;"> |
注:在使用wx:if时有时候会出现闪现问题,其一先清除默认值,其二要使用全等
1 | <div class="list" v-for="item in list" :key="item.id" :price="[item.f_itil_1801090109_006]" :name="[item.f_itil_1801090109_P01]"> |
如果需要使用索引1
2
3
4
5
6
7<li v-for="item in items">
{{parentMessage}} - {{$index}} - {{item.message}}
</li>
<div v-for="(index, item) in items">
{{index}} {{item.message}}
</div>
1 | wx:for="{{Alldata}}" wx:key="" |
1 | <div class="btn_date" ="choose"> |
1 | <view class="header" bindtap="choosetype"> |
1 | <view class="header" bindtap="choosetype"> |
1 | <view class="header" bindtap="choosetype"> |
注:小程序里面不能写2个class会报错,vue可以写
1 | <image src="{{ischoose=='1'?[chec;]:[uncheck]}}"></image> |
最近在做一个混合开发的项目,需求里面要求使用拖拽,然而这不是jq的拖拽;我向很多大佬求助过,有一位大佬建议我去使用hammer.js;由于时间紧迫我不得不放弃这一方法。还有大佬向我推荐vue封装的插件,然而我试了一下有局限性,position:absolute==>我想要是的fixed;还有通过指令的方法等等我都试了不好用;求人不如求己下面我将为大家介绍一种简单的方法(适用于vue)
1 | <template> |
touchstart当在屏幕上按下手指时触发
touchmove 当在屏幕上移动手指时触发
touchend 当在屏幕上抬起手指时触发
mousedown mousemove mouseup对应的是PC端的事件
touchcancel 当一些更高级别的事件发生的时候(如电话接入或者弹出信息)会取消当前的touch操作,即触发touchcancel。一般 会在touchcancel时暂停游戏、存档等操作。
1 | <div class="detail"> |
1 | down(){ |
1 | .detail { |
当我们写一个页面有键盘弹起且底部按钮fixed时你会发现点击输入框是底部按钮会弹起,网上很多方法但是只适用于对应的场景,今天我们来学习一种Vue 页面的键盘弹起。
解决办法:
换个思路,检测浏览器的resize事件,当高度过小时就可以判定为出现这种情况,这时把定位改成ab或者直接隐藏掉之类的。
1 | <mt-button v-show="isOriginHei" class="add-client" type="default" size="large" @click.native="submitClientInfo"><icon-svg iconClass="baocun" class="icon-xinzeng"></icon-svg>提交</mt-button> |
1 | data: { |
1 | mounted () { |
1 | watch: { |
1 | watch: { |
1 | let listenAction; |
1 | import Foot from 'libs/foot' |
1 | <m-flex class="pay-group" v-foot> |
随着技术的发展着2年微信小程序犹如一匹黑马迅速崛起,新的技术出现,我们为了不与时代脱轨学习小程序很有必要!
就不多说了,没有内测码去下载个破解版吧,我用了一下,学习完全够了!IDE破解版+安装教程
JavaScrip还是要看看的,推荐教程 廖雪峰大神的博客
HTML+CSS 大概知道是干啥的就行
在根目录下用app来命名的这四中类型的文件,就是程序入口文件
app.json
必须要有这个文件,如果没有这个文件,IDE会报错,因为微信框架把这个作为配置文件入口,
你只需创建这个文件,里面写个大括号就行
以后我们会在这里对整个小程序的全局配置。记录了页面组成,配置小程序的窗口 背景色,配置导航条样式,配置默认标题。
app.js
必须要有这个文件,没有也是会报错!但是这个文件创建一下就行 什么都不需要写
以后我们可以在这个文件中监听并处理小程序的生命周期函数、声明全局变量。
app.wxss
这个文件不是必须的。因为它只是个全局CSS样式文件
app.wxml
这个也不是必须的,而且这个并不是指主界面哦~因为小程序的主页面是靠在JSON文件中配置来决定的
有了这两个文件你运行程序,IDE就不会报错了,也意味着这是最简单的微信小程序
app.js文件管理整个程序的生命周期,所以在里面添加如下代码:(输入App IDE会有提示)
1 | App({ |
具体API解释如下:
json文件负责配置ActionBar颜色,我们只需要在里面添加如下代码即可,下图有参数说明!
1 | { |
现在看ActionBar是不是像那么回事了!好接下来我们继续写我们第一个界面
美化页面我没用到了wxml和wxssw文件
为了程序代码结构简洁
我们需要在根目录下创建一个新文件夹 名字随意, 我们这里叫pages
然后在pages文件夹里面再创建新文件夹 名字随意, 这里我没叫index
然后我们创建index.wxml文件然后在里面写入以下代码:
1 | <view> |
然后创建index.wxss文件然后在里面写下以下代码
1 | .window{ |
然后我们创建 index.js
在文件中输入如下代码(输入Page IDE会有提示)
1 | Page({ |
函数解释如下:
Json文件负责配置页面路径所以我们在里面加入如下代码 其中index的含义 其实就是指index.js文件这里需要说明一点 pages 里面的路径其实是指向js文件的 如果一个目录下没有该名称的js文件是会报错的!1
"pages":[ "pages/index/index"],
完成了!我们来运行程序!
为了学习事件绑定,以及如何将数据在页面上更新我们来做个超级Hello World,就是我点击文字,能让它变色!
我们打开index.wxml 将里面代码改成这样1
<view> <text catchtap="click" class="window">Hello</text></view>
其实也就是加了:1
catchtap="click"//bindtap='click'
这两个属性是什么意思呢 别着急 我会一一解释
上图展示了事件的一些的属性名称,这里需要注意红框标注起来的内容,区分出冒泡事件和非冒泡事件,其实冒泡事件就是需要往上面一层容器传递这个事件
看了这图 我们再来看 catchtap=”click” 的含义catch 代表非冒泡事件tap 代表点击事件所以连在一起就是非冒泡点击事件那后面那个click是啥click 其实只是个变量名字我们在index.js需要用这个名字绑定接收事件的函数我们打开index.js然后添加如下函数1
click:function(){ console.log("点击了文字"); }
,添加完后代码长这样 红框中就是 添加的这个代码
所以其实点击事件的回调函数 就是 catchtap=”click” 中的 click 后面加上 :function() 构成的现在我们来运行程序试试 然后点击文字
看是不是调用了click:function 并打印 点击了文字
好接下来我们写点击一下变色的逻辑那如何让一个文字变色呢,当然是css所以我们需要再index.wxss 中添加一个样式
1 | .window-red{ color:#D23933;} |
然后我们进入index.js文件你会发现代码里面有个 data:{} 它不是page生命周期函数其实他是个变量的数组,这个里面申请的变量都可以在 wxml中使用1
2
3data:{
color:"window"
}
color的值就是index.wxss中的样式名称然后进入index.wxml中,将class中的值改成 1
2
3<view>
<text catchtap='click' class="{{color}}">Hello</text>
</view>
其实意思就是 将js文件中变量 color的值在这里使用也就是值等于 window然后我们再回到index.js文件在最上面申请一个变量控制点击然后在click:function() 函数中添加如下代码:1
2
3
4
5
6
7
8
9
10click:function(){
console.log("点击了文字");
if(flag){
color = "window-red"; flag = false;
}
else{
color = "window"; flag = true;
}
this.setData({ color });
},
完后的代码如图:
其实就是在点击是后 更换color变量的值 而更换的这个值其实就是样式的名称
这里有个问题 我们更换完值 但是在wxml中不会立即生效所以我们需要调用this.setData()方法将值同步给wxml 让它立即生效
好了我们运行程序 点击Hello 看看是不是点一下 变一下颜色!
最后再补充一点 index目录下也是可以配置 json文件的也就是每个页面都可以配置自己独特的actionbar颜色等等这里的配置会覆盖 app.json文件的配置
]]>Echarts:
1 | backgroundColor: ‘rgba(0,0,0,0)’, |
1 | color: ['#ff7f50','#87cefa','#da70d6','#32cd32','#6495ed', |
1 | title: { |
1 | legend: { |
1 | dataRange: { |
1 | toolbox: { |
1 | tooltip: { |
1 | dataZoom: { |
1 | grid: { |
1 | categoryAxis: { |
1 | valueAxis: { |
1 | bar: { |
1 | line: { |
1 | k: { |
1 | scatter: { |
1 | radar : { |
1 | pie: { |
1 | map: { |
1 | force : { |
1 | chord : { |
1 | island: { |
1 | markLine : { |
1 | symbolList : [ |
尽请期待!
]]>敬请期待!
]]>PHP(外文名:PHP: Hypertext Preprocessor):超文本预处理器。是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。以前是没有前端这个职位的,随着计算机语言的发展Ajax的出现,有了前后端分离这一概念。
]]>