一、深入响应式原理
二、过渡效果
三、过渡状态
四、Render函数
五、自定义指令
六、混合
七、插件
八、单文件组件
九、生产环境
十二、单元测试(断言等,使用karma进行自动化测试)
十三、服务端渲染
一、深入响应式原理
1.1、如何追踪变化
通过watcher把组件渲染过程中的依赖纪录下来,当依赖项的setter被调用时,watcher重新计算,组件更新。setter被调用,是由于使用了object.defineProperty把属性转为了getter/setter,从而依赖项被操作时,相应转为调用getter/setter。
1.2、变化检测问题
Vue 不能检测到对象属性的添加或删除,由于实例时有转化过程,此时data的对象才能让它响应。新增响应式属性,需使用Vue.set(object, key, value)
1.3、声明响应式属性
1.4、异步更新队列
Vue 异步执行 DOM 更新,在同一事件中使用缓存去重,在下次的事件循环“tick”中,vue刷新队列并执行实际操作。在内部尝试对异步队列使用原生的 Promise.then
和 MutationObserver
,如果执行环境不支持,会采用setTimeout(fn, 0)
代替。在数据变化之后,立即使用Vue.nextTick(callback)回调。
二、过渡效果
过渡的几个酷炫库:
- 在 CSS 过渡和动画中自动应用 class
- 可以配合使用第三方 CSS 动画库,如 Animate.css
- 在过渡钩子函数中使用 JavaScript 直接操作 DOM
- 可以配合使用第三方 JavaScript 动画库,如 Velocity.js
2.1、单元素/组件的过渡
在下列情形中,可以给任何元素和组件添加 entering/leaving 过渡
- 条件渲染 (使用
v-if
)
- 条件展示 (使用
v-show
)
- 动态组件
- 组件根节点
运作:
元素封装成过渡组件之后,在遇到插入或删除时,Vue 将自动嗅探目标元素是否有 CSS 过渡或动画,并在合适时添加/删除 CSS 类名。如果过渡组件设置了过渡的 JavaScript 钩子函数,会在相应的阶段调用钩子函数。如果没有找到 JavaScript 钩子并且也没有检测到 CSS 过渡/动画,DOM 操作(插入/删除)在下一帧中立即执行。
a、过渡的css类名
v-enter: 定义进入过渡的开始状态。
v-enter-active: 定义进入过渡的结束状态。
v-leave: 定义离开过渡的开始状态
v-leave-active: 定义离开过渡的结束状态。
b、css动画
CSS 动画用法同 CSS 过渡,区别是在动画中 v-enter
类名在节点插入 DOM 后不会立即删除,而是在 animationend
事件触发时删除。
.bounce-enter-active {animation: bounce-in .5s;}
.bounce-leave-active {animation: bounce-out .5s;}
c、自定义过渡类名
如何了解动画是否结束?hity
d、同时使用animation与transition时,需要设置一个type特性,识别哪个动效时间更长。
e、javascript钩子:enter、leave分别有四个钩子
tips: 使用 JavaScript 过渡的元素时添加 v-bind:css="false"
,Vue 会跳过 CSS 的检测。
2.2、初始渲染的过渡:appear
2.3、多个元素的过渡(一次渲染多个节点)
tips:当有相同标签名的元素切换时,需要通过 key
特性设置唯一的值来标记以让 Vue 区分它们,否则 Vue 为了效率只会替换相同标签内部的内容。
过渡模式in-out, out-in
2.4、多个组件的过渡
<transition name="component-fade" mode="out-in">
<component v-bind:is="view"></component>
</transition>
2.5、列表过渡(v-for)使用transition-group
元素需指定唯一的key。
<transition-group name="list" tag="p">
<span v-for="item in items" v-bind:key="item" class="list-item">
{{ item }}
</span>
</transition-group>
a、列表位移过渡
v-move 可实现很厉害的效果(使用flip过渡方案)
b、列表的渐进过渡 通过data与javascript通信,实现列表的渐进过渡。
2.6、可复用的过渡
过渡可以通过 Vue 的组件系统实现复用。
2.7、动态过渡
在 Vue 中即使是过渡也是数据驱动的。使用v-bind来实现动态绑定。
三、过渡状态
3.1、状态动画与watcher
通过watcher来监听任何数值属性的数值更新,在watcher中增加动画。
3.2、动态状态转换
就像 Vue 的过渡组件一样,数据背后状态转换会实时更新,这对于原型设计十分有用。
3.3、通过组件组织过渡
四、Render函数
4.1、基础
提供javascript的完全编程能力,比template更接近编译器。可使得html代码更佳简洁~
4.2、createElement参数创建
约束:vnodes必须唯一
4.3、使用javascript代替模版功能
无论什么都可以使用原生的 JavaScript 来实现,Vue 的 render 函数不会提供专用的 API。
v-model 无法使用。
4.4、jsx
4.5、函数化组件
4.6、模版编译
五、自定义指令
简介:在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而,有的情况下,你仍然需要对纯 DOM 元素进行底层操作,这时候就会用到自定义指令。
分为全局和局部注册。
5.1、钩子函数
指令定义函数提供了几个钩子函数:
bind: 只调用一次,指令第一次绑定到元素时调用。
inserted: 被绑定元素插入父节点时调用。
update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 只调用一次, 指令与元素解绑时调用。
5.2、钩子函数参数
el: 指令所绑定的元素,可以用来直接操作 DOM 。
binding: 一个对象,包含以下属性:
name: 指令名,不包括 v- 前缀。
value: 指令的绑定值, 例如: v-my-directive="1 + 1", value 的值是 2。
oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。
expression: 绑定值的字符串形式。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。
arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 "foo"。
modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。
vnode: Vue 编译生成的虚拟节点,查阅 VNode API 了解更多详情。
oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
5.3、函数简写
5.4、对象字面量
<div v-demo="{ color: 'white', text: 'hello!' }"></div>
六、混合
混合是一种灵活的分布式复用 Vue 组件的方式。混合对象可以包含任意组件选项。以组件使用混合对象时,所有混合对象的选项将被混入该组件本身的选项。
6.1、选项合并
当组件和混合对象含有同名选项时,这些选项将以恰当的方式混合。另外,混合对象的 钩子将在组件自身钩子 之前 调用 。
值为对象的选项,将被混合为同一个对象。 两个对象键名冲突时,取组件对象的键值对。
6.2、全局混合
注意使用! 一旦使用全局混合对象,将会影响到 所有 之后创建的 Vue 实例。
6.3、自定义选项混合策略
自定义选项将使用默认策略,即简单地覆盖已有值。
七、插件
添加全局方法或者属性,如: vue-element
添加全局资源:指令/过滤器/过渡等,如 vue-touch
通过全局 mixin方法添加一些组件选项,如: vuex
添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现。
一个库,提供自己的 API,同时提供上面提到的一个或多个功能,如 vue-router
Vue.js 的插件应当有一个公开方法 install
。这个方法的第一个参数是 Vue
构造器 , 第二个参数是一个可选的选项对象:
MyPlugin.install =function (Vue, options){};
a、使用插件vue.use
Vue.use(MyPlugin, {someOption:true})
八、单文件组件
优点:* 完整语法高亮、* CommonJS 模块、* 组件化的 CSS
使用预处理器来构建简洁和功能更丰富的组件。
九、生产环境
9.1、删除警告
webpack的配置修改下,在生产环境能产生警告,线上环境无。
new webpack.optimize.UglifyJsPlugin({compress: {warnings: false}})
9.2、跟踪运行时错误
9.3、提取css
十二、单元测试(断言等,使用karma进行自动化测试)
十三、服务端渲染
优势:seo优化;客户端的网络比较慢,可减少请求;老客户端,不支持vue;
使用node脚本实现服务端渲染。
b、流式响应
c、组件缓存:
tips:不应该缓存组件包含子组件依赖全局状态(例如来自vuex的状态)。如果这么做,子组件(事实上是整个子树)也会被缓存。所以要特别注意带有slots片段或者子组件的情况。
- vue2.0读书笔记3 - router、vuex
1.vue的应用场景.优势.劣势 优势 通常情况下,运行时效率更高:一个事件循环仅一次视图更新,无频繁的DOM操作: 数据与视图分离,通过管理数据流,控制页面的展现,便于维护.且高效: 数据双向绑定, ...
- vue2.0读书笔记1-基础
一.概述 二.模版语法 三.计算属性 四.class与style绑定 五.条件渲染 六.列表渲染 七.事件处理器 八.表单控件绑定 九.组件 一.概述 在底层的实现上, Vue 将模板编译成虚 ...
- vue2.0学习笔记之路由(二)路由嵌套+动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue2.0学习笔记之路由(二)路由嵌套
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue2.0自学笔记
前言: 一.优点: 轻量级.高效率.上手快.简单易学.文档全面而简洁 二.功能: 1.模板渲染 2.模块化 3.扩展功能:路由.Ajax 三.课程包含: 1.Vue实例 2.Vue组件 3.Vue指令 ...
- Vue2.0学习笔记一 :各种表达式
#,过滤器 #,在Vue2.x中,过滤器只能在mustache绑定中使用,为了在指令帮定中实现同样的行为,你应该使用计算属性: #,过滤器可以串联 {{ message | filterA | ...
- 『TensorFlow』读书笔记_进阶卷积神经网络_分类cifar10_上
完整项目见:Github 完整项目中最终使用了ResNet进行分类,而卷积版本较本篇中结构为了提升训练效果也略有改动 本节主要介绍进阶的卷积神经网络设计相关,数据读入以及增强在下一节再与介绍 网络相关 ...
- <玩转Django2.0>读书笔记:表单
1. 表单字段 参考: 官方文档 Django表单字段汇总 2. 表单代码示例(forms.Form) # form.py代码 # 获取数据库数据 choices_list = [(i+1,v['ty ...
- <玩转Django2.0>读书笔记:模板和模型
1. 模板内置标签 Django常用内置标签 标签 描述 {% for %} 遍历输出变量的内容 {% if %} 对变量进行条件判断 {% csrf_token %} 生成csrf_token标签, ...
随机推荐
- PostgreSQL 区域设置
安装PostgreSQL 10.3 windows版本时区域请选择"default locale",安装成功后输入命令: show lc_ctype; show lc_collat ...
- “全栈2019”Java异常第十三章:访问异常堆栈跟踪信息
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- java修饰符顺序
Modifiers should be declared in the correct order (squid:ModifiersOrderCheck) Code smell Minor The J ...
- python 取出字典的键或者值/如何删除一个字典的键值对/如何遍历字典
先定义一个字典并直接进行初始化赋值 my_dict = dict(name="lowman", age=45, money=998, hourse=None) 1.取出该字典所有的 ...
- 【bash】今天你坑队友了吗
需求: 压缩日志并删除压缩过的文件 很日常的运维需求!!! 好,来看代码 echo 'start' quke.log rm -f quke.log echo 'delete' 不管是初级运维还是高级运 ...
- Maven镜像更换为阿里云中央仓库(精)
前言 maven仓库默认在国外,使用难免很慢,尤其是下载依赖的时候,换为国内镜像,让你感受飞一般的感觉.国内支持maven镜像的有阿里云,开源中国等,这里换为阿里云的. 更换 修改maven配置文件s ...
- 寻找第K大的数(快速排序的应用)
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数.给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在.测试样例:[1,3,5,2,2],5, ...
- URL中 # (hash)的含义
url中#(hash)的含义 hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分(从 # 号开始的部分) 1."#"代表网页中的一个位置.其右面的字符,就是该位置的 ...
- 【JS新手教程】浏览器弹出div层1
JS中,可以弹出一个层来进行提示等作用,方法是利用css样式display样式,当display等于none时,该元素就不会在页面显示出来,而且元素也不会占空间.就是用户触发某些事件时,动态修改该样式 ...
- Java switch函数
switch()函数中能放置的值为:byte,short,char,int,string,enum类型或者byte,short,char,int的包装类,其中,string类型是java7(含)之后才 ...