2021-08-23 小程序第四天

一姚糊、組件的創(chuàng)建與引用

1. 創(chuàng)建組件

① 在項(xiàng)目的根目錄中,鼠標(biāo)右鍵哪工,創(chuàng)建 components -> test 文件夾
② 在新建的 components -> test 文件夾上档痪,鼠標(biāo)右鍵,點(diǎn)擊 “新建 Component ”
③ 鍵入組件的名稱之后回車孽鸡,會(huì)自動(dòng)生成組件對(duì)應(yīng)的 4 個(gè)文件,后綴名分別為 .js 坡垫,.json 梭灿, .wxml和 .wxss
注意:為了保證目錄結(jié)構(gòu)的清晰画侣,建議把不同的組件冰悠,存放到單獨(dú)目錄中.

2. 全局引用組件

頁面的 .json 配置文件 中引用組件的方式,叫做“局部引用”配乱。

{ usingComponents:{ "自定義組件名":"組件路徑" } }

{
        "usingComponents": {
            "my-test1": "/components/test/test"
        }
    }
3. 全局引用組件

app.json 全局配置文件 中引用組件的方式溉卓,叫做“全局引用”

{
 "usingComponents": {
        "my-test2": "/components/test2/test2"
}
4. 組件和頁面的區(qū)別

從表面來看,組件和頁面都是由 .js 搬泥、.json 桑寨、.wxml 和 .wxss 這四個(gè)文件組成的。但是忿檩,組件和頁面的 .js 與.json 文件有明顯的不同:

(1)組件的 .json 文件中需要聲明 "component": true 屬性

(2)組件的 .js 文件中調(diào)用的是 Component() 函數(shù)
① 整個(gè)程序啟動(dòng)調(diào)用的是App()
② 某個(gè)頁面的渲染調(diào)用的是Page()
③ 某個(gè)組件的渲染調(diào)用的是Component()

(3)組件的事件處理函數(shù)需要定義到 methods 節(jié)點(diǎn)中

二尉尾、組件的樣式

1.組件樣式隔離

默認(rèn)情況下,自定義組件的樣式 只對(duì)當(dāng)前組件生效燥透,不會(huì)影響到組件之外的UI 結(jié)構(gòu)沙咏。(其他組件辨图、小程序頁面)

2.組件樣式隔離的注意點(diǎn)

① app.wxss 中的全局樣式對(duì)組件無效
② 只有 class 選擇器 會(huì)有樣式隔離效果,id 選擇器肢藐、屬性選擇器故河、標(biāo)簽選擇器不受樣式隔離的影響。

3.修改組件的樣式隔離選項(xiàng)

們希望在外界能夠控制組件內(nèi)部的樣式吆豹,此時(shí)鱼的,可以通過 styleIsolation 修改組件的樣式隔離選項(xiàng)。

(1) 在組件的.js 文件中新增加如下配置
Component({
    options: {
        // 默認(rèn)值isolated: 代表啟動(dòng)樣式隔離
        // apply-shared: 代表頁面wxss樣式將影響自定義組件
        // shared: 代表雙向的影響
        styleIsolation: 'isolated'
}
})

(2)或在組件的.json 文件中新增加如下配置
{
    "styleIsolation": "isolated"
}
捕獲.PNG

三痘煤、組件的數(shù)據(jù)凑阶、方法和屬性

1.data數(shù)據(jù)

在小程序組件中,用于組件模板渲染的私有數(shù)據(jù)衷快,需要定義到 data 節(jié)點(diǎn)中晌砾。

data: {
    n1: 0,
    n2: 5,
    sum: 0
  },
2. methods方法

在小程序組件中,事件處理函數(shù)自定義方法 需要定義到 methods 節(jié)點(diǎn)中烦磁。

methods: {
     // 點(diǎn)擊事件的處理函數(shù)
    addN1 () {}
    // 自定義方法: 建議和事件綁定區(qū)分開: 以 _開頭
    _toast () {}
  },
3.properties 屬性

在小程序組件中养匈,properties 是組件的對(duì)外屬性,用來 接收外界(父組件)傳遞到組件中的數(shù)據(jù)都伪。

Components({
    // 屬性定義
    properties: {
        // 完整定義 屬性的方式【當(dāng)需要指定屬性默認(rèn)值時(shí)呕乎,建議使用此方式】
        max: {
            // 屬性值的數(shù)據(jù)類型
            type: Number,
            // 屬性值的默認(rèn)值
            value: 10
        },
        // 簡化定義 屬性的方式
        max: Number
    }
})
<my-test1 max="10"></my-test1>
4.data 和 properties 的區(qū)別

① 本質(zhì)上,兩個(gè)屬性指向的是 同一個(gè)對(duì)象陨晶,也就是 data === properties猬仁。
② 習(xí)慣上,用data保存組件的私有數(shù)據(jù)先誉;properties保存父組件傳遞的數(shù)據(jù)湿刽。
③ 本身兩個(gè)屬性都是 可讀寫 的,但properties如果保存了父組件傳遞的數(shù)據(jù)褐耳,就不應(yīng)該直接在子組件內(nèi)修改诈闺。(vue中的單向數(shù)據(jù)流)

5. 修改 properties 的值

由于 data 數(shù)據(jù)和 properties 屬性在 本質(zhì)上沒有任何區(qū)別,因此 properties 屬性的值也可以用于頁面渲染铃芦,或使用 setData 為 properties 中的屬性重新賦值雅镊。

<view>max屬性的值為:{{max}}</view>
Component({
  properties: { max: Number},
  methods: {
    addCount() {
        // 使用 setData 修改屬性的值
        this.setData({
            max: this.properties.max + 1
        })
    }
  }
}

四、數(shù)據(jù)監(jiān)聽器

數(shù)據(jù)監(jiān)聽器用于監(jiān)聽和響應(yīng)任何屬性和數(shù)據(jù)字段的變化刃滓,從而執(zhí)行特定的操作仁烹。
它的作用類似于 vue 中的watch 偵聽器。

1.基本用法
Components({
    // observers: 觀察者
    observers: {
        '字段A咧虎, 字段B': function(字段A的新值卓缰, 字段B的新值) {
            //  do something
    }
}
2.監(jiān)聽對(duì)象屬性的變化

數(shù)據(jù)監(jiān)聽器支持監(jiān)聽對(duì)象中 單個(gè)或多個(gè)屬性 的變化,示例語法如下:
方式1: 普通方式

Components({
    // observers: 觀察者
    observers: {
        '對(duì)象.屬性A, 對(duì)象.屬性B': function(屬性A的新值征唬, 屬性B的新值) {
            // 觸發(fā)此偵聽器的 3 種情況:
            // 【為屬性A賦值】:使用setData 設(shè)置this.data.對(duì)象.屬性A 時(shí)觸發(fā)
            // 【為屬性B賦值】:使用setData 設(shè)置this.data.對(duì)象.屬性B 時(shí)觸發(fā)
            // 【為對(duì)象賦值】:使用setData 設(shè)置this.data.對(duì)象 時(shí)觸發(fā)
    }
})

方式2: 通配符方式, 監(jiān)聽對(duì)象中所有屬性的變化

observers: {
    //監(jiān)聽_rgb對(duì)象的所有屬性的變化
    '_rgb.**': function (obj) {
      this.setData({
        fullColor:`${obj.r}, ${obj.g}, ${obj.b}`
      })
    }
}

五震叮、純數(shù)據(jù)字段

1. 什么是純數(shù)據(jù)字段

(1)概念:純數(shù)據(jù)字段指的是那些 不用于界面渲染的 data 字段。
(2)應(yīng)用場景:例如有些情況下鳍鸵,某些 data 中的字段既不會(huì)展示在界面上苇瓣,也不會(huì)傳遞給其他組件,僅僅在當(dāng)前組件內(nèi)部使用偿乖。帶有這種特性的 data 字段適合被設(shè)置為純數(shù)據(jù)字段击罪。例如之前控制上拉加載更多的節(jié)流閥isLoading 這種類型的數(shù)據(jù).
(3)使用純數(shù)據(jù)的好處:純數(shù)據(jù)字段有助于提升頁面更新的性能。
因?yàn)樵谛〕绦蛑刑靶剑琩ata 中聲明的數(shù)據(jù)媳禁,會(huì)具備一個(gè)響應(yīng)式的效果,系統(tǒng)的底層會(huì)對(duì)數(shù)據(jù)進(jìn)行值變化的監(jiān)聽画切,如果竣稽,該數(shù)據(jù)只是純數(shù)據(jù),沒有必要進(jìn)行響應(yīng)式的監(jiān)聽霍弹,因此定義為純數(shù)據(jù)能夠提高頁面的性能.

2. 使用規(guī)則

在 Component 構(gòu)造器的 options 節(jié)點(diǎn)中毫别,指定 pureDataPattern 為一個(gè)正則表達(dá)式,字段名符合這個(gè)正則表達(dá)式的字段將會(huì)被視為純數(shù)據(jù)字段典格。

Component({
    options: {
        // 指定所有_開頭的數(shù)據(jù)字段為 純數(shù)據(jù)字段
        pureDataPattern: /^_/
    },
    data: {
        a: true,    // 普通數(shù)據(jù)字段
        _b: true    // 純數(shù)據(jù)字段
    }
})

六岛宦、組件的生命周期

1.小程序組件可用的全部生命周期如下表所示
捕獲.PNG

① 組件實(shí)例剛被創(chuàng)建好的時(shí)候,created 生命周期函數(shù)會(huì)被觸發(fā)

  • 此時(shí)調(diào)用 setData 不會(huì)有效果
  • 通常在這個(gè)生命周期函數(shù)中耍缴,只應(yīng)該用于給組件的 this 添加一些自定義的屬性字段

② 在組件完全初始化完畢砾肺、進(jìn)入頁面節(jié)點(diǎn)樹后, attached 生命周期函數(shù)會(huì)被觸發(fā)

  • 此時(shí)防嗡, this.data 已被初始化完畢变汪。
  • 這個(gè)生命周期很有用,絕大多數(shù)初始化的工作可以在這個(gè)時(shí)機(jī)進(jìn)行(例如發(fā)請(qǐng)求獲取初始數(shù)據(jù))

③ 在組件離開頁面節(jié)點(diǎn)樹后蚁趁, detached 生命周期函數(shù)會(huì)被觸發(fā)

  • 退出一個(gè)頁面時(shí)裙盾,會(huì)觸發(fā)頁面內(nèi)每個(gè)自定義組件的 detached 生命周期函數(shù)
  • 此時(shí)適合做一些清理性質(zhì)的工作,例如,清除定時(shí)器

④ 代表組件渲染完成的生命周期函數(shù)為ready

  • 可以操作頁面
2.lifetimes節(jié)點(diǎn)

在小程序組件中,生命周期函數(shù)可以直接定義在 Component 構(gòu)造器的 第一級(jí)參數(shù) 中荣德,也可以在 lifetimes 字段內(nèi)進(jìn)行聲明(這是推薦的方式闷煤,其優(yōu)先級(jí)最高)

Component({
    // 推薦用法
    lifetimes: {
        attached() {}, // 在組件實(shí)例進(jìn)入頁面節(jié)點(diǎn)樹時(shí)執(zhí)行
        detached() {}, // 在組建實(shí)例被從頁面節(jié)點(diǎn)樹移除時(shí)執(zhí)行
    }
})
3. 組件所在頁面的生命周期

有時(shí)童芹,自定義組件的行為依賴于頁面狀態(tài)的變化涮瞻,此時(shí)就需要用到組件所在頁面的生命周期。

捕獲.PNG

組件所在頁面的生命周期, 相當(dāng)于在組件中, 監(jiān)聽了組件所在頁面的一些事件假褪。

4.pageLifetimes節(jié)點(diǎn)

組件所在頁面的生命周期函數(shù)署咽,需要定義在 pageLifetimes 節(jié)點(diǎn)中。

Component({
    // 組件在頁面的生命周期函數(shù)在該節(jié)點(diǎn)定義
    pageLifetimes: {
        show () {}, // 頁面被展示
        hide () {}, // 頁面被隱藏
        resize () {}    // 頁面尺寸變化
    }
})

七、插槽

1.單個(gè)插槽(vue的匿名插槽)

① 子組件的模板中預(yù)留插槽占位符

<view class="wrapper">
    <view>這里是組件的內(nèi)部節(jié)點(diǎn)</view>
    <!-- 對(duì)于不確定的內(nèi)容宁否,可以使用<slot> 進(jìn)行占位窒升, 具體內(nèi)容由組件的使用者決定 -->
    <slot></slot>
</view>

② 父組件調(diào)用子組件時(shí),傳入自定義內(nèi)容

<component-tag-name>
    <!-- 這部分內(nèi)容將被放置在組件的 <slot>的位置上  -->
    <view>這里是插入到組件slot中的內(nèi)容</view>
</component-tag-name>
2. 啟用 多個(gè)插槽(vue的具名插槽)

① 首先慕匠,在 組件的 .js 文件 中饱须,添加如下配置,表示啟用多個(gè)插槽台谊。

Component({
    options: {
        multipleSolts: true // 在組件定義時(shí)的選項(xiàng)中啟用多 slot支持
    },
})

② 在子組件模板匯中蓉媳,預(yù)留 帶有名稱的插槽占位符

<view>
    <view>這是一段固定的文本內(nèi)容</view>
    <!-- name 為 before 的第一個(gè) 插槽 -->
    <slot name="before"></slot>
    <!-- name 為 after 的第一個(gè) 插槽 -->
    <slot name="after"></slot>
</view>

③ 父組件調(diào)用子組件時(shí),給標(biāo)簽添加 slot="插槽名"锅铅,指定將該標(biāo)簽渲染到哪個(gè)插槽酪呻。

<component-tag-name>
    <!-- 這部分內(nèi)容將被放置在組件的 <slot>的位置上  -->
    <view slot="before">這是通過插槽填充的內(nèi)容,name為before</view>
     <view slot="after">這是通過插槽填充的內(nèi)容,name為after</view>
</component-tag-name>

八、父子組件傳值

1. 父傳子--自定義屬性

① 父組件內(nèi)調(diào)用子組件時(shí)盐须,給子組件綁定自定義屬性玩荠,屬性值為 data 中的數(shù)據(jù)

data: {
    // 父組件中的data節(jié)點(diǎn)
    count: 0
}

// 在父組件的wxml結(jié)構(gòu)中調(diào)用子組件
<my-test3 count="{{count}}"></my-test3>

② 子組件的.js文件中贼邓,用 properties屬性 接收父組件傳遞的數(shù)據(jù)阶冈。

properties: {
    count: Number
}
2. 子傳父--自定義事件

① 父組件調(diào)用子組件時(shí),用 bind :自定義事件名稱="事件處理函數(shù)" 監(jiān)聽自定義事件塑径。

<my-test3  bind:sync="syncCount"></my-test3>

② 事件的處理函數(shù)定義在父組件的.js文件中眼溶,并用 event.detail 接收子組件傳遞的數(shù)據(jù)。

syncCount (event) {
        // 父組件通過事件對(duì)象 e 獲取到子組件傳遞的值
        console.log(event.detail.value)
}

③ 在子組件的.js文件中晓勇,用 this.triggerEvent("自定義事件名稱"堂飞,要傳遞的值)來觸發(fā)事件。

<button bindtap="addCount">+1</button>

// 子組件中的js代碼
methods: {
    addCount() {
        // 使用 this.triggerEvent去觸發(fā)父組件的自定義事件
        // 并將數(shù)值同步給父組件
        this.triggerEvent('sync', {value: this.properties.count})
}

注意: 父子傳值的 單項(xiàng)數(shù)據(jù)流绑咱。

3. 獲取組件實(shí)例(vue的ref)

① 調(diào)用子組件時(shí)绰筛,該子組件添加 id選擇器或類名選擇器

// 父組件的wxml文件中,調(diào)用子組件
<my-test class="cusstomA" id="cA" count="{{count}}" bind:sync="syncCount"

② 在父組件里調(diào)用 this.selectComponent("id或class選擇器") 描融,獲取子組件的實(shí)例對(duì)象铝噩,從而直接訪問子組件的任意數(shù)據(jù)和方法。

// 父組件的.js文件中窿克,獲取子組件實(shí)例
getChild() {
    // 切記下面的參數(shù)不能傳遞標(biāo)簽選擇器骏庸,不然返回的是null
    // 也可以傳遞ID選擇器
    const child = this.selectComponent('.customA')
    // 調(diào)用子組件的setData方法,修改count的值年叮,
    child.setData({ count: this.data.count + 1 })
}

九具被、behaviors(vue的mixins)

1. 什么是 behaviors

behaviors 是小程序中,用于實(shí)現(xiàn)組件間代碼共享的特性只损,類似于 Vue.js 中的 “mixins”一姿。

2. behaviors 的工作方式

① 每個(gè) behaviors 可以包含一組 屬性七咧、數(shù)據(jù)、生命周期函數(shù)和方法叮叹。組件引用它時(shí)艾栋,它的屬性、數(shù)據(jù)和方法會(huì)被合并到組件中蛉顽。
② 每個(gè)組件可以引用多個(gè) behaviors 蝗砾,behaviors 也可以引用其它 behaviors 。
behaviors 中

3. 創(chuàng)建 behaviors

調(diào)用 Behavior(Object object) 方法 即可創(chuàng)建一個(gè)共享的 behavior 實(shí)例對(duì)象携冤,供所有的組件使用遥诉。
① 在項(xiàng)目根目錄下創(chuàng)建一個(gè)文件夾 behaviors
② 新建js 文件 my-behavior.js
③ 在該文件中書寫以下代碼

// 調(diào)用 Behavior()方法, 創(chuàng)建實(shí)例對(duì)象噪叙,并導(dǎo)出
export default  Behavior({
    // 屬性節(jié)點(diǎn)
    properties: {},
    // 私有數(shù)據(jù)節(jié)點(diǎn)
    data: { 
        username: 'zs'
    },
    // 事件處理函數(shù)和自定義方法節(jié)點(diǎn)
    methods: {},
    // 其他節(jié)點(diǎn)...
})
4. 導(dǎo)入并調(diào)用混入對(duì)象

在組件.js文件導(dǎo)入混入對(duì)象矮锈,并在Component( )方法中添加 behaviors配置屬性,屬性值是一個(gè)數(shù)組睁蕾,直接寫入 混入對(duì)象名稱苞笨。

// 導(dǎo)入混入對(duì)象
import myBehavior from '../../behaviors/my-behavior'
Component({
   // 在組件內(nèi)部 與data節(jié)點(diǎn)平級(jí)的位置定義該屬性,掛載behavior模塊
  behaviors:[myBehavior]
}

注意:Behaviors 就僅僅只是做代碼的復(fù)用而已子眶,如果多個(gè)組件導(dǎo)入了同一種Behaviors瀑凝,他們的數(shù)據(jù)是相互獨(dú)立的。

5. behavior 中所有可用的節(jié)點(diǎn)
捕獲.PNG
6. 同名字段的覆蓋問題

盡量不要把混入對(duì)象的變量名臭杰、方法名和組件中的相同粤咪。
https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/behaviors.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市渴杆,隨后出現(xiàn)的幾起案子寥枝,更是在濱河造成了極大的恐慌,老刑警劉巖磁奖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囊拜,死亡現(xiàn)場離奇詭異,居然都是意外死亡比搭,警方通過查閱死者的電腦和手機(jī)冠跷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來身诺,“玉大人蜜托,你說我怎么就攤上這事∶股模” “怎么了橄务?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長同廉。 經(jīng)常有香客問我仪糖,道長柑司,這世上最難降的妖魔是什么迫肖? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任锅劝,我火速辦了婚禮,結(jié)果婚禮上蟆湖,老公的妹妹穿的比我還像新娘故爵。我一直安慰自己,他們只是感情好隅津,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布诬垂。 她就那樣靜靜地躺著,像睡著了一般伦仍。 火紅的嫁衣襯著肌膚如雪结窘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天充蓝,我揣著相機(jī)與錄音隧枫,去河邊找鬼。 笑死谓苟,一個(gè)胖子當(dāng)著我的面吹牛官脓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涝焙,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼卑笨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仑撞?” 一聲冷哼從身側(cè)響起赤兴,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隧哮,沒想到半個(gè)月后搀缠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡近迁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年艺普,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鉴竭。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歧譬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搏存,到底是詐尸還是另有隱情瑰步,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布璧眠,位于F島的核電站缩焦,受9級(jí)特大地震影響读虏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袁滥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一盖桥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧题翻,春花似錦揩徊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姜挺,卻和暖如春齿税,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炊豪。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工凌箕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溜在。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓陌知,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掖肋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仆葡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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