banner
阿珏酱

阿珏酱

いつもとは逆の電車に乗り、見たこともない風景を見に行く
twitter
github
facebook
bilibili
zhihu
steam_profiles
youtube

小程序架構

提示:當你看到這個提示的時候,說明當前的文章是由原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 標籤引入即可
這種方式既能達到快速切換頁面不閃,文件劃分又好管理。
這種方式是結合了前面兩種的失敗經驗所得,將其合二為一所誕生的。
由於最後項目並沒有全部寫,我就被叫去開發其他項目了,細節方面可能有所纰漏,後續如有新的進展的話,在做更新一波
image

網友評論:

image 凡人多煩事 1 年前 (2020-02-17)
微信小程序和 QQ 小程序,框架接口不一樣嗎?聽說微信小程序稍微修改一下,QQ 小程序就可以用

image 阿珏 1 年前 (2020-02-20)
@凡人多煩事:我這裡說的是架構,不是框架。好高深的樣子

image VPS234 主機測評 2 年前 (2019-09-11)
小程序開發這個和 Vue 很像的,感覺比較簡單 [#aru_1]

image 阿珏 2 年前 (2019-05-17)
新進展?不存在的,我都等一個多月了才發佈的

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。