day3

  1. 小程序的雙線程模型

    • 誰是小程序的宿主環(huán)境?微信客戶端
      • 宿主環(huán)境為了執(zhí)行小程序的各種文件:wxml文件融蹂、wxss文件、js文件
      • 提供了小程序的雙線程模型


        小程序雙線程模型.png
    • 雙線程模型
      • WXML模板和WXSS央視運(yùn)行于渲染層,渲染層使用WebView線程渲染(一個(gè)程序有多個(gè)頁面丽焊,會(huì)使用多個(gè)WebView的線程)掷倔。
      • JS腳本(app.js/home.js等)運(yùn)行有邏輯層眉孩,邏輯層使用JSCore運(yùn)行JS腳本。
      • 這兩個(gè)線程都會(huì)經(jīng)由微信客戶端(Native)進(jìn)行中轉(zhuǎn)交互勒葱。
  2. 界面渲染過程

  • 初始化渲染
    • wxml等價(jià)于一顆DOM樹浪汪,也可以使用一個(gè)JS對(duì)象來模擬(虛擬DOM)


      WXML和DOM樹.jpg
    • WXML可以先轉(zhuǎn)成JS對(duì)象,再渲染出真正的DOM樹


      初始化渲染.jpg
  • 數(shù)據(jù)發(fā)生變化
    • 通過setData把msg數(shù)據(jù)從“Hello World”變成“Goodbye”
      • 產(chǎn)生的JS對(duì)象對(duì)應(yīng)的節(jié)點(diǎn)就會(huì)發(fā)生變化
      • 此時(shí)可以對(duì)比前后兩個(gè)JS對(duì)象得到變化的部分
      • 然后把這個(gè)差異應(yīng)用到原來的DOM樹上
      • 從而達(dá)到更新UI的目的凛虽,這就是“數(shù)據(jù)驅(qū)動(dòng)”的原理
        數(shù)據(jù)改變.jpg
  • 界面渲染整體流程
    • 在渲染層死遭,宿主環(huán)境會(huì)把WXML轉(zhuǎn)化成對(duì)應(yīng)的JS對(duì)象
    • JS對(duì)象再次轉(zhuǎn)成真實(shí)DOM樹凯旋,交由渲染層線程渲染呀潭;
    • 數(shù)據(jù)變化時(shí),邏輯層提供最新的變化數(shù)據(jù)至非,JS對(duì)象發(fā)生變化比較進(jìn)行diff算法對(duì)比钠署;
    • 將最新變化的內(nèi)容反映到真實(shí)的DOM樹中,更新UI荒椭;
  1. 小程序的啟動(dòng)流程

    • 官方文檔
    • 每個(gè)小程序都需要在app.js中調(diào)用App方法注冊(cè)小程序?qū)嵗?/li>
    • 在注冊(cè)時(shí)谐鼎,可以綁定對(duì)應(yīng)的生命周期函數(shù),在生命周期函數(shù)中趣惠,執(zhí)行對(duì)應(yīng)的代碼


      小程序啟動(dòng)流程.jpg
  2. 事件-常見的事件類型

    • 什么時(shí)候會(huì)產(chǎn)生事件呢狸棍?
      • 小程序需要經(jīng)常和用戶進(jìn)行某種交互,比如點(diǎn)擊界面上的某個(gè)按鈕或者區(qū)域信卡,比如滑動(dòng)了某個(gè)區(qū)域隔缀,這些交互都會(huì)產(chǎn)生各種各樣的事件*;
    • 事件是如何處理的呢傍菇?
      • 事件是通過bind/catch這個(gè)屬性綁定在組件上的(和普通的屬性寫法很相似猾瘸,以key=“value”形式);
      • key以bind或catch開發(fā)丢习,從1.5.0版本開始牵触,可以在bind和catch后加上一個(gè)冒號(hào);
      • 同時(shí)在當(dāng)前頁面的Page構(gòu)造器中定義對(duì)應(yīng)的事件處理函數(shù)tapName咐低,如果沒有對(duì)應(yīng)的函數(shù)揽思,觸發(fā)事件時(shí)會(huì)報(bào)錯(cuò)
      • 當(dāng)用戶點(diǎn)擊該button區(qū)域時(shí),達(dá)到觸發(fā)條件生成事件tap见擦,該事件處理函數(shù)tapName會(huì)被執(zhí)行钉汗,同時(shí)還會(huì)收到一個(gè)事件對(duì)象event羹令。
    • 某些組件會(huì)有自己特性的事件類型,具體查看官方文檔
      • 比如input有bindinput/bindblur/bindfocus等
      • 比如scroll-view有bindscrolltowpper/bindscrolltolower等
      • Touchcancle:在某些特定場(chǎng)景下才會(huì)觸發(fā)(比如來電打斷等)
      • tap事件longpress事件通常只會(huì)觸發(fā)其中一個(gè)
  3. 組件化開發(fā)

    • 組件和頁面樣式細(xì)節(jié)


      組件樣式和頁面樣式.jpg

      頁面樣式課題三.jpg
    • 給組件傳遞數(shù)據(jù)和樣式


      組件間頁面通信.jpg

      頁面與組件之間傳遞數(shù)據(jù)使用properties


      向組件傳遞數(shù)據(jù)prop.jpg

      向組件傳遞樣式.jpg
      • 定義組件my-prop(my-prop.xml)

            <view class='title titleclass'>{{title}}</view>
            <view class='content'>我是組件的內(nèi)容</view>
        
      • 在my-prop.js中定義title的相關(guān)屬性

            Component({
                properties: {
                // title: String
                title: {
                    type: String,
                    value: '我是默認(rèn)的標(biāo)題',
                    observer: function(newVal, oldVal) {
                        console.log(newVal, oldVal)
                    }
                }
                },
                externalClasses: ['titleclass']
            })
        

        observer是記錄改變前后的值
        externalClasses讓外界給我們傳遞一個(gè)不一樣的樣式,在my-prop中引用之后损痰,頁面需要賦予titleclass一個(gè)樣式福侈,然后這個(gè)樣式需要在頁面的css中賦予屬性
        ```
        .red {
        color: red;
        }

          .green {
              color: green;
          }
        
          .blue {
              color: blue;
          }
        
      • 在頁面(home.xml)中引用組件my-prop,并定義title的內(nèi)容

            <!-- 3.給自定義組件傳遞數(shù)據(jù)/樣式 -->
            <my-prop title="哈哈哈" titleclass="red"/>
            <my-prop title="呵呵呵" titleclass="green"/>
            <my-prop titleclass="blue"/>
        

        頁面(home.xml)中title定義的“哈哈哈”“呵呵呵”會(huì)傳遞給組件my-prop.xml中{{title}}的插值表達(dá)式卢未,此時(shí)組件根據(jù)頁面定義的title展示對(duì)應(yīng)的“哈哈哈”“呵呵呵”

    • 組件向外傳遞事件-自定義事件
      • 示例:點(diǎn)擊組件中的按鈕改變頁面中的數(shù)據(jù)
      • 自定義組件(my-event.wxml)
            <button size='mini' bind:tap="handleIncrement">+1</button>
        
      • 通過triggerEvent發(fā)射事件肪凛,可以傳遞一個(gè)對(duì)象(my-event.js)注意:在頁面中寫方法直接寫,在組件中寫方法需要在methods中寫
            Component({
                methods: {
                    handleIncrement() {
                    // console.log('---------')
                    // 傳遞一個(gè)叫increment的事件辽社,傳遞參數(shù)數(shù)組
                    this.triggerEvent('increment', {name: 'why', age: 18}, {})
                }
            })
        
      • 在頁面(home.wxml)中引用組件并監(jiān)聽事件
            <!-- 4.組件內(nèi)部發(fā)出事件 -->
            <view>當(dāng)前計(jì)數(shù): {{counter}}</view>
            <my-event bind:increment="handleIncrement"/>
        
      • 在頁面的邏輯層(home.js)中定義handleIncrement事件,這里相當(dāng)于組件把事件發(fā)射給了頁面伟墙,此時(shí)這個(gè)事件就屬于頁面的邏輯,因此在頁面的邏輯層編寫滴铅。
            Page({
                data:{
                    counter:0,
                },
                handleIncrement(event) {
                    console.log('---------', event)
                    this.setData({
                        counter: this.data.counter + 1
                    })
                },
            })
        
組件向外傳遞事件.jpg
  • 獲取組件對(duì)象的方式

    • 在my-sel.wxml中定義一個(gè)組件
        <view>組件內(nèi)的計(jì)數(shù): {{counter}}</view>
    
    • 在home.wxml中引用組件my-sel戳葵,并定義一個(gè)按鈕綁定點(diǎn)擊事件
        <!-- 6.直接選中組件修改數(shù)據(jù)/調(diào)用方法 -->
        <button size='mini' bind:tap="handleIncrementCpn">修改組件內(nèi)的數(shù)據(jù)</button>
        <my-sel class="sel-class" id="sel-id"/>
    
    • 在home.js中獲取組件對(duì)象
          handleIncrementCpn() {
                  // 最終目的: 修改my-sel中的counter
                  // 1.獲取組件對(duì)象
                  const my_sel = this.selectComponent('.sel-class')
                  console.log(my_sel)
      
                  // 2.通過setData修改組件中的數(shù)據(jù)(不合理,不規(guī)范)
                  // my_sel.setData({
                  //   counter: my_sel.data.counter + 20
                  // })
      
                  // 3.通過調(diào)用my-sel.js暴露出來的方法對(duì)數(shù)據(jù)進(jìn)行修改
                  my_sel.incrementCounter(10)
            },
      
    • 在my-sel.js中定義方法給頁面調(diào)用
          methods: {
                  incrementCounter(num) {
                      this.setData({
                          counter: this.data.counter + num
                      })
                  }
              }
      
  • 插槽的使用


    什么是插槽.jpg

    單個(gè)插槽的使用.jpg

    多個(gè)插槽的使用.jpg
  • component構(gòu)造器


    component1.jpg

    component2.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末失息,一起剝皮案震驚了整個(gè)濱河市譬淳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盹兢,老刑警劉巖邻梆,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绎秒,居然都是意外死亡浦妄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門见芹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剂娄,“玉大人,你說我怎么就攤上這事玄呛≡呐常” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵徘铝,是天一觀的道長(zhǎng)耳胎。 經(jīng)常有香客問我,道長(zhǎng)惕它,這世上最難降的妖魔是什么怕午? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮淹魄,結(jié)果婚禮上郁惜,老公的妹妹穿的比我還像新娘。我一直安慰自己甲锡,他們只是感情好兆蕉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布羽戒。 她就那樣靜靜地躺著,像睡著了一般恨樟。 火紅的嫁衣襯著肌膚如雪半醉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天劝术,我揣著相機(jī)與錄音,去河邊找鬼呆奕。 笑死养晋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梁钾。 我是一名探鬼主播绳泉,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼姆泻!你這毒婦竟也來了零酪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤拇勃,失蹤者是張志新(化名)和其女友劉穎四苇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體方咆,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡月腋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓣赂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榆骚。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖煌集,靈堂內(nèi)的尸體忽然破棺而出妓肢,到底是詐尸還是另有隱情,我是刑警寧澤苫纤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布碉钠,位于F島的核電站,受9級(jí)特大地震影響方面,放射性物質(zhì)發(fā)生泄漏放钦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一恭金、第九天 我趴在偏房一處隱蔽的房頂上張望操禀。 院中可真熱鬧,春花似錦横腿、人聲如沸颓屑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揪惦。三九已至遍搞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間器腋,已是汗流浹背溪猿。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纫塌,地道東北人诊县。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像措左,于是被迫代替她去往敵國和親依痊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • React.js - 第3天 0. 安裝 React Developer Tools 調(diào)試工具 React Dev...
    達(dá)魔學(xué)院閱讀 330評(píng)論 0 0
  • Vue.js - Day3 定義Vue組件 什么是組件: 組件的出現(xiàn)怎披,就是為了拆分Vue實(shí)例的代碼量的胸嘁,能夠讓我們...
    磚工閱讀 335評(píng)論 0 0
  • 昨天講到整個(gè)微信小程序的大框架。今天來深入探究一波凉逛。具體每個(gè)頁面由什么組成呢性宏?怎么運(yùn)行起來的呢?(本期有前端基礎(chǔ)的...
    Yinvoker閱讀 638評(píng)論 0 7
  • Vue.js - Day3 定義Vue組件 什么是組件: 組件的出現(xiàn)鱼炒,就是為了拆分Vue實(shí)例的代碼量的衔沼,能夠讓我們...
    cf6d95617c55閱讀 181評(píng)論 0 0
  • 導(dǎo)語 在日益完善的中國,安防監(jiān)控實(shí)屬起到不小的作用昔瞧,從平安城市到智慧城市指蚁,再到與老百姓息息相關(guān)的餐飲——明廚亮罩工...
    今日共勉閱讀 87評(píng)論 0 1