结构
全局变量BPC
是用户的入口,主要用到的是render
方法。
库内部除去BPC
入口,主要分为2种类component
和plugin
。
Component 组件
大部分具备DOM结构的,需要JS参与的UI都将作为组件存在。
通常,组件主要结构是有作为依托的$template
,作为呈现的$wrapper
。
以select
为例,原始html为:
<select class="bpc-select">
<option value="1">China</option>
<option value="2">USA</option>
<option value="3">Japan</option>
<option value="4">France</option>
</select>
当库监测到bpc-select
这个类时,将生成SelectComponent
并触发render
函数:
- 将原始的DOM作为
$template
。 - 使用组件的
wrapperTamplate
生成$wrapper
。 - 将
$template
包裹在$wrapper
中的.bpc-origin
中。 - 将
$wrapper
替换$template
。
最后,上面的html经过渲染会变成:
<span class="bpcr-select-wrapper">
<div class="bpc-origin">
<select class="bpc-select" bpc-rendered="">
<option value="1" selected>A</option>
<option value="2">B</option>
<option value="3">C</option>
<option value="4">D</option>
</select>
</div>
<span class="bpcr-select-value"><span>B</span><i class="iconfont icon-down"></i></span>
<div class="bpcr-select-drop">
<div class="bpcr-select-option selected" bpc-value="1">A</div>
<div class="bpcr-select-option" bpc-value="2">B</div>
<div class="bpcr-select-option" bpc-value="3" disabled="">C</div>
<div class="bpcr-select-option" bpc-value="4">D</div>
</div>
</span>
Plugin 插件
有一些功能,不依赖DOM来产生,例如tooltip
,这部分以插件的形式存在,即我们需要的不是DOM,而是附着在DOM上的某些属性产生的副作用。
每个插件都拥有两个方法init
和componentRendered
。跟组件不同的是,页面上每一个UI被渲染,就将实例化一个组件。而插件在初始化之后永远只有一个。
init
函数在BPC
第一次调用render
时被调用一次。以TooltipPlugin
为例,在init
时在全局绑定了一些函数,当拥有bpc-tooltip
属性的元素被hover时,将调用函数。
componentRendered
函数将在BPC
每一次实例化一个组件时,传入这个函数,用来做后续处理。在bpc-tooltip
中,这类复杂组件若有$template
,则将被去除bpc-tooltip
(因为template被隐藏了,无需触发)。