<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                >[success] # init 函數 1. `init` 函數接收一個包含模塊的數組并返回一個具有指定功能的 `patch` 函數(`patch`函數用來進行 **新老虛擬`dom`** 比較) 2. `init` 函數中大部分都是用來和`patch` 搭配的工具方法,拋開這部邏輯`init`通過收集**注冊模塊的鉤子函數** (`class /props /attributes/dataset /style/eventlisteners` )并在特定位置觸發對應模塊的鉤子 ![](https://img.kancloud.cn/99/21/9921831e73585784d79ae5e5eb8f2f9e_781x799.png) 注冊模塊,下面**eventListenersModule, styleModule** 模塊中都內置了鉤子,案例中也在對應Vnode 節點中增加了自己的鉤子`init`鉤子該鉤子是在`vnode 被添加`時候觸發 ~~~ import { init, eventListenersModule, styleModule, h } from 'snabbdom' // 2. 注冊模塊 let patch = init([styleModule, eventListenersModule]) // 3. 使用 h() 函數的第二個參數傳入模塊需要的數據(對象) let vnode = h( 'div', { hook: { init() { console.log(1111111111) // 執行后控制臺打印 }, }, }, [(h('span', '子節點'), 1, 23, 34)] ) let app = document.querySelector('#app') patch(app, vnode) ~~~ * 以class 模塊代碼內部注冊兩個鉤子 ![](https://img.kancloud.cn/92/0f/920f62c4e6c12b6a183032f6f45dd4bd_1533x649.png) * `init`函數注冊模塊鉤子部分的代碼,將這些模塊的鉤子函數按照`hooks`提供的進行分類最終構建的 cbs 對象的形式 `cbs = { create: [fn1, fn2], update: [], ...}`,將模塊中的鉤子統一注冊,注意這里注冊的只是模塊中的鉤子并不是我們`自定義Vnod`中的鉤子 ~~~ const hooks: (keyof Module)[] = ['create', 'update', 'remove', 'destroy', 'pre', 'post' ]; export function init(modules: Array < Partial < Module >> , domApi ? : DOMAPI) { let i: number, j: number, cbs = ({} as ModuleHooks); // 初始化轉換虛擬節點的 api const api: DOMAPI = domApi !== undefined ? domApi : htmlDomApi; // 把傳入的所有模塊的鉤子方法,統一存儲到 cbs 對象中 // 最終構建的 cbs 對象的形式 cbs = [ create: [fn1, fn2], update: [], ... ] for (i = 0; i < hooks.length; ++i) { // cbs['create'] = [] cbs[hooks[i]] = []; for (j = 0; j < modules.length; ++j) { // const hook = modules[0]['create'] const hook = modules[j][hooks[i]]; if (hook !== undefined) { (cbs[hooks[i]] as Array < any > ).push(hook); } } } ……………… return function patch(oldVnode: VNode | Element, vnode: VNode): VNode {} } ~~~ 3. `init` 的代碼片段,采用了閉包的方式,兩次調用patch,他們的配置都是**init 傳入的參數**,因為**閉包延長了參數的作用域鏈**可以讓后來的 **patch 都共享init**傳入的配置參數,這樣每次`patch` 調用的都是最初的`init`初始模塊 ~~~ const patch = init(['a', 'b', 'c']) patch() // [ 'a', 'b', 'c' ] patch() // [ 'a', 'b', 'c' ] ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看