微信小程序開發(fā)基礎(chǔ)

目錄結(jié)構(gòu)

小程序默認的目錄結(jié)構(gòu)如下圖:

  • pages 頁面文件夾
  • index 首頁
  • logs 日志頁
  • utils 工具
  • app.js 項目入口(類似main.m)
  • app.json 全局配置
  • app.wxss 全局樣式
  • project.config.json 項目配置(類似info.plist)
  • sitemap.json 配置小程序及其頁面是否允許被微信索引
  • .gitignore git管理的文件忽略

小程序文件結(jié)構(gòu)和傳統(tǒng)web對比

結(jié)構(gòu) 傳統(tǒng)web 微信小程序
結(jié)構(gòu) html wxml
樣式 css wxss
邏輯 javascript javascript
配置 json

app.json

app.json中,pages字段用于配置小程序中所有需要集成的頁面香到,第一條數(shù)據(jù)頁面是小程序的首頁日矫,當新增一條數(shù)據(jù)時送粱,小程序IDE會自動生成對應(yīng)的頁面文件。
window字段用于配置window的一些屬性掏熬,比如顏色,標題,是否支持下拉刷新等隘膘。
tarbar用于配置tarbar相關(guān)的屬性,比如顏色缚窿,標題棘幸,圖標,位置等倦零。

頁面.json

可單獨為特定頁面配置屬性误续,若不配置則默認采用app.json文件中window的屬性值吨悍。
usingComponents聲明需要使用的自定義組件。
component是否為組件蹋嵌,Bool類型育瓜。

siteMap.json

頁面.js

調(diào)用Page方法管理頁面的生命周期≡岳茫可以在data中添加自定義屬性躏仇。

Page({

    /**
     * 頁面的初始數(shù)據(jù)
     */
    data: {
        msg: "hello world",
        num: 10000,
        isOn: false,
        person: {
            age: 30,
            name: "小王"
        },
        persons:[
            {
                id: 0,
                name: "小王"
            },
            {
                id: 1,
                name: "小張"
            },
            {
                id: 2,
                name: "小李"
            }
        ]
    },

    /**
     * 生命周期函數(shù)--監(jiān)聽頁面加載
     */
    onLoad: function (options) {

    },

    /**
     * 生命周期函數(shù)--監(jiān)聽頁面初次渲染完成
     */
    onReady: function () {

    },

    /**
     * 生命周期函數(shù)--監(jiān)聽頁面顯示
     */
    onShow: function () {

    },

    /**
     * 生命周期函數(shù)--監(jiān)聽頁面隱藏
     */
    onHide: function () {

    },

    /**
     * 生命周期函數(shù)--監(jiān)聽頁面卸載
     */
    onUnload: function () {

    },

    /**
     * 頁面相關(guān)事件處理函數(shù)--監(jiān)聽用戶下拉動作
     */
    onPullDownRefresh: function () {

    },

    /**
     * 頁面上拉觸底事件的處理函數(shù)
     */
    onReachBottom: function () {

    },

    /**
     * 用戶點擊右上角分享
     */
    onShareAppMessage: function () {

    }
})

頁面.wxml

wxml標簽 html標簽 描述
text span 行內(nèi)元素(不會換行)
view div 塊級元素(會換行)

訪問js文件定義的屬性:

<view>{{msg}}</view>
<view>{{person.name}}</view>

標簽屬性中使用js文件定義的屬性:

<view data-person="{{person}}">person</view>
<checkbox checked="{{isOn}}">選擇框</checkbox>

可以在{{}}中加入表達式(運算)

<view>{{1+2}}</view>
<!-- 3 -->
<view>{{'1'+'2'}}</view>
<!-- 12 -->
數(shù)組循環(huán)/對象循環(huán) 渲染
<view 
wx:for="{{persons}}"
wx:for-item="item"
wx:for-index="index"
wx:key="*this">
{{index}} {{item.name}}
</view>

wx:for-item="item"wx:for-index="index"是循環(huán)項和循環(huán)索引的默認值,可以不寫腺办,也可以手動改變名稱焰手。wx:key是用于提高渲染性能的唯一key,普通數(shù)組傳"*this"怀喉。

<view 
wx:for="{{person}}"
wx:for-item="value"
wx:for-index="key"
class="my_class">
{{key}} {{value}}
</view>

對象循環(huán)一般會重名為valuekey书妻,這樣更符合語義。

block

block是個占位符標簽躬拢,頁面渲染時躲履,小程序會將其移除。

