前端开发
2019-01-04 10:36:28 5 举报
AI智能生成
对所学前端知识的简单总结,包括HTML、CSS、JavaScript以及常用的框架技术
作者其他创作
大纲/内容
HTML
基础标签
html、body、div、p、span、a、ul等
表单元素
form、input、select、radio、checkbox、textarea等
HTML5
语义化标签
header、nav、main、aside、section、article、footer等
新增input类型
color、range(滑块控件)、email、url、日期时间控件(date, month, week, time, datetime, datetime-local)
新增属性<br>
placeholder
文字占位提示,通常用于表单输入框
required
必填项,通常用于表单输入框
pattern
规定用于验证 input 域的正则表达式
form
指定表单input域所属表单的id
<h4>scoped属性:CSS 的组件作用域,如<style scoped></h4>
......
Canvas
画布,通过JavaScript来实现绘制图像
SVG
Scalable Vector Graphics (可伸缩矢量图形) 的缩写,是W3C的一个标准
采用XML格式定义图形
SVG 图像可伸缩,在放大或改变尺寸的情况下其图形质量不会失真
web存储
比起cookie可以保存较多的数据。以键/值对的形式,通常以字符串存储
分类
sessionStorage
会话级别的数据存储(只在当前浏览器窗口有效,关闭后数据就会被清除)
localStorage
只要不清除,数据就会永久存在<br>
操作的API
存取数据<br>
sessionStorage.setItem(key,value)
sessionStorage.getItem(key)
也可以直接sessionStorage.key的形式存取数据<br>
删除数据<br>
删除单条数据:sessionStorage.removeItem(key)
删除所有数据:sessionStorage.clear()
获取某个索引的key
sessionStorage.key(index)
WebSocket协议
基于TCP的全双工通信协议
首先借用HTTP协议建立连接,然后升级为WebSocket协议进行通信
适用于聊天室等实时通信场景
用法
Web Worker
为了弥补JavaScript的单线程问题
Web Worker程序由Javascript主线程创建,但独立于主线程、在后台执行,因此可以提高程序执行效率
用法
创建Web Worker
var worker = new Worker('worker.js');
主线程与 Web worker线程通信(传参)
主线程发送数据到web worker:<br>worker.postMessage('hello')
主线程接收来自 web worker 的数据:<br>worker.onmessage = function(event) {<br> console.log('接收到的数据', event.data);<br>}
结束Web worker
worker.terminate();
CSS
语法规则
由两个主要的部分构成:选择器,以及一条或多条声明<br>如 p {height:10px;}<br>
基础知识
选择器
标签/元素选择器<br>
div:选择所有div元素
id选择器
#container:选择所有id属性为container的元素
class选择器
.nav:选择所有class属性为nav的元素
属性选择器
input[type=text]:选择所有type属性为text的input表单元素<br>
a[src^="https"]选择其 src 属性值以 "https" 开头的所有a元素
a[src$=".pdf"]选择其 src 属性以 ".pdf" 结尾的所有a元素
子元素选择器
div > p:选择div下所有子元素p<br>
后代选择器
如 ul li { list-style: none; }<br>
兄弟选择器
相邻
如 h1 + p { font-size: 14px; }<br>
非相邻
如 h1 ~ p { font-size: 14px; }<br>
通配符选择器
*表示选择所有元素
伪类选择器
a标签的常用伪类
a:link、a:visited、a:hover、a:active<br><b>注意:<br>在CSS定义中,a:hover 必须被置于 a:link 和 a:visited 之后,a:active 必须被置于 a:hover 之后,才有效。</b><br>(顺序记忆方式:love hate,又爱又恨~)
<div class="example_code"><span class="hl-identifier">a</span><span class="hl-special">:link</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-reserved">color:</span><span class="hl-var">#FF0000</span><span class="hl-reserved"></span><span class="hl-code">;</span><span class="hl-brackets">}</span><span class="hl-code"> </span><span class="hl-comment">/*</span><span class="hl-comment"> 未访问的链接 </span><span class="hl-comment">*/</span><span class="hl-code"></span><br><span class="hl-code"></span><div class="hl-main"><span class="hl-identifier">a</span><span class="hl-special">:visited</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-reserved">color:</span><span class="hl-var">#00FF00</span><span class="hl-reserved"></span><span class="hl-code">;</span><span class="hl-brackets">}</span><span class="hl-code"> </span><span class="hl-comment">/*</span><span class="hl-comment"> 已访问的链接 </span><span class="hl-comment">*/</span><span class="hl-code"><br></span><span class="hl-identifier">a</span><span class="hl-special">:hover</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-reserved">color:</span><span class="hl-var">#FF00FF</span><span class="hl-reserved"></span><span class="hl-code">;</span><span class="hl-brackets">}</span><span class="hl-code"> </span><span class="hl-comment">/*</span><span class="hl-comment"> 鼠标悬浮在链接上 </span><span class="hl-comment">*/</span><span class="hl-code"><br></span><span class="hl-identifier">a</span><span class="hl-special">:active</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-reserved">color:</span><span class="hl-var">#0000FF</span><span class="hl-reserved"></span><span class="hl-code">;</span><span class="hl-brackets">}</span><span class="hl-code"> </span><span class="hl-comment">/*</span><span class="hl-comment"> 已选中的链接 </span><span class="hl-comment">*/</span></div> <br>button:active{} /*点击时的按钮,效果类似JavaScript的click事件*/<br>button:hover{} /*鼠标悬浮在按钮上*/<br></div>
其它伪类<br>
:first-child(选择元素的第一个子元素)<br>:last-child(选择元素的最后一个子元素)<br>:checked(input:checked
选择所有选中的表单元素)<br>:disabled(input:disabled
选择所有禁用的表单元素)<br>:nth-child(n)(选择元素的第n个子元素 )<br>:nth-last-child(n)(选择元素的倒数第n个子元素 )<br>.....<br>
伪元素选择器
::before、::after
通常与content属性一起使用
选择器分组
多个具有完全相同CSS样式的选择器合并简写方式
如 h1, h2, h3 { color: #000; }<br>
布局
传统布局
盒子模型
margin(外边距)
border(边框)
content(内容)
padding(内边距)
元素宽度/高度=外边距+边框+内容+内边距
table布局
div布局
三栏布局
flex布局
<figure class="highlight"><pre><code class="language-css" data-lang="css"><span class="nc">.vertical-container</span> <span class="p">{</span>
<span class="nl">height</span><span class="p">:</span> <span class="m">300px</span><span class="p">;</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">-webkit-flex</span><span class="p">;</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">flex</span><span class="p">;</span>
<span class="nl">-webkit-align-items</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="nl">align-items</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="nl">-webkit-justify-content</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="nl">justify-content</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>
实现居中布局(垂直&水平)<br>
grid布局
定位position<br>
static
默认定位属性
absolute
相对于父元素的位置,由top(距离上方)、bottom(距离下方)、left(距离左边)、right(距离右边)四个属性指定
relative
相对于该元素的初始位置,由top、bottom、left、right四个属性指定
fixed
相对于浏览器窗口的位置,由top、bottom、left、right四个属性指定
浮动float
使元素脱离文档流,浮于文档流上方
元素居中
水平居中
行内元素<br>
span { text-align: center; }<br>
块级元素
div { margin: 0 auto; }<br>
垂直居中
单行文本<br>
span { height: 20px; line-height: 20px; }<br>
多行文本
p { <span class="RichText CopyrightRichText-richText" itemprop="text" data-reactid="298">display: table-cell; </span>vertical-align: middle; }
阴影效果
text-shadow
用于给文字添加阴影效果
p { box-shadow: <span class="hl-number">10</span><span class="hl-string">px</span><span class="hl-code"> </span><span class="hl-number">10</span><span class="hl-string">px</span><span class="hl-code"> </span><span class="hl-number">5</span><span class="hl-string">px</span><span class="hl-code"> </span><span class="hl-var">#ccc</span><span class="hl-code"></span>; }<br>
box-shadow
用于给盒子添加阴影效果
div { box-shadow: <span class="hl-number">10</span><span class="hl-string">px</span><span class="hl-code"> </span><span class="hl-number">10</span><span class="hl-string">px</span><span class="hl-code"> </span><span class="hl-number">5</span><span class="hl-string">px</span><span class="hl-code"> </span><span class="hl-var">#ccc</span><span class="hl-code"></span>; }<br>
CSS3
动画<br>
关键帧@keyframes
<pre>用法:@keyframes <i>animationname</i> {<i>keyframes-selector</i> {<i>css-styles</i>;}}<br>animationname:动画名称<br>keyframes-selector:动画时长的百分比。取值:0-100%,from(与 0% 相同),to(与 100% 相同)<br>css-styles:一个或多个合法的 CSS 样式属性。</pre>
animation
<pre>用法:animation: <i>name</i> <i>duration</i> <i>timing-function</i> <i>delay</i> <i>iteration-count</i> <i>direction</i>;</pre>
过渡
transition属性
用法:transition: property duration timing-function delay;
2D/3D变换
transform属性
translate(x,y)/translateX()、translateY()、translateZ()
旋转指定度数:rotate(deg)/rotateX(deg)、rotateY(deg)、rotateZ(deg)
缩放指定倍数:scale()
圆角边框
border-radius属性
flex弹性布局
Bootstrap框架
网格式布局
响应式布局
基于媒体查询@media<br>
.container/.container-fluid、.row、.col-xs-2/.col-md-4
CSS预处理器
Less、Sass
工具
构建工具
webpack、gulp、grunt等
依赖包管理
npm、bower
JavaScript
语法基础<br>
变量
分类
局部变量/全局变量
数值Number、字符串String、数组Array、Function函数、布尔boolean、对象Object、null、undefined<br>
变量声明提升
JavaScript引擎在执行的时候,会把所有变量的声明都提升到<strong>当前作用域</strong>的最前面
数据类型<br>
基本类型:number、string、boolean
Object、Array、Function、null、undefined<br>
作用域
全局作用域、函数(即function)内作用域,此外ES6中增加了块级作用域
运算符<br>
算术运算符
+、-、*、/、%、++、--
关系运算符
==、===(值和类型均相等)、!=、!==、>、<、>=、<=
逻辑运算符
&&逻辑与
||逻辑或
在ES6之前用于给变量赋默认值,如:arg = arg || 0; 在ES6中可以使用默认参数替代<br>
!逻辑非<br>
true:空字符串、0、null、NaN、undefined<br>false:对象、非空字符串、非0数值(Infinity)<br>
<b>连续两次!,可将任意类型转换成bool类型,如!!obj</b><br>
位运算符
&(位与)、|(位或)、^(异或)
对象运算符
in(判断左侧运算数是否是右侧运算数的成员)、instanceof(判断对象是否属于某个类或构造函数)、<br>delete(删除对象的属性、数组元素或变量)、.与[](获取对象或数组元素)等
类型判断typeof
判断变量类型,如 typeof "213" // 结果是"string"<br>
隐式类型转换<br>
1、基本数据类型间进行+、-、*、/、%操作<br>①加号运算符时,String和其他类型时,其他类型都会转为 String;<br>其它情况,都转化为Number类型 , 注: undefined 转化为Number是NaN(Not a Number), 任何Number与NaN相加都为NaN。<br>②其它运算符时, 基本类型都转换为 Number,String类型的带有字符的比如: '1a' ,'a1' 转化为 NaN 与undefined 一样。<br>2、Object与基本数据类型运算<br><span>Number类型会先调用valueOf(), String类型会先调用toString(), 如果结果是原始值,则返回原始值,否则继续用toString 或 valueOf(),继续计算,如果结果还不是原始值,则抛出一个类型错误</span>
函数
调用函数:func.apply(obj, argArr)、func.call(obj, arg1, arg2, ...argN)
arguments对象
表示实参列表,不是数组Array类型,而是被称为“类数组ArrayLike类型”。<br>可以通过Array.prototype.slice.apply(arguments)转换成真实的Array类型
指针标识
this
指向当前操作对象
callee
指向当前正在调用的函数<br>
prototype
指向函数的原型
constructor<br>
指向创建该对象的构造函数
IIFE(Immediately-Invoked Function Expression,立即执行函数表达式)
可以看成是模块化的表现形式
全局函数
window对象常用的函数<br>
定时器setTimeout()和setInterval()
对setTimeout函数理解的误区:<br>如:setTimeout(function(){<br> console.log('setTimeout is running');<br>}, 2000)<br>表示在2秒钟后,setTimeout中的回调函数才会被放到任务队列里,等待主线程空闲后才会从任务队列中取出执行(因为JavaScript没有多线程,相当于模拟多线程)。因此不一定是2秒后执行,可能会等待更长时间。<br>
数组
常用函数
添加、删除
类似栈操作,先进后出:push(向数组末尾添加元素)、pop(删除并返回数组末尾元素)
类似队列“先进先出”操作:push和shift(删除并返回数组第一个元素)、unshift(往数组头部添加元素)<br>
子数组
slice函数:从原数组中选取部分元素构成新数组,用法:var newArr = arr.slice(fromIndex, toIndex)
splice函数:<br>1、删除数组中任意数量的元素,用法:arr.splice(fromIndex, length)<br>2、向指定位置插入指定元素,用法:arr.splice(fromIndex, 0, item)<br>3、替换数组中任意数量的元素,用法:arr.splice(fromIndex, count, item)<br>
concat:合并两个数组,如arr1.concat(arr2)
数组转换<br>
join:将数组用指定分隔符转换成字符串,用法:arr.join(',')。不带参数默认以逗号分隔,arr.join()等同于arr.join(',')
toString:转换成字符串
数组排序
reverse:反转数组元素顺序
sort:默认比较字符串;将数组按升序排序
查找元素
indexOf、lastIndexOf
迭代函数
some/every(返回true或false)、filter(过滤掉不满足条件的数组元素)、<br>forEach(无返回值,用法如data.forEach(function(val,index,arr){}))、map(返回每次函数调用的结果数组)
Object常用函数
<span>Object</span>.<span>create(</span><span>prototype[, descriptors]):按指定原型创建对象。<br><b>注:Object.create(null)用于创建一个空对象(没有任何属性),而 通过 var o = new Object()和 var o = {}两种方式创建的对象是有一个__proto__ 属性的</b><br></span>
<span>Object</span>.<span>defineProperty(obj, prop, descriptor):在obj对象上</span><span>定义新的或修改原有的属性名称为prop的属性,类似的还有Object.defineProperties</span>
字符串
字符串方法
str.toUpperCase/toLowerCase(大小写转换)
split函数
与数组对象的join函数互为逆运算,如'test'.split('')结果为['t', 'e', 's', 't']<br>
全局函数
escape/unescape(常规编/解码)、encodeURI/decodeURI(URI字符串编/解码)、<br>encodeURIComponent/decodeURIComponent(URI组件编/解码)
String.fromCharCode函数接受一个指定的 Unicode 值,然后返回一个字符串。<br>比如String.fromCharCode(65, 66, 67) 返回“ABC”,其中65,66,67分别是A,B,C对应的ASCII码值<br>
DOM模型
即Document Object Model(文档对象模型),其中包含了对于HTML/XML文档对象(比如document)的各种操作。<br>Document根节点包含的子节点:form、body、a、image、link等
BOM模型
即Browser Object Model(浏览器对象模型),其中包含了对浏览器的各个元素的操作,比如最常见 的window对象。<br>window对象包含的属性有:document、location、navigator、screen、history、frame等
URL.createObjectURL():根据参数(File/Blob类型)创建一个URL,字符串类型<br>URL.revokeObjectURL(objectURL):释放创建的objectURL
原型/原型链
Object与Function:都是构造函数,因此 Function.__proto__ == Function.prototype && Object.__proto__ == Function.prototype 结果为true<br>
__proto__:<span>所有对象中都有一个__proto__属性,指向其原型对象</span>
Function.prototype.__proto__ == Object.prototype //true<br>Object.__proto__ == Function.prototype //true,因为Object是一个构造函数<br>Object.prototype.__proto__ == null //true <br>
<span>当访问对象obj的属性时,如果obj对象自身没有该属性,则沿着原型链向上查找(即一直往上查找__proto__中是否有该属性)。<br>如果找到,则返回;如果到了Object.prototype.__proto__这一层还没找到,则返回undefined</span>
constructor:它是原型对象的一个属性,指向其构造函数
Function.prototype.constructor == Function //结果为true<br>
prototype:<span>它是构造函数对象的属性,</span><span>指向其原型对象</span>
原型
Object.prototype:所有对象的原型
Function.prototype:所有函数对象的原型<br>
原型链<br>
原型链是一种为了方便实现对象继承的机制,<span>所有对象中都有一个__proto__属性,指向其原型对象,形成链状结构</span>
Object.prototype.__proto__ == null //true,原型链的末端
作用域/作用域链
作用域:在ES6前,javascript只有两个作用域:全局作用域、function作用域,分别对应全局变量和局部变量
闭包
当两个函数嵌套,内层函数里使用了外层函数中的临时变量,并且外层函数的返回值是内层函数的引用。这样就构成了闭包。
作用:<br>1、用于获取函数内部的变量,同时不暴露变量到函数外部(避免变量全局污染);<br>2、将变量值长驻内存中(由于变量被引用不会被垃圾回收)<br>
继承/扩展
基于原型prototype,如Number.prototype.add = function() {} 给所有Number对象增加add方法<br>
<pre>对象属性拷贝:<br>Object.extend = function(dest, src) {<br> for (var prop in src) {<br> dest[prop] = src[prop];<br> }<br> return dest;<br>} </pre>
事件机制
事件冒泡<br>
当父、子元素有相同事件的触发顺序:子元素 -> 父元素<br>
阻止事件冒泡:event.stopPropagation(); 它会阻止捕获和冒泡阶段中当前事件的进一步传播
事件捕获<br>
当父、子元素有相同事件的触发顺序:父元素 -> 子元素
事件委托
事件可以委托给父级元素,即进行事件处理时可以使用该元素的父元素代为处理
事件委托是利用事件的冒泡原理来实现的
事件监听
addEventListener、removeEventListener
如 el.atddEventListener("click", clickFunc, useCapture):其中第三个参数为Boolean类型,表示是否使用事件捕获,默认是false
attachEvent、detachEvent
如 el.attachEvent("onclick", clickFunc)
阻止默认事件<br>
event.preventDefault();或 return false;<br>
注:return false相当于event.preventDefault();加上event.stopPropagation的作用,即阻止默认事件、事件冒泡和事件捕获<br>
NodeJS
Express框架
ECMAScript
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,但实际上后两者是ECMA-262标准的实现和扩展。
ECMAScript 6
即ECMAScript 2015,是2015年发布的ECMAScript新版本
新特性
let、const命令
let命令要求变量必须“先声明后使用”
const命令用于声明一个常量
块级作用域
ES6之前只有两个作用域:全局与function范围
函数的参数默认值
如<code><span>:<br>function</span> <span>log<span>(</span></span>x<span>,</span> y <span>=</span> <span>'default'</span><span>)</span> <span>{</span></code><br><code></code><code> console<span>.</span><span>log<span>(</span></span>x<span>,</span> y<span>)</span><span>;</span></code><br><code></code><code><span>}</span></code>
rest 参数
类似于Java中的可变长参数,使用rest参数后就不需要使用arguments来获取参数列表了
... 变量名<br>
function(x, ... args) {<br> console.log(args.length);<br>}<br>
注:<br>1、rest参数是真正的数组,而arguments对象是类数组,需要使用Array.prototype.slice.call(arguments)转换成真实数组。<br>2、跟Java中可变参数类似,rest参数只能是参数列表中的最后一个<br>
扩展运算符<br>
它好比 rest 参数的逆运算,用于将一个数组转为用逗号分隔的参数序列
主要用于函数调用传参
<pre class=" language-javascript"><code class=" language-javascript"><span class="token keyword">function</span> <span class="token function">add<span class="token punctuation">(</span></span>x<span class="token punctuation">,</span> y<span class="token punctuation">)</span> <span class="token punctuation">{</span><br> <span class="token keyword">return</span> x <span class="token operator">+</span> y<span class="token punctuation">;</span><br><span class="token punctuation">}</span><span class="token punctuation"></span><br><span class="token function">add<span class="token punctuation">(</span></span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></code><code class=" language-javascript"><span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">38</span><span class="token punctuation">]</span><span class="token punctuation"></span></code><code class=" language-javascript"><span class="token punctuation">)</span><span class="token comment" spellcheck="true"> // 42</span></code></pre>
可以用于替代函数的apply方法
<pre class=" language-javascript"><code class=" language-javascript"><span class="token comment" spellcheck="true">// ES5 的写法
</span><span class="token keyword">function</span> <span class="token function">f<span class="token punctuation">(</span></span>x<span class="token punctuation">,</span> y<span class="token punctuation">,</span> z<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> // ...
</span><span class="token punctuation">}</span>
<span class="token keyword">var</span> args <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
f<span class="token punctuation">.</span><span class="token function">apply<span class="token punctuation">(</span></span><span class="token keyword">null</span><span class="token punctuation">,</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">
// ES6的写法
</span><span class="token keyword">function</span> <span class="token function">f<span class="token punctuation">(</span></span>x<span class="token punctuation">,</span> y<span class="token punctuation">,</span> z<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> // ...
</span><span class="token punctuation">}</span>
<span class="token keyword">let</span> args <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token function">f<span class="token punctuation">(</span></span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>args<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
变量的解构赋值
包括数组、对象等
数组解构赋值
let [a, b] = [1, 2, 3]; //a,b分别被赋值为1,2,而3由于没有变量接收,因此被丢弃<br>
let [a, b, c] = [1, 2]; //a,b分别被赋值为1,2,而 c 由于解构不成功,因此为undefined<br>
对象解构赋值
let { foo, bar } = { bar: "lorem", foo: "ipsum" }; // foo = "ipsum", bar = "lorem"<br>
注:变量必须与属性同名,才能取到正确的值,与对象属性顺序无关
解构赋值允许指定默认值
let [x = 0] = []; // x值为0<br>
只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值,比如Set:<pre class=" language-javascript"><code class=" language-javascript"><span class="token keyword">let</span> <span class="token punctuation">[</span>x<span class="token punctuation">,</span> y<span class="token punctuation">,</span> z<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Set</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'a'</span><span class="token punctuation">,</span> <span class="token string">'b'</span><span class="token punctuation">,</span> <span class="token string">'c'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">; // x,y,z分别被赋值为a,b,c</span></code></pre>
应用
交换两个变量的值<br>
[a, b] = [b, a]<br>
函数参数解构赋值
<pre class=" language-javascript"><code class=" language-javascript"><span class="token keyword">function</span> <span class="token function">add<span class="token punctuation">(</span></span><span class="token punctuation">[</span>x<span class="token punctuation">,</span> y<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br> <span class="token keyword">return</span> x <span class="token operator">+</span> y<span class="token punctuation">;</span><br><span class="token punctuation">}<br><br></span></code><code class=" language-javascript"><span class="token function">add<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true"> // 3</span></code><br><code class=" language-javascript"><span class="token punctuation"></span></code></pre>
Set、Map数据结构
Set
<code>Set</code>与<code>Array</code>类似,但<code></code>没有索引,其中的元素不能重复,因此可用于数组去重。<br><font face="宋体">Set</font>本身是一个构造函数,该函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化,如var set = new Set(['foo', 'bar'])<br>
操作函数<br>
元素操作:add(value)、delete(value)、has(value)、clear()
遍历操作:forEach()、keys()、values()、entries()
返回Set中的元素个数:size属性
Map
<font face="宋体">Map</font>与<font face="宋体">Object</font>类似,不同的是,Map中的key可以为任意数据类型,而Object中key只能是字符串。<br><font face="宋体">Map</font>本身是一个构造函数,该函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化,如new Map([[1, 'a'], [2, 'b']]),<br><b>注意:其中的每个entry也是一个数组结构</b><br>
操作函数<br>
元素操作:add(value)、delete(value)、has(value)、clear()
遍历操作:forEach(callbackFn[, thisArg])、keys()、values()、entries()
返回Set中的元素个数:size()
操作函数<br>
元素操作:set(key, value)、delete(key)、has(key)、clear()
遍历操作:forEach(callbackFn[, thisArg])、keys()、values()、entries()
返回Map中的元素个数:size属性
模板字符串
避免了字符串拼接,书写和阅读起来更容易<br>
类似 `My name is ${name}, I'm ${age} years old.`
类Class<br>
class关键字、extends关键字、constructor方法(相当于Java中的构造方法)
Mixin 模式
将多个类的接口“混入”(mix in)另一个类,也就是可以将多个对象合成为一个类
装饰器Decorator
用于扩展类的行为。通常用于日志记录、权限验证等场景。
如果觉得一个参数不够用,可以在装饰器函数外面再封装一层带参函数。
如<pre class=" language-javascript"><code class=" language-javascript"><span class="token keyword">function</span> <span class="token function">testable<span class="token punctuation">(</span></span>isTestable<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">function</span><span class="token punctuation">(</span>target<span class="token punctuation">)</span> <span class="token punctuation">{</span>
target<span class="token punctuation">.</span>isTestable <span class="token operator">=</span> isTestable<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
@<span class="token function">testable<span class="token punctuation">(</span></span><span class="token boolean">true</span><span class="token punctuation">)</span>
class <span class="token class-name">MyTestableClass</span> <span class="token punctuation">{</span><span class="token punctuation">}</span></code></pre>
装饰器本身是一个函数,该函数的第一个参数是被装饰的目标对象,如以上代码内层函数中的target即为目标对象
一个类或类的方法上可以同时有多个装饰器,将先从外到内进入,然后由内向外执行。
语法类似于Java中的注解,<b>但是:装饰器只能用于类和类的方法,不能用于函数,因为存在函数提升。</b>
箭头函数<br>
函数的简化写法,形如 (args) => {statements}<br>
<pre><span>如 array</span><span>.</span><span>forEach</span><span>(</span><span>a</span> <span>=</span><span>></span> <span>console</span><span>.</span><span>log</span><span>(</span><span>a</span><span>));</span></pre>
Object对象扩展
增加Object.defineProperty(obj, prop, descriptor)(操作对象属性)、Object.keys(obj)、Object.entries(obj)、<br>Object.values(obj)、Object.assign等函数
新增Symbol数据类型<br>
用于防止属性名冲突,因为每个Symbol都是唯一的
Proxy 对象<br>
运用了代理模式的思想,控制外部对目标对象的访问行为
通过<code class=" language-javascript"><span class="token keyword"> new</span> <span class="token class-name">Proxy</span><span class="token punctuation">(</span>target<span class="token punctuation">,</span> handler<span class="token punctuation">) 产生代理对象</span><span class="token punctuation"></span></code>
target:目标对象
handler:对目标对象执行拦截行为的处理函数
Reflect 对象<br>
异步编程
Promise
为解决大量的回调函数嵌套问题,使用链式的方式进行调用
三种状态:<code>pending</code>(进行中)、<code>fulfilled</code>(已成功)和 <font face="Arial">rejected</font>(失败)
Generator 函数
生成器,借鉴了Python中的generator的概念和语法
yield 表达式<br>
<code>1、yield</code> 是一个类似 <code>return</code> 的关键字,只是return的是个迭代器;<br>2、一旦一个generator 执行到yield语句,generator函数将会暂停执行,然后返回一个迭代器对象;<br>3、当调用next()方法或使用for...of...循环进行迭代的时候,函数中的代码才会开始被执行;<br>最终,generator函数终止,再调用generator将会引发StopIteration异常
<code>两个特征:<br>1、function</code>关键字与函数名之间有一个星号(*),用于与普通函数区分开来;<br>2、函数体内部使用<code>yield</code>表达式,定义不同的内部状态
如<br><pre class=" language-javascript"><code class=" language-javascript"><span class="token keyword">function</span><span class="token operator">*</span> <span class="token function">helloWorldGenerator<span class="token punctuation">(</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
yield <span class="token string">'hello'</span><span class="token punctuation">;</span>
yield <span class="token string">'world'</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token string">'ending'</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
实际应用
Generator 函数可用于处理异步操作,改写回调函数
保证多个同步操作依次执行
async 函数
在函数声明时加上async关键字<br>
本质是 Generator 函数的语法糖
<code>async</code>函数就是将 Generator 函数的星号(<code>*</code>)替换成<code>async</code>,将<code>yield</code>替换成<code>await</code>
其返回值是一个Promise对象
如<br><pre class=" language-javascript"><code class=" language-javascript"><span class="token keyword">function</span> <span class="token function">timeout<span class="token punctuation">(</span></span>delay<span class="token punctuation">)</span> <span class="token punctuation">{</span><br> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span>resolve<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span><br> <span class="token function">setTimeout<span class="token punctuation">(</span></span>resolve<span class="token punctuation">,</span> delay<span class="token punctuation">)</span><span class="token punctuation">;</span><br> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token punctuation">}</span><br><br><b>async <span class="token keyword">function</span> <span class="token function">asyncPrint<span class="token punctuation">(</span></span>value<span class="token punctuation">,</span> delay<span class="token punctuation">)</span> <span class="token punctuation">{</span><br> await <span class="token function">timeout<span class="token punctuation">(</span></span>delay<span class="token punctuation">)</span><span class="token punctuation">;</span><br> console<span class="token punctuation">.</span><span class="token function">log<span class="token punctuation">(</span></span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token punctuation">}</span></b><br><br><span class="token function">asyncPrint<span class="token punctuation">(</span></span><span class="token string">'hello world'</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></code></pre>
框架<br>
ExtJS
重量级的前端UI框架
MVC框架
AngularJS
MVC
Model
模型,即数据
View
视图,即HTML页面
Controller
控制器,即用于操作模型数据的函数
表达式{{expression}}
指令directive
内置指令
<p><strong>ng-app</strong> 指令初始化一个 AngularJS 应用程序。</p><br><p><strong>ng-init</strong> 指令初始化应用程序数据。</p><br><strong>ng-model</strong> 指令把元素值(比如输入域的值)绑定到应用程序。
其它如ng-bind、ng-if、ng-show、ng-repeat等
自定义指令
var app = angular.moudule('myApp', []);<br>app.directive('helloDirective', function() {<br> return {<br> restrict : 'E',<br> template : <span class="highVAL">'<h1>hello,directive!</h1>'</span><br> }<br>})<br>
<p>其中 <b>restrict</b> 值可以是以下几种:</p><br><ul><li><code>E</code> 作为元素名使用,即标签。如<hello-directive></hello-directive><br></li><li><code>A</code> 作为属性使用。如 <p hello-directive>文本</p><br></li><li><code>C</code> 作为类名使用。如 <div class="hello-directive"></div><br></li><li><code>M</code> 作为注释使用。如 <!-- <span class="highCOM">directive: </span>hello-directive --><br></li></ul><b>restrict</b> 默认值为 <code>EA</code>, 即可以通过元素名和属性名来调用指令
作用域
实际上是包含属性和函数的JavaScript对象<br>
$scope(controller范围)、$rootScope(根作用域,即整个应用)<br>
使用:作为参数传入Controller中
如:app.controller('myCtrl', function($scope) {<br> // do something<br> $scope.test = function() {}<br>})
服务Service
常用内置服务<br>
$http
处理HTTP请求、响应
$location
对应JavaScript中的 window.location 对象<br>
$timeout/$interval
分别对应JavaScript中的 window.setTimeout()/window.setInterval()函数<br>
自定义服务<br>
定义:app.service(name, fn)形式,其中name表示服务名,fn实际上就是该服务的构造函数
如:<br>app.service('print', function() {<br> return function(msg) {<br> console.log(msg);<br> }<br>})
使用:作为参数传入Controller中<br>
如:<br>app.controller('myCtrl', function($scope, print) {<br> $scope.print = print;<br>})<br><br>注:其中的$scope, print参数将由依赖注入器<span>Injector</span>自动完成实例化并传入<br>
路由
基于hash,ngRoute 模块
主要是为SPA(Single Page Application,单页面应用)引入的,不需要页面刷新就能改变页面URL。通常是以#开头的hash形式
ng-view指令
定义路由的容器
$<em>routeProvider</em>
用于配置路由的内置服务
模块module<br>
一个Angular应用可以包含多个模块,一个模块中可以包含多个控制器Controller、过滤器Filter、服务Service及指令Directive
定义及使用模块
语法格式:angular.moudule(name, [dependencies...])<br><b>注:当没有依赖模块时必须写成 angular.moudule(name, [])形式,其中[]不能省略</b><br>
如:angular.module("myApp", ['ngRoute']);<br>其中myApp是模块名,ngRoute是依赖的模块<br>
组件Component<br>
定义组件:app.component(name, props)<br>
如:<br>app.component('myComponent', {<br> template: '<p>自定义组件</p>',<br> controller: function($scope) {<br> $scope.name = 'test';<br> }<br>})<br>
使用:作为HTML标签,如<my-component></my-component>
模板template<br>
一般是包含angular表达式的HTML代码片段
双向数据绑定
模型与视图中的数据,其中一个发生变化,另一个随之改变
ng-model指令
过滤器
管道字符 ”|“,用于数据格式化
本质是一个函数,至少有一个参数,当然也可以有多个。默认会将管道字符前的作为第一个参数传入<br>
常用内置过滤器
lowercase/uppercase
如 {{<span>lastName | uppercase</span>}}表示将lastName格式化为大写形式<br>
currency
将数字格式化成货币表示形式<br>
如:{{ 200 | currency: '¥' }} 格式化后结果为 ¥200<br>
date
日期格式化<br>
orderBy
数组元素排序
number
数字格式化
自定义过滤器
定义形如 app.filter(name, fn)
如:<br>app.filter('reverse', function() {<br> <span class="hl-code"></span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-identifier">text</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code"><br> </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">text</span><span class="hl-code">.</span><span class="hl-identifier">split</span><span class="hl-brackets">(</span><span class="hl-quotes">''</span><span class="hl-quotes"></span><span class="hl-brackets">)</span><span class="hl-code">.</span><span class="hl-identifier">reverse</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">.</span><span class="hl-identifier">join</span><span class="hl-brackets">(</span>''<span class="hl-quotes"></span><span class="hl-brackets">)</span><span class="hl-code">;<br> </span><span class="hl-brackets"> }</span><span class="hl-code"></span><br>})<br><br>注:该过滤器用于字符串反转<br>
在模板中使用:{{'hello' | reverse}} 结果为 'olleh'<br>
事件
ng-click、ng-change等指令,对应于JavaScript中的事件,如ng-click对应点击(onclick)事件
依赖注入
DI(Dependence Injection),IOC(Inverse of Control)
Angular
基于TypeScript<br>
依赖注入
模块化
基于ECMAScript6模块规范:import、export命令<br>
数据绑定
默认:单向数据绑定
BackboneJS
VueJS
表达式{{expression}}
生命周期
常用钩子函数:beforeCreate、created、mounted(挂载元素,获取到DOM节点)、updated
组件化<br>
创建组件
通过Vue.component('组件名称', 属性)
通过new Vue({})函数<br>
定义独立的.vue文件
包含HTML、CSS、JavaScript
组件间通信
父子组件
子组件=>父组件:基于事件触发的方式,使用vm.$emit实例方法。<br>
<ul><li>子组件中使用$emit(eventName, [... args])触发一个自定义事件。如 this.$emit('change-name', 'Tom'),其中第一个参数changeName是一个自定义事件,后面的参数'Tom'就是要传递给父组件的数据。</li></ul><ul><li>父组件可以通过两种方式接收:</li></ul>1)使用v-on指令进行接收,适用于$emit只有事件名的情况(如子组件调用@click="$emit('change')", 父组件使用@change="changeFunc");<br>2)使用$on(event, callback)监听该自定义事件,当有数据传过来时就用回调函数进行接收处理。<br>如 <br>this.$on('change-name', function(name) { <br> this.name = name;<br> })
父组件=>子组件:使用prop传值<br>
在父组件中定义prop,如<code class="hljs handlebars has-numbering"><span class="xml"><span class="javascript"> props: [<span class="hljs-string">'name'</span>]</span></span></code>
子组件中直接使用该prop,如 <input name="url"/><br>
兄弟组件
指令directive<br>
如v-model、v-bind、v-for、v-if、v-show等,与AngularJS类似
自定义指令
全局指令
<pre><span class="line"><span class="comment">// 注册一个全局自定义指令 `v-focus`</span></span><br><span class="line">Vue.directive(<span class="string">'focus'</span>, {</span><br><span class="line"> <span class="comment">// 当被绑定的元素插入到 DOM 中时……</span></span><br><span class="line"> inserted: <span class="function"><span class="keyword">function</span> (<span class="params">el</span>) </span>{</span><br><span class="line"> <span class="comment">// 聚焦元素</span></span><br><span class="line"> el.focus()</span><br><span class="line"> }</span><br><span class="line">})</span></pre>
组件内指令,使用directives属性
<pre><span class="line">export default {<br> data: function() {<br> return {}<br> },</span><span class="line"><br><span class="line"> directives: {</span><br><span class="line"> focus: {</span><br><span class="line"> <span class="comment">// v-focus指令的定义</span></span><br><span class="line"> inserted: <span class="function"><span class="keyword">function</span> (<span class="params">el</span>) </span>{</span><br><span class="line"> el.focus()</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }<br></span>}<br></span></pre>
$nextTick
模块
使用ES6模块规范组织模块
事件支持
onclick事件<br>
v-on:click,可简写为@click
onchange事件
v-on:change,同理可简写为@change
......
过滤器
管道字符 |,如{{<span>lastName | uppercase</span>}}表示将lastName格式化为大写形式<br>
路由
主要是为SPA(Single Page Application,单页面应用)引入的,不需要页面刷新就能改变页面URL。<br>通常是以#开头的hash形式,也可以是普通的基于history模式的URL,后者更利于网站SEO
在VueJS中使用Vue-Router模块进行路由管理<br>
定义路由
定义路由容器:<span class="crayon-h"></span><span class="crayon-o"><</span><span class="crayon-v">router</span><span class="crayon-o">-</span><span class="crayon-v">view</span><span class="crayon-o">></span><span class="crayon-o"><</span><span class="crayon-o">/</span><span class="crayon-v">router</span><span class="crayon-o">-</span><span class="crayon-v">view</span><span class="crayon-o">></span>
<span class="crayon-m">// 创建路由对象,并挂载到Vue实例上,方便使用this.$router操作<br><font face="宋体">const</font></span><font face="宋体"><span class="crayon-h"> </span><span class="crayon-v">myRoutes</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-sy">[</span></font><div class="crayon-line crayon-striped-line" id="crayon-5b325f7e19f53056924892-12"><font face="宋体"><span class="crayon-h"> </span><span class="crayon-sy">{</span><span class="crayon-v">path</span><span class="crayon-o">:</span><span class="crayon-s">'/'</span><span class="crayon-sy">,</span><span class="crayon-v">component</span><span class="crayon-o">: </span><span class="crayon-v">Index</span><span class="crayon-sy">}</span><span class="crayon-sy">,</span></font></div><div class="crayon-line" id="crayon-5b325f7e19f53056924892-13"><font face="宋体"><span class="crayon-h"> </span><span class="crayon-sy">{</span><span class="crayon-v">path</span><span class="crayon-o">:</span><span class="crayon-s">'/login'</span><span class="crayon-sy">,</span><span class="crayon-v">component</span><span class="crayon-o">: Log</span><span class="crayon-v">in</span><span class="crayon-sy">}</span></font></div><div class="crayon-line crayon-striped-line" id="crayon-5b325f7e19f53056924892-14"><font face="宋体"><span class="crayon-h"> </span><span class="crayon-sy">]<br><br></span><span class="crayon-sy"></span></font></div><div class="crayon-line crayon-striped-line" id="crayon-5b325f7e19f53056924892-16"><font face="宋体"><span class="crayon-h"> </span><span class="crayon-m">const</span><span class="crayon-h"> </span><span class="crayon-v">myRouter</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-r">new</span><span class="crayon-h"> </span><span class="crayon-e">VueRouter</span><span class="crayon-sy">(</span><span class="crayon-sy">{</span></font></div><div class="crayon-line" id="crayon-5b325f7e19f53056924892-17"><font face="宋体"><span class="crayon-h"> </span><span class="crayon-v">routes</span><span class="crayon-o">:</span><span class="crayon-i"> myRoutes</span></font></div><div class="crayon-line crayon-striped-line" id="crayon-5b325f7e19f53056924892-18"><font face="宋体"><span class="crayon-h"> </span><span class="crayon-sy">}</span><span class="crayon-sy">)</span></font></div><div class="crayon-line" id="crayon-5b325f7e19f53056924892-19"><font face="宋体"> </font></div><div class="crayon-line crayon-striped-line" id="crayon-5b325f7e19f53056924892-20"><font face="宋体"><span class="crayon-h"> </span><span class="crayon-r">new</span><span class="crayon-h"> </span><span class="crayon-e">Vue</span><span class="crayon-sy">(</span><span class="crayon-sy">{</span></font></div><div class="crayon-line" id="crayon-5b325f7e19f53056924892-21"><font face="宋体"><span class="crayon-h"> </span><span class="crayon-v">router</span><span class="crayon-o">: </span><span class="crayon-i">myRouter</span></font></div><div class="crayon-line crayon-striped-line" id="crayon-5b325f7e19f53056924892-22"><font face="宋体"><span class="crayon-h"> </span><span class="crayon-sy">}</span><span class="crayon-sy">)</span></font></div>
路由跳转<br>
<span class="crayon-o">声明式:<</span><span class="crayon-v">router</span><span class="crayon-o">-</span><span class="crayon-e">link</span><span class="crayon-st"> :to</span><span class="crayon-o">=</span><span class="crayon-s">"路由地址"</span><span class="crayon-o">></span><span class="crayon-o"><</span><span class="crayon-o">/</span><span class="crayon-v">router</span><span class="crayon-o">-</span><span class="crayon-v">link</span><span class="crayon-o">></span>
编程式:this.$router.push({ path: '路由地址', name: '路由对应的name', query: {}, params: {} })
不带参数跳转:this.$router.push('路由地址')
路由嵌套
子路由
子路由的地址为父子路由地址拼接组成
如<br><font face="宋体">{<br> path: '/',<br> name: 'index',<br> component: Index,<br> children: { path: '/login', name: 'login', component: Login }<br>}</font><br>
路由传参
通过URL路径传参<br>
路由配置:<br>{ <br> path:'/detail/:id',<br> component: Detail<br>}
传参:this.$router.push({ path: '/detail/2'})<br>接收:this.$route.params.id<br>
通过query对象
即通过查询字符串传参,参数会显示在URL上,类似HTTP的GET请求传参
路由配置:<br>{<br> path: '/detail',<br> component: Detail<br>}<br>传参:this.$router.push({ path: '/detail', query: { id: 2 }})
<br>接收:this.$route.query.id<br>
通过params对象
必须要指定目标路由的name属性。参数不会显示在浏览器地址栏上,类似HTTP的POST请求传参
路由配置:<br>{<br> path: '/detail',<br> name:'detail',<br> component: Detail<br>}<br>传参:this.$router.push({ <b>name</b>: 'detail', params: { id: 2 }})<br>接收:this.$route.params.id<br>
虚拟DOM
对复杂的文档DOM结构,提供一种方便的工具,进行最小化地DOM操作。减少了真实DOM的更新次数,提高了效率。
数据绑定
默认:单向数据绑定
v-model指令:双向数据绑定
v-html指令:可绑定HTML元素内容
核心插件<br>
Vue Router
路由管理
Vuex
状态数据管理
使用 new Vuex.Store({}) 创建一个Vuex实例
核心概念<br>
State
保存应用级别的状态数据
通过this.$store.state获取状态数据
Getter
Mutation
更改 Vuex 的 store 中的状态的唯一方法是提交 mutation
每个 mutation 都有一个字符串的 <strong>事件类型 (type)</strong> 和 一个 <strong>回调函数 (handler,用于更改状态,</strong><strong>并且它会接受 state 作为第一个参数)</strong>
Action
<p>Action 类似于 mutation,不同在于:</p><ul><li>Action 提交的是 mutation,而不是直接变更状态。</li><li>Action 可以包含任意异步操作。</li></ul>
Action 通过 <code>store.dispatch</code> 方法触发:store.dispatch('ADD')
使用<br>
通常通过注入到根组件,该 store 实例会注入到根组件下的所有子组件中,且子组件能通过 this.$store 访问到
new Vue({<br> el: '#app',<br> router,<br> store,<br> render: h => h(App)<br>})
UI框架
iview
具有丰富的UI组件
element-ui
库
jQuery
选择器<br>
同CSS选择器
DOM操作
事件处理
动画
功能扩展
$.extend<br>
类级别
$.fn.extend
对象级别
Ajax封装
类似的还有axios
ReactJS
用于构建用户界面UI,允许HTML和JavaScript混合着写,适用于构建较复杂的UI<br>
Virtual DOM<br>
对复杂的文档DOM结构,提供一种方便的工具,进行最小化地DOM操作。减少了真实DOM的更新次数,提高了效率。
组件化
将UI上每一个功能相对独立的模块定义成组件
组件的特征
可组合
简单的组件间可以进行组合,形成复杂的组件。反之,<span style="font-family:'Microsoft YaHei';font-size:14px;">一个复杂的UI可以拆分成多个简单的UI组件</span>
可重用
<span style="font-family:'Microsoft YaHei';font-size:14px;">每个组件都是具有独立功能的,可用于多个场景</span>
可维护
<span style="font-family:'Microsoft YaHei';font-size:14px;">每个小组件仅包含自身的逻辑,更容易被维护</span>
组件实现一个 <code>render()</code> 方法,它接收输入数据并返回显示的内容。输入数据可以通过 <code>this.props</code> 传入组件,被 <code>render()</code> 访问
创建组件<br>
<code>React.createElement(type, config, ...children)</code> 函数
type : HTML标签类型,如 'div'<br>
config: 属性,如 { className: '' }
children:子元素<br>
字符串或ReactElement对象<br>
返回值:ReactElement对象
渲染界面
<font face="宋体">ReactDOM.render(</font><font face="宋体"><span style="font-family:'新宋体';font-size:12px;">ReactElement </span>element, DOMElement container[, function callback]) </font>函数<br>
element:需要渲染的元素,ReactElement对象<br>
container:渲染的目标容器,DOMElement对象
无返回值
JSX语法
JSX 是一个看起来很像 XML 的 ECMAScript 语法扩展
它允许在JavaScript中直接写HTML代码,而不需要字符串拼接,甚至可以直接在HTML中使用JavaScript变量以及表达式,只需要使用大括号{}包裹即可。
从本质上讲,JSX 是 <code>React.createElement(type, config, ...children)</code> 函数的语法糖
Hello World<br>
<pre class="gatsby-code-jsx"><code>ReactDOM<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span>Hello<span class="token punctuation">,</span> world<span class="token operator">!</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span><span class="token punctuation">,</span>
document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'root'</span><span class="token punctuation">)</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
该代码在页面中渲染了一个 “Hello, world!” 标题
模块化思想
AMD规范
用define定义模块,require引入模块
CommonJS规范:运行时模块
用exports向外暴露模块,require引入模块
ECMAScript6模块规范:编译时模块/静态模块
用export向外暴露模块,import引入模块
JavaScript引擎运行机制
JavaScript是单线程语言
这是为了避免多个线程同时对同一个DOM进行操作
执行栈
主线程上执行的任务栈
任务队列
一个存放等待主线程执行的异步/定时任务的事件队列
任务分类<br>
同步任务
在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务
异步任务
不在主线程上,而是被存放在任务队列中的任务,当主线程上的任务执行完后才会开始被执行
宏任务(macro-task)
包括整体代码script、setTimeout、setInterval
微任务(micro-task)
包括Promise、process.nextTick(NodeJS中的)
Event loop(事件循环)<br>
主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)
执行顺序
同步任务在异步任务之前被执行,当主线程执行完同步任务后,会去任务队列里看是否有异步任务需要执行,如果有则取出来执行。
JSON
JavaScript Object Notation, JS 对象标记,即JavaScript对象的表示方法。<br>它是一种轻量级的数据交换格式,且浏览器天生支持,因此被广泛应用于网络数据传输。通常与Ajax技术一起使用
原生JavaScript API<br>
JSON.parse()函数将字符串转换成json对象
JSON.stringify()函数将json对象转成字符串
Ajax
异步JavaScript和XML(Asynchronous Javascript And XML)。通过与服务器进行少量数据交换,实现网页局部刷新
开发库<br>
jQuery
包括$.ajaxSetting、$.ajax、$.get、$.post等函数
axios
<ul><li>比jQuery轻量,当处理请求不多的时候,可以使用</li><li>基于Promise语法标准</li><li>支持nodejs</li><li>自动转换JSON数据</li></ul>
包括get、post、put、delete等函数
拦截器<br>
请求拦截
响应拦截
fetch API<br>
0 条评论
下一页