event
...
V-model
很多同学在理解 Vue 的时候都把 Vue 的数据响应原理理解为双向绑定,但实际上这是不准确的,我们 之前提到的数据响应,都是通过数据的改变去驱动 DOM 视图的变化,⽽双向绑定除了数据驱动 DOM 外, DOM 的变化反过来影响数据,是⼀个双向关系,在 Vue 中,我们可以通过 v-model 来实现双 向绑定。 v-model 即可以作⽤在普通表单元素上,⼜可以作⽤在组件上,它其实是⼀个语法糖,接下来我们 就来分析 v-model 的实现原理。
组件
总结
那么⾄此, v-model 的实现就分析完了,我们了解到它是 Vue 双向绑定的真正实现,但本质上就是 ⼀种语法糖,它即可以⽀持原⽣表单元素,也可以⽀持⾃定义组件。在组件的实现中,我们是可以配 置⼦组件接收的 prop 名称,以及派发的事件名称。
后续流程之前已介绍过,不再赘述,那么⾄此,作⽤域插槽的实现也就分析完毕。
总结
通过这⼀章的分析,我们了解了普通插槽和作⽤域插槽的实现。它们有⼀个很⼤的差别是数据作⽤ 域,普通插槽是在⽗组件编译和渲染阶段⽣成 vnodes ,所以数据的作⽤域是⽗组件实例,⼦组件渲 染的时候直接拿到这些渲染好的 vnodes 。⽽对于作⽤域插槽,⽗组件在编译和渲染阶段并不会直接 ⽣成 vnodes ,⽽是在⽗节点 vnode 的 data 中保留⼀个 scopedSlots 对象,存储着不同名称 的插槽以及它们对应的渲染函数,只有在编译和渲染⼦组件阶段才会执⾏这个渲染函数⽣成 vnodes ,由于是在⼦组件环境执⾏的,所以对应的数据作⽤域是⼦组件实例。 简单地说,两种插槽的⽬的都是让⼦组件 slot 占位符⽣成的内容由⽗组件来决定,但数据的作⽤域 会根据它们 vnodes 渲染时机不同⽽不同。
总结
那么⾄此, <keep-alive> 的实现原理就介绍完了,通过分析我们知道了 <keep-alive> 组件是⼀ 个抽象组件,它的实现通过⾃定义 render 函数并且利⽤了插槽,并且知道了 <keep-alive> 缓存 vnode ,了解组件包裹的⼦元素——也就是插槽是如何做更新的。且在 patch 过程中对于已缓存的 组件不会执⾏ mounted ,所以不会有⼀般的组件的⽣命周期函数但是⼜提供了 activated 和 deactivated 钩⼦函数。另外我们还知道了 <keep-alive> 的 props 除了 include 和 exclude 还有⽂档中没有提到的 max ,它能控制我们缓存的个数。
内置组件
总结
那么到此为⽌基本的 <transition> 过渡的实现分析完毕了,总结起来,Vue 的过渡实现分为以下⼏ 个步骤: 1. ⾃动嗅探⽬标元素是否应⽤了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名。 2. 如果过渡组件提供了 JavaScript 钩⼦函数,这些钩⼦函数将在恰当的时机被调⽤。 3. 如果没有找到 JavaScript 钩⼦并且也没有检测到 CSS 过渡/动画,DOM 操作 (插⼊/删除) 在下⼀帧 中⽴即执⾏。 所以真正执⾏动画的是我们写的 CSS 或者是 JavaScript 钩⼦函数,⽽ Vue 的 <transition> 只是帮我 们很好地管理了这些 CSS 的添加/删除,以及钩⼦函数的执⾏时机。
transition-group
render 函数