Tips:當你看到這個提示的時候,說明當前的文章是由原emlog部落格系統搬遷至此的,文章釋出時間已過於久遠,編排和內容不一定完整,還請諒解`
小程式架構
日期:2019-5-17 阿珏 折騰程式碼 瀏覽:1708次 評論:4條
不知道大家們寫小程式是怎麼個寫法的,前幾個月在寫微信小程式,自己整的一種架構,或者叫框架
微信原生的架構是這樣子的
├── app.js ├── app.json ├── app.wxss ├── pages │ │── index │ │ ├── index.wxml │ │ ├── index.js │ │ ├── index.json │ │ └── index.wxss │ └── logs │ ├── logs.wxml │ └── logs.js └── utils
為什麼不用微信原生的寫法呢?
小程式就類似手機APP,都會有一個tabBar欄對吧,微信官方的tabBar欄是在app.json中進行的全域性配置。做一般的開發是沒有任何問題的,但涉及到一個複雜的tabBar欄時 ,使用官方原生的就無法實現,也無法動態載入,比如某影片app中間的拍照錄影功能
這意味著,我們不能使用官方給我們提供的tabBar欄,需要我們自個寫
最開始我的做法還是跟保持原生的結構,只是自己寫tabBar欄,所以頁面程式碼都寫在一個檔案中,預設顯示第一屏,其他的都隱藏起來,切換頁面的時候在把相應的頁面顯示,其他的隱藏起來,並且動態渲染資料上去。但是有個問題是,你要是小專案到沒啥大問題,但是如果是大專案程式碼量很龐大,都寫在一個檔案中,後期難以維護,所以這個方法最後被pass掉
再後來將切換頁面的方式改為跳轉(wx.switchTab等),把不同頁面的程式碼放到了不同的檔案,但是還有一個問題,切換也會閃,每次切換頁面就是等於重新開啟一個網頁一樣,tabBar都被重新渲染,所以會閃。pass
由此就有了現在的全新架構方式:
將/pages/index/下的檔案全部定義為入口檔案,js入口,css入口,檢視入口,不同頁面的檔案還是放到不同的位置去,為了好管理,新建了一個template的資料夾,用於放不同頁面間的程式碼,結構和官方的但頁面結構是一樣的
根目錄下的app.js用於存放全域性函式,其他頁面呼叫只需getApp()即可
js的入口檔案
const app = getApp(); var index_js = require("../../template/index/index.js"); var types_js = require("../../template/types/types.js"); var Global_Data = []; Page({ data: { active: 0, show: { index: true, types: false, course: false, user: false } },onLoad(options) { this.setData({ Global_Data: index_js.getData() }) }, // 底部nav切換 tabbar_onChange(event) { var key = ''; this.data.show = { index: false, types: false, course: false, user: false }; console.log(event) switch (event.detail) { case 0: key = 'index'; Global_Data = index_js.getData(); break; case 1: key = 'types'; Global_Data = types_js.getData() break; case 2: key = 'course'; Global_Data = index_js.getData(); break; case 3: key = 'user'; Global_Data = index_js.getData(); break; } this.data.show[key] = true; console.log(Global_Data) this.setData({ show: this.data.show, Global_Data: Global_Data }) },
});
wxml入口檔案
<!-- 入口檔案 --> <import src="/template/nav" /> <block wx:if="{{show.index }}"> <import src="/template/index/index" /> <template is="index" data="{{Global_Data}}" /> </block> <block wx:elif="{{show.types}}"> <import src="/template/types/types" /> <template is="types" data="{{Global_Data}}" /> </block> <block wx:elif="{{show.course}}"> <import src="/template/course/course" /> <template is="course" data="{{Global_Data}}" /> </block> <block wx:elif="{{show.user}}"> <import src="/template/user/user" /> <template is="user" data="{{Global_Data}}" /> </block> <template is="nav" data="{{active}}" /> <view style='height:50px;'></view>
css入口
@import "/template/user/user.wxss";.container {
height: 100vh;
background-color: #fff;
}.tag,
.button {
margin-right: 5px;
}.van-card__footer {
margin-top: 5px;
}
然後子頁面的程式碼結構
js
const app = getApp(); var index_data = { banner: [ '//img4.mukewang.com/szimg/5c4a74c009dea3b500000000.jpg', '//img2.mukewang.com/szimg/5c734d880939299918000600.jpg', '//img4.mukewang.com/szimg/5c63e89209f9f17d00000000.jpg' ], imageUrl: 'http://img1.sycdn.imooc.com/szimg/5c6bdb3e08e4674a06000338-360-202.jpg', tabs_active: 0 }; // app.alert('aa'); // 需要對外開放介面,否則無法呼叫到 module.exports = {//用於返回全域性資料 getData: function() { return index_data; }, myfunction: function (){ app.alert('aa'); } };
css和wxml照常寫即可,如果wxml要複用的地方繼續在當前目錄下分出公共部分,透過 template 標籤引入即可
這種方式既能達到快速切換頁面不閃,檔案劃分又好管理。
這種方式是結合了前面兩種的失敗經驗所得,將其合二為一所誕生的。
由於最後專案並沒有全部寫,我就被叫去開發其他專案了,細節方面可能有所紕漏,後續如有新的進展的話,在做更新一波
網友評論:
凡人多煩事 1年前 (2020-02-17)
微信小程式和QQ小程式,框架介面不一樣嗎?聽說微信小程式稍微修改一下,QQ小程式就可以用阿珏 1年前 (2020-02-20)
@凡人多煩事:我這裡說的是架構,不是框架。好高深的樣子
VPS234主機測評 2年前 (2019-09-11)
小程式開發這個和Vue很像的,感覺比較簡單[#aru_1]
阿珏 2年前 (2019-05-17)
新進展?不存在的,我都等一個多月了才釋出的