摘要:小程序自定義組件開發(fā)規(guī)范一個小程序組件由個文件組成,分別是,本規(guī)范只關(guān)注組件的,其它自行查看官方文檔。的變量可以分為以下種類型組件外部通過組件屬性的方式傳入內(nèi)部的數(shù)據(jù)。
小程序自定義組件開發(fā)規(guī)范
? 一個小程序組件由4個文件組成,分別是wxml、wxss、json、js,本規(guī)范只關(guān)注組件的js,其它自行查看官方文檔。
? 在自定義組件的 js 文件中,需要使用 Component() 來注冊組件,Component是一個構(gòu)造器,可用于定義組件,調(diào)用Component構(gòu)造器時可以指定組件的屬性、數(shù)據(jù)、方法等。
Component的變量可以分為以下2種類型:
properties:組件外部通過組件屬性的方式傳入內(nèi)部的數(shù)據(jù)。
可用于wxml渲染
不能做會修改數(shù)據(jù)的運算操作,如果必須要修改數(shù)據(jù),可以先把數(shù)據(jù)賦值給組件的data,例如:this.data.a = this.properties.a,再去做運算操作,有以下兩種情況:
如果this.properties.a的數(shù)據(jù)是基本數(shù)據(jù)類型,則直接賦值
如果this.properties.a的數(shù)據(jù)是引用數(shù)據(jù)類型,則需要深拷貝一個新的數(shù)據(jù)之后,再賦值
data:組件內(nèi)部聲明的數(shù)據(jù)
主要用于wxml渲染
可以做任何的運算符操作
Component的函數(shù)可以分為以下幾種類型:
life-cycle-function:組件生命周期函數(shù)
event-function:在組件的methods下自定義的事件響應(yīng)函數(shù),與wxml的事件綁定一一對應(yīng)
commen-function:在組件的methods下自定義的公共函數(shù),供life-cycle-function與event-function調(diào)用
request-function:在組件的methods下自定義的異步請求數(shù)據(jù)的函數(shù)
在實際的代碼中,我們利用注釋把變量和函數(shù)分為以上定義的幾種類型。
下面以小程序的語音消息組件為例:
文件路徑:components/voice-message
import { isCorrectVal } from "../../utils/index"; const app = getApp(); Component({ properties: { // work:作業(yè)的語音 comment:評論的語音 type: { type: String, value: "work" }, // 語音的地址 voiceUrl: { type: String, value: "" }, // 音頻的長度 voiceLength: { type: Number, value: 0 } }, data: { unsubscribe: function() {}, model: { loading: false, render: false, id: 0, voiceLength: 0, innerAudioContext: null, playing: false, trumpetStatus: [false, false, true], btnLength: "0" } }, /** * life-cycle-function * @description 初始化組件 */ attached: function() { this.data.unsubscribe = app.soundScheduler.subscribe( "beforePlay", () => { this.data.model.innerAudioContext.stop(); } ); if (!isCorrectVal(this.properties.voiceUrl)) { throw new Error("音頻地址錯誤"); } /* 計算音頻按鈕長度 */ let base = 40; // 10s內(nèi)基礎(chǔ)長度 let step = 20; // 每10s增加的長度 let stepNum = 0; let length = 40; // 按鈕初始長度 if (this.properties.type === "comment") { base = 30; step = 15; length = 30; } if (this.properties.voiceLength > 10) { stepNum = Math.ceil((this.properties.voiceLength - 10) / 10); } length = base + step * stepNum; this.setData({ "model.btnLength": length, "model.voiceLength": this.properties.voiceLength >= 2 ? this.properties.voiceLength : 2 }); this.data.model.innerAudioContext = wx.createInnerAudioContext(); this.data.model.innerAudioContext.obeyMuteSwitch = false; this.data.model.innerAudioContext.src = this.properties.voiceUrl; this.data.model.innerAudioContext.onPlay(() => { this.onPlay(); }); this.data.model.innerAudioContext.onStop(res => { this.onStop(); }); this.data.model.innerAudioContext.onEnded(res => { this.onStop(); }); this.data.model.innerAudioContext.onError(res => { this.onError(res); }); }, methods: { /** * event-function * @description 切換音頻播放狀態(tài)(播放/停止) */ togglePlay: function() { if (this.data.model.loading) return; if (this.data.model.playing) { this.data.model.innerAudioContext.stop(); } else { this.setData( { "model.loading": true }, () => { app.soundScheduler.dispatch("beforePlay"); app.videoContext.pause(); this.data.model.innerAudioContext.play(); setTimeout(() => { if (this.data.model.loading) { this.setData({ "model.loading": false }); } }, 3000); } ); } }, /** * common-function * @description 音頻開始播放觸發(fā)時的處理函數(shù) */ onPlay: function() { this.setData( { "model.loading": false }, () => { this.running(); } ); }, /** * common-function * @description 音頻停止播放或者播放結(jié)束時的處理函數(shù) */ onStop: function() { this.stop(); }, /** * common-function * @description 音頻播放錯誤時的處理函數(shù) */ onError: function(res) { console.log(res); this.setData( { "model.loading": false }, () => { this.stop(); } ); }, /** * common-function * @description 啟動音頻小喇叭動畫 */ running: function() { let vm = this; vm.data.model.playing = true; let num = 1; let idx = 1; let timer = null; function animation() { if (!vm.data.model.playing) { clearTimeout(timer); vm.setData({ "model.trumpetStatus": [false, false, true] }); return; } switch (idx) { case 1: vm.setData({ "model.trumpetStatus": [true, false, false] }); break; case 2: vm.setData({ "model.trumpetStatus": [false, true, false] }); break; case 3: vm.setData({ "model.trumpetStatus": [false, false, true] }); break; } ++idx; if (idx === 4) { idx = 1; } ++num; timer = setTimeout(animation, 600); } timer = setTimeout(animation, 600); }, /** * common-function * @description 停止音頻小喇叭動畫 */ stop: function() { this.data.model.playing = false; } }, /** * life-cycle-function * @description 卸載組件 */ detached: function() { this.data.model.innerAudioContext.stop(); this.data.unsubscribe(); }, });
如果你已經(jīng)看完了代碼,那么對這個組件的 代碼執(zhí)行過程 是否心里已經(jīng)有數(shù)?
這個組件的代碼執(zhí)行過程是這樣的:
1. 在生命周期鉤子函數(shù)attached中初始化組件 2. 組件掛載并渲染完成,到達(dá)可響應(yīng)用戶操作的狀態(tài)(這個步驟由小程序自動執(zhí)行,無需寫額外的代碼) 3. 響應(yīng)用戶操作 - 用戶點擊語音消息,如果語音沒在播放,則播放語音 - 用戶點擊語音消息,如果語音正在播放,則停止播放 4. 卸載組件
如果心里還沒數(shù),那把除了life-cycle-function和events-function的之外的代碼都忽略掉,再看看組件生命周期鉤子函數(shù)和用戶交互事件響應(yīng)函數(shù)的代碼與注釋呢?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108000.html
摘要:關(guān)于微信小程序之前只是聽說,并沒有引起我太大的興趣。剛好團(tuán)隊內(nèi)部有個需求需要微信小程序。暫時沒有上線經(jīng)歷,沒辦法給出這個時間微信小程序的代碼包大小當(dāng)前限制是。 關(guān)于微信小程序之前只是聽說,并沒有引起我太大的興趣。周一被小程序刷屏,然后就順手搜索了解了一下。發(fā)現(xiàn)小程序已經(jīng)火遍了整個程序員圈子。剛好團(tuán)隊內(nèi)部有個需求需要微信小程序。就緊急對微信小程序進(jìn)行了調(diào)研,閱讀過開發(fā)者文檔后總結(jié)了以下的...
摘要:背景由于有贊與微信密切的合作關(guān)系,我們第一時間就拿到了內(nèi)測賬號。春節(jié)前我們把它開源到了上,是希望幫助開發(fā)者尤其是有贊生態(tài)的開發(fā)者能夠更快更低門檻地開發(fā)出自己的微信小程序,同時希望和開發(fā)者們一起打造高顏值好用易擴展的小程序組件庫。 背景 由于有贊與微信密切的合作關(guān)系,我們第一時間就拿到了內(nèi)測賬號。17年1月9號,我們同時上線了有贊微商城小程序和有贊精選小程序(可以在微信-發(fā)現(xiàn)-小程序里搜...
摘要:傳統(tǒng)的網(wǎng)頁編程采用的三劍客來實現(xiàn),在微信小程序中同樣有三劍客。觀察者模式不難實現(xiàn),重點是如何在微信小程序中搭配其特有的生命周期來使用。交互事件傳統(tǒng)的事件傳遞類型有冒泡型與捕獲型,微信小程序中自然也有。 本文由作者鄒永勝授權(quán)網(wǎng)易云社區(qū)發(fā)布。 簡介為了更好的展示我們即時通訊SDK強悍的能力,網(wǎng)易云信IM SDK微信小程序DEMO的開發(fā)就提上了日程。用產(chǎn)品的話說就是: 云信 IM 小程序 S...
摘要:簡介前端發(fā)展迅速,開發(fā)者富有的創(chuàng)造力不斷的給前端生態(tài)注入新生命,各種庫框架工程化構(gòu)建工具層出不窮,眼花繚亂,不盲目追求前沿技術(shù),學(xué)習(xí)框架和庫在滿足自己開發(fā)需求的基礎(chǔ)上,然后最好可以對源碼進(jìn)行調(diào)研,了解和深入實現(xiàn)原理,從中可以獲得更多的收獲隨 showImg(https://segmentfault.com/img/remote/1460000016784101?w=936&h=397)...
閱讀 3518·2023-04-25 15:52
閱讀 588·2021-11-19 09:40
閱讀 2612·2021-09-26 09:47
閱讀 1034·2021-09-22 15:17
閱讀 3557·2021-08-13 13:25
閱讀 2232·2019-08-30 15:56
閱讀 3472·2019-08-30 13:56
閱讀 2111·2019-08-30 11:27