上面的代碼最終效果如下:

<view class="my_class">
age 30
</view>
<view class="my_class">
name 小王
</view>

如果將<view>改成<block>聊闯,則會忽略標簽工猜。

age 30
name 小王
條件渲染

控制標簽顯示/隱藏兩種方式:
方式1:wx:if
直接將標簽從頁面結(jié)構(gòu)移除。

<view wx:if="{{true}}">1</view>
<view wx:elif="{{true}}">2</view>
<view wx:else="{{true}}">3</view>

方式2:hidden
只是控制標簽的顯示與隱藏菱蔬。對于頻繁切換顯示隱藏狀態(tài)的標簽篷帅,這種方式性能更好。

<view hidden="{{true}}">4</view>

兩種方式最終效果如下拴泌,可以看到wx:if的未顯示標簽直接被移除了犹褒,而hidden只是設(shè)置了樣式view[hidden] { display: none; }

<view>1</view>
<view>4</view>

style樣式分別如下:
view {
    display: block;
}
view[hidden] {
    display: none;
}
事件綁定

微信小程序js中不能通過this.data.num = value;的方式來設(shè)置num的值弛针,而需要通過設(shè)置data對象來實現(xiàn)叠骑。

// pages/demo2/demo2.js
Page({
    data: {
        num: 100
    },
    handleInput(e) { // e事件源對象
        var value = e.detail.value;
        console.log(value);
        this.setData({
            num: value
        })
    },
    handleTap(e) {
        console.log(e);
        const change = e.currentTarget.dataset.change
        this.setData({
            num: this.data.num+change
        })
    }
})

通過自定義屬性change來傳遞值變化量。

<!--pages/demo2/demo2.wxml-->
<input type="text" bindinput="handleInput" />
<button bindtap="handleTap" data-change="{{1}}">+</button>
<button bindtap="handleTap" data-change="{{-1}}">-</button>
<view>{{num}}</view>

頁面.wxss

在web開發(fā)中削茁,需要通過link標簽引入css樣式文件宙枷,但小程序中不需要,會自動根據(jù)同名稱文件引入茧跋。
rpx(responsive pixel): 可以根據(jù)屏幕寬度進行自適應(yīng)慰丛。規(guī)定屏幕寬為750rpx。也可以通過100%或者100vw指定比例瘾杭。
calc() 函數(shù)允許我們在屬性值中執(zhí)行數(shù)學計算操作诅病。
@import 導入外聯(lián)樣式表,只支持相對路徑。

/* pages/demo2/demo2.wxss */
@import "../../styles/common.wxss";

view{
    width: calc(750rpx * 100 / 375);
    height: 200rpx;
    font-size: 40px;
    background-color: bisque;
}

小程序自帶組件

https://developers.weixin.qq.com/miniprogram/dev/component/native-component.html

自定義組件

以下是自定義Tabs組件的一個例子贤笆。

properties屬性可以通過外部訪問蝇棉。

// pages/demo1/Tabs.js
Component({
    /**
     * 組件的屬性列表
     */
    properties: {
        tabs:{
            type:Array,
            value:[]
        }
    },

    /**
     * 組件的初始數(shù)據(jù)
     */
    data: {
    },

    /**
     * 組件的方法列表
     */
    methods: {
        handleItemTap(e){
            const {index} = e.currentTarget.dataset;
            // 子組件向父發(fā)送自定義事件
            this.triggerEvent("itemChange", {index})
        }
    }
})

Tabs.json文件:

{
    "component": true,
    "usingComponents": {}
}

slot標簽是占位標簽,slot是插槽的意思芥永〈垡螅可以通過Shift+Alt/Option+F快捷鍵對代碼進行格式化。

<!--pages/demo1/test.wxml-->
<view class="tabs">
    <view class="tabs_title">
        <view class="title_item {{item.isActive?'active':''}}" wx:for="{{tabs}}" wx:key="id" bindtap="handleItemTap"
            data-index="{{index}}">
            {{item.name}}
        </view>
    </view>
    <slot></slot>
</view>

wxss中view.xx可以省略view埋涧,簡寫為.xx板辽。

view.tabs_title{
    display: flex;
}
view.title_item{
    flex: 1;
    display: flex;
    justify-content: center;
    align-items: center;
}
.active{
    color: red;
    border-bottom: 10rpx solid currentColor;
}

使用Tabs組件。

// pages/demo1/demo1.js
Page({
    /**
     * 頁面的初始數(shù)據(jù)
     */
    data: {
        tabs:[
            {
                id:0,
                name:"首頁",
                isActive:true
            },
            {
                id:1,
                name:"分類",
                isActive:false
            },
            {
                id:2,
                name:"我的",
                isActive:false
            }
        ]
    },

    handleItemChange(e){
        const {index} = e.detail;
        // let {tabs} = this.data;
        // let tabs = this.data.tabs;
        let tabs = JSON.parse(JSON.stringify(this.data.tabs))
        tabs.forEach((v,i)=>i===index?v.isActive=true:v.isActive=false);
        this.setData({
            tabs
        })
    },

    /**
     * 生命周期函數(shù)--監(jiān)聽頁面加載
     */
    onLoad: function (options) {

    },

    /**
     * 生命周期函數(shù)--監(jiān)聽頁面初次渲染完成
     */
    onReady: function () {

    },

    /**
     * 生命周期函數(shù)--監(jiān)聽頁面顯示
     */
    onShow: function () {

    },

    /**
     * 生命周期函數(shù)--監(jiān)聽頁面隱藏
     */
    onHide: function () {

    },

    /**
     * 生命周期函數(shù)--監(jiān)聽頁面卸載
     */
    onUnload: function () {

    },

    /**
     * 頁面相關(guān)事件處理函數(shù)--監(jiān)聽用戶下拉動作
     */
    onPullDownRefresh: function () {

    },

    /**
     * 頁面上拉觸底事件的處理函數(shù)
     */
    onReachBottom: function () {

    },

    /**
     * 用戶點擊右上角分享
     */
    onShareAppMessage: function () {

    }
})

demo1.json中配置使用到的組件棘催。

{
  "usingComponents": {
    "Tabs": "Tabs"
  }
}

view標簽將會替換Tabs組件中的slot標簽劲弦。

<!--pages/demo1/demo1.wxml-->
<Tabs tabs="{{tabs}}" binditemChange="handleItemChange" >
<view>內(nèi)容,替換slot標簽</view>
</Tabs>

組件js文件各定義段如下圖:

應(yīng)用生命周期

// app.js
App({
  // 第一次啟動觸發(fā)事件醇坝,類似iOS中的didFinishLaunchingWithOptions
  onLaunch(){
    console.log("onLaunch");
  },
  // 小程序被看到瓶您,類似iOS中applicationWillEnterForeground
  // 但iOS中首次啟動顯示不會觸發(fā),小程序會觸發(fā)
  onShow(){
    console.log("onShow");
  },
  // 小程序隱藏纲仍,類似iOS中的applicationDidEnterBackground
  onHide(){
    console.log("onHide");
  },
  // 小程序代碼發(fā)送報錯觸發(fā),常用于收集錯誤信息贸毕,并發(fā)送給后臺
  onError(err){
    
  },
  // 應(yīng)用找不到啟動時候的入口頁面觸發(fā)
  onPageNotFound(){
    wx.navigateTo({
      url: '/pages/demo2/demo2',
    })
  }
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末郑叠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子明棍,更是在濱河造成了極大的恐慌乡革,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摊腋,死亡現(xiàn)場離奇詭異沸版,居然都是意外死亡,警方通過查閱死者的電腦和手機兴蒸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門视粮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人橙凳,你說我怎么就攤上這事蕾殴。” “怎么了岛啸?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵钓觉,是天一觀的道長。 經(jīng)常有香客問我坚踩,道長荡灾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮批幌,結(jié)果婚禮上础锐,老公的妹妹穿的比我還像新娘。我一直安慰自己逼裆,他們只是感情好郁稍,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胜宇,像睡著了一般耀怜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桐愉,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天财破,我揣著相機與錄音,去河邊找鬼从诲。 笑死左痢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的系洛。 我是一名探鬼主播俊性,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼描扯!你這毒婦竟也來了定页?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绽诚,失蹤者是張志新(化名)和其女友劉穎典徊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恩够,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡卒落,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜂桶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儡毕。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扑媚,靈堂內(nèi)的尸體忽然破棺而出妥曲,到底是詐尸還是另有隱情,我是刑警寧澤钦购,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布檐盟,位于F島的核電站,受9級特大地震影響押桃,放射性物質(zhì)發(fā)生泄漏葵萎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羡忘。 院中可真熱鬧谎痢,春花似錦、人聲如沸卷雕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漫雕。三九已至滨嘱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浸间,已是汗流浹背太雨。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魁蒜,地道東北人囊扳。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像兜看,于是被迫代替她去往敵國和親锥咸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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