微信小程序入門到實戰(1)-基礎知識


 1.微信小程序介紹

微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。

1.1. 為什么是微信小程序 ?

  1. 微信有海量用戶,而且粘性很高,在微信里開發產品更容易觸達用戶;

  2. 推廣app 或公眾號的成本太高。

  3. 開發適配成本低。

  4. 容易小規模試錯,然后快速迭代。

  5. 跨平台。

 

1.2. 微信小程序歷史

  • 2016年1月11日,微信之父張小龍時隔多年的公開亮相,解讀了微信的四大價值觀。張小龍指出,越來越多產品通過公眾號來做,因為這里開發、獲取用戶和傳播成本更低。拆分出來的服務號並沒有提供更好的服務,所以微信內部正在研究新的形態,叫「微信小程序」 需要注意的是,之前是叫做 應用號

  • 2016年9月21日,微信小程序正式開啟內測。在微信生態下,觸手可及、用完即走的微信小程序引起廣泛關注。騰訊雲正式上線微信小程序解決方案,提供小程序在雲端服務器的技術方案。

  • 2017年1月9日,微信推出的“小程序”正式上線。“小程序”是一種無需安裝,即可使用的手機“應用”。不需要像往常一樣下載App,用戶在微信中“用完即走”。

 

1.3. 瘋狂的微信小程序

  1. 微信月活已經達到10.82億。其中55歲以上的用戶也達到6300萬

  2. 信息傳達數達到450億,較去年增長18%;視頻通話4.1億次,增長100%

  3. 小程序覆蓋超過200+行業,交易額增長超過6倍,服務1000億+人次,創造出了5000億+的商業價值

 

1.4. 還有其他的小程序 不容忽視

  1. 支付寶小程序

  2. 百度小程序

  3. QQ小程序

  4. 今日頭條 + 抖音小程序

 

1.5. 體驗

1.5.1. 官方微信小程序體驗

小程序示例源碼

 

1.5.2. 其他優秀的第三方小程序
  • 拼多多

  • 滴滴出行

  • 歡樂斗地主

  • 智行火車票

  • 唯品會

  • 。。。

 

2. 環境准備

開發微信小程序之前,必須要准備好相應的環境

2.1. 注冊賬號

建議使用全新的郵箱,沒有注冊過其他小程序或者公眾號的。

訪問注冊頁面,耐心完成注冊即可。

2.2. 獲取APPID

由於后期調用微信小程序的接口等功能,需要索取開發者的小程序中的APPID,所以在注冊成功后,可登錄,然后獲取APPID。

登錄,成功后可看到如下界面

然后復制你的APPID,悄悄的保存起來,不要給別人看到。

 

2.3. 開發工具

下載地址

微信小程序自帶開發者工具,集 開發 預覽 調試 發布 於一身的 完整環境。

但是由於編碼的體驗不算好,因此 建議使用 vs code + 微信小程序編輯工具 來實現編碼

vs code 負責敲代碼,微信編輯工具 負責預覽。

 

3. 第一個微信小程序

3.1. 打開微信開發者工具

注意 第一次登錄的時候 需要掃碼登錄

3.2. 新建小程序項目

3.3. 填寫項目信息

3.4. 成功

 

4. 微信開發者工具介紹

詳細的使用,可以查看官網

 

5. 小程序結構目錄

小程序框架的目標是通過盡可能簡單、高效的方式讓開發者可以在微信中開發具有原生 APP 體驗的服務。

小程序框架提供了自己的視圖層描述語言 WXMLWXSS,以及 JavaScript,並在視圖層與邏輯層間提供了數據傳輸和事件系統,讓開發者能夠專注於數據與邏輯。

5.1. 小程序文件結構和傳統web對比

 

通過以上對比得出,傳統web 是三層結構。而微信小程序 是四層結構,多了一層 配置.json

5.2. 基本的項目目錄

 

6. 小程序配置文件

一個小程序應用程序會包括最基本的兩種配置文件。一種是全局的 app.json 和 頁面自己的 page.json

 注意:配置文件中不能出現注釋。

6.1. 全局配置 app.json

app.json 是當前小程序的全局配置,包括了小程序的所有頁面路徑、界面表現、網絡超時時間、底部 tab 等。普通快速啟動項目里邊的 app.json 配置。

{
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle":"black"
  }
}

字段的含義

  1. pages字段 —— 用於描述當前小程序所有頁面路徑,這是為了讓微信客戶端知道當前你的小程序頁面定義在哪個目錄。

  2. window字段 —— 定義小程序所有頁面的頂部背景顏色,文字顏色定義等。

  3. 完整的配置信息請參考 app.json配置

6.1.1. tabbar

6.2. 頁面配置 page.json

這里的 page.json 其實用來表示頁面目錄下的 page.json 這類和小程序頁面相關的配置。

開發者可以獨立定義每個頁面的一些屬性,如頂部顏色、是否允許下拉刷新等等。

頁面的配置只能設置 app.json 中部分 window 配置項的內容,頁面中配置項會覆蓋 app.jsonwindow 中相同的配置項。

 

6.3.sitemap 配置-了解即可

小程序根目錄下的 sitemap.json 文件用於配置小程序及其頁面是否允許被微信索引。

 

7. 模板語法

WXML(WeiXin Markup Language)是框架設計的一套標簽語言,結合基礎組件事件系統,可以構建出頁面的結構。

7.1. 數據綁定

7.1.1. 普通寫法
<view> {{ message }} </view>

 

Page({
  data: {
    message: 'Hello MINA!'
  }
})

 

7.1.2. 組件屬性
<view id="item-{{id}}"> </view>

 

Page({
  data: {
    id: 0
  }
})

 

7.1.3. bool類型

不要直接寫 checked="false",其計算結果是一個字符串

<checkbox checked="{{false}}"> </checkbox>

 

7.2. 運算

7.2.1. 三元運算
<view hidden="{{flag ? true : false}}"> Hidden </view>

 

7.2.2. 算數運算
<view> {{a + b}} + {{c}} + d </view>

 

Page({
  data: {
    a: 1,
    b: 2,
    c: 3
  }
})

 

7.2.3. 邏輯判斷
<view wx:if="{{length > 5}}"> </view>

 

7.2.4. 字符串運算
<view>{{"hello" + name}}</view>

 

Page({
  data:{
    name: 'MINA'
  }
})

 

7.2.5. 注意

花括號和引號之間如果有空格,將最終被解析成為字符串

 

7.3. 列表渲染

7.3.1. wx:for

項的變量名默認為 item wx:for-item 可以指定數組當前元素的變量名

下標變量名默認為 index wx:for-index 可以指定數組當前下標的變量名

wx:key 用來提高數組渲染的性能

wx:key 綁定的值 有如下選擇

1. string 類型,表示 循環項中的唯一屬性 如

list:[{id:0,name:"炒飯"},{id:1,name:"炒面"}]

wx:key="id"

 

2.保留字 *this ,它的意思是 item 本身 ,*this 代表的必須是 唯一的字符串和數組。

list:[1,2,3,4,5]

wx:key="*this"

代碼

<view wx:for="{{array}}" wx:key="id">
  {{index}}: {{item.message}}
</view>

 

Page({
  data: {
    array: [{
      id:0,
      message: 'foo',
    }, {
      id:1,
      message: 'bar'
    }]
  }
})

 

7.3.2. block

渲染一個包含多節點的結構塊 block最終不會變成真正的dom元素

<block wx:for="{{[1, 2, 3]}}" wx:key="*this" >
  <view> {{index}}: </view>
  <view> {{item}} </view>
</block>

 

7.4. 條件渲染

7.4.1. wx:if

在框架中,使用 wx:if="{{condition}}" 來判斷是否需要渲染該代碼塊:

 

  <view wx:if="{{false}}">1</view>
  <view wx:elif="{{true}}">2</view>
  <view wx:else>3</view>
7.4.2. hidden
<view hidden="{{condition}}"> True </view>

類似 wx:if

頻繁切換 用 hidden

不常使用 用 wx:if

 

8. 小程序事件的綁定

小程序中綁定事件,通過bind關鍵字來實現。如 bindtap bindinput bindchange

不同的組件支持不同的事件,具體看組件的說明即可。

8.1. wxml

<input bindinput="handleInput" />

8.2. page

Page({
  // 綁定的事件
  handleInput: function(e) {
    console.log(e);
    console.log("值被改變了");
  }
})

8.3. 特別注意

1.綁定事件時不能帶參數 不能帶括號 以下為錯誤寫法

<input bindinput="handleInput(100)" />

2.事件傳值 通過標簽自定義屬性的方式 和 value

<input bindinput="handleInput" data-item="100" />

3.事件觸發時獲取數據

  handleInput: function(e) {
    // {item:100}
   console.log(e.currentTarget.dataset)
      
    // 輸入框的值
   console.log(e.detail.value);
  }

 

9. 樣式 WXSS

https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxss.html

WXSS(WeiXin Style Sheets)是一套樣式語言,用於描述 WXML 的組件樣式。

CSS 相比,WXSS 擴展的特性有:

  • 響應式長度單位 rpx

  • 樣式導入

9.1. 尺寸單位

rpx(responsive pixel): 可以根據屏幕寬度進行自適應。規定屏幕寬為750rpx。如在 iPhone6 上,屏幕寬度為375px,共有750個物理像素,則750rpx = 375px = 750物理像素1rpx = 0.5px = 1物理像素

建議: 開發微信小程序時設計師可以用 iPhone6 作為視覺稿的標准。

使用步驟:

  1. 確定設計稿寬度 pageWidth

  2. 計算比例 750rpx = pageWidth px ,因此 1px=750rpx/pageWidth

  3. 在less文件中,只要把設計稿中的 px => 750/pageWidth rpx 即可。

9.2. 樣式導入

wxss中直接就支持,樣式導入功能。

也可以和 less中的導入混用。

使用@import語句可以導入外聯樣式表,只支持相對路徑

示例代碼:

/** common.wxss **/
.small-p {
  padding:5px;
}

 

/** app.wxss **/
@import "common.wxss";
.middle-p {
  padding:15px;
}

 

9.3. 選擇器

特別需要注意的是 小程序 不支持通配符 * 因此以下代碼無效!

*{
    margin:0;
    padding:0;
    box-sizing:border-box;
}

目前支持的選擇器有:

9.4. 小程序中使用less

原生小程序不支持less,其他基於小程序的框架大體都支持,如wepympvuetaro等。但是僅僅因為一個less功能,而去引入一個框架,肯定是不可取的。因此可以用以下方式來實現。

  1. 編輯器是vscode

  2. 安裝插件 easy less

3. 在vs code的設置中加入如下,配置

    "less.compile": {
        "outExt":       ".wxss"
    }

 

在要編寫樣式的地方,新建 less文件,如 index.less,然后正常編輯即可。

 

10. 常見組件

https://developers.weixin.qq.com/miniprogram/dev/component/

重點講解小程序中常用的布局組件 view,text,rich-text,button,image,navigator,icon,swiper,radio,checkbox

10.1. view

代替 原來的 div 標簽

  <view hover-class="h-class">
  點擊我試試
  </view>

10.2. text

  1. 文本標簽

  2. 只能嵌套text

  3. 長按文字可以復制(只有該標簽有這個功能)

  4. 可以對空格 回車 進行編碼

10.2.1. 代碼
  <text selectable="{{false}}" decode="{{false}}">&nbsp;通
  </text>

10.3. image

  1. 圖片標簽,image組件默認寬度320px、高度240px

  2. 支持懶加載

 

mode 有效值:

mode 有 13 種模式,其中 4 種是縮放模式,9 種是裁剪模式。

10.4.swiper

微信內置輪播圖組件

 

默認寬度 100% 高度 150px

10.4.1. swiper

 滑塊視圖容器。

10.4.2. swiper-item

滑塊,默認寬度和高度都是100%

10.5. navigator

 導航組件 類似超鏈接標簽

open-type 有效值:

10.6. rich-text

富文本標簽

可以將字符串解析成 對應標簽,類似 vue中 v-html功能

 

代碼

// 1   index.wxml  加載 節點數組
<rich-text nodes="{{nodes}}" bindtap="tap"></rich-text>
// 2 加載 字符串
<rich-text nodes='<img src="https://developers.weixin.qq.com/miniprogram/assets/images/head_global_z_@all.png" alt="">'></rich-text> 
 
    
// index.js
    
Page({
  data: {
    nodes: [{
      name: 'div',
      attrs: {
        class: 'div_class',
        style: 'line-height: 60px; color: red;'
      },
      children: [{
        type: 'text',
        text: 'Hello&nbsp;World!'
      }]
    }]
  },
  tap() {
    console.log('tap')
  }
})
10.6.1. nodes屬性

nodes屬性支持 字符串標簽節點數組

文本節點:type = text

  • nodes 不推薦使用 String 類型,性能會有所下降。

  • rich-text 組件內屏蔽所有節點的事件。

  • attrs 屬性不支持 id ,支持 class 。

  • name 屬性大小寫不敏感。

  • 如果使用了不受信任的 HTML 節點,該節點及其所有子節點將會被移除。

  • img 標簽僅支持網絡圖片。

10.7. button

<button
  type="default"
  size="{{defaultSize}}"
  loading="{{loading}}"
  plain="{{plain}}"
>
  default
</button>

 

 size 的合法值

type 的合法值

form-type 的合法值

open-type 的合法值

open-type 的 contact的實現流程

  1. 將小程序 的appid 由測試號改為 自己的appid

  2. 登錄微信小程序官網,添加 客服 - 微信

  3. 為了方便演示,我自己准備了兩個賬號

    1. 普通用戶 A

    2. 客服-微信 B

  4. 就是干!

10.8. icon

 

 

 代碼:

 js

Page({
  data: {
    iconSize: [20, 30, 40, 50, 60, 70],
    iconType: [
      'success', 'success_no_circle', 'info', 'warn', 'waiting', 'cancel', 'download', 'search', 'clear'
    ],
    iconColor: [
      'red', 'orange', 'yellow', 'green', 'rgb(0,255,255)', 'blue', 'purple'
    ],
  }
})

wxml

<view class="group">
  <block wx:for="{{iconSize}}">
    <icon type="success" size="{{item}}"/>
  </block>
</view>

<view class="group">
  <block wx:for="{{iconType}}">
    <icon type="{{item}}" size="40"/>
  </block>
</view>

<view class="group">
  <block wx:for="{{iconColor}}">
    <icon type="success" size="40" color="{{item}}"/>
  </block>
</view>

 

10.9. radio

可以通過 color屬性來修改顏色

需要搭配 radio-group 一起使用

10.10. checkbox

可以通過 color屬性來修改顏色

需要搭配 checkbox-group 一起使用

 

11. 自定義組件

https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/

類似vue或者react中的自定義組件

小程序允許我們使用自定義組件的方式來構建頁面。

11.1. 創建自定義組件

類似於頁面,一個自定義組件由 json wxml wxss js 4個文件組成.

可以在微信開發者工具中快速創建組件的文件結構

 

 

在文件夾內components/myHeader,創建組件 名為 myHeader

11.1.1. 聲明組件

首先需要在組件的 json 文件中進行自定義組件聲明

myHeader.json

{
  "component": true
}
11.1.2. 編輯組件

同時,還要在組件的 wxml 文件中編寫組件模板,在 wxss 文件中加入組件樣式。

slot表示插槽,類似vue中的slot

myHeader.wxml

<!-- 這是自定義組件的內部WXML結構 -->
<view class="inner">
  {{innerText}}
    <slot></slot>
</view>

在組件的 wxss文件中編寫樣式

注意:在組件wxss中不應使用ID選擇器、屬性選擇器和標簽名選擇器。

myHeader.wxss

/* 這里的樣式只應用於這個自定義組件 */
.inner {
  color: red;
}
11.1.3. 注冊組件

在組件的 js 文件中,需要使用 Component() 來注冊組件,並提供組件的屬性定義、內部數據和自定義方法

 

myHeader.js

Component({
  properties: {
    // 這里定義了innerText屬性,屬性值可以在組件使用時指定
    innerText: {
      // 期望要的數據是 string類型
      type: String,
      value: 'default value',
    }
  },
  data: {
    // 這里是一些組件內部數據
    someData: {}
  },
  methods: {
    // 這里是一個自定義方法
    customMethod: function(){}
  }
})

11.2. 聲明引入自定義組件

首先要在頁面的 json 文件中進行引用聲明。還要提供對應的組件名和組件路徑。

index.wxml

{
    // 引用聲明
  "usingComponents": {
      // 要使用的組件的名稱     // 組件的路徑
    "my-header":"/components/myHeader/myHeader"
  }
}

11.3. 頁面中使用自定義組件

<view>
  <!-- 以下是對一個自定義組件的引用 -->
  <my-header inner-text="Some text">
    <view>用來替代slot的</view>
    </my-header>
</view>

11.4. 定義段與示例方法

Component構造器可用於定義組件,調用Component構造器時可以指定組件的屬性、數據、方法等。

11.5. 組件-自定義組件傳參

  1. 父組件通過屬性的方式給子組件傳遞參數

  2. 子組件通過事件的方式向父組件傳遞參數

11.5.1. 過程
  1. 父組件 把數據 {{tabs}} 傳遞到 子組件的 tabItems 屬性中

  2. 父組件 監聽 onMyTab 事件

  3. 子組件 觸發 bindmytap 中的 mytap 事件

    1. 自定義組件觸發事件時,需要使用 triggerEvent 方法,指定事件名detail對象

  4. 父 -> 子 動態傳值 this.selectComponent("#tabs");

 父組件代碼

// page.wxml 

<tabs tabItems="{{tabs}}" bindmytap="onMyTab" >
  內容-這里可以放插槽
</tabs>

// page.js
  data: {
    tabs:[
      {name:"體驗問題"},
      {name:"商品、商家投訴"}
    ]
  },
  onMyTab(e){
    console.log(e.detail);
  },

子組件代碼

// com.wxml
<view class="tabs">
  <view class="tab_title"  >
    <block  wx:for="{{tabItems}}" wx:key="{{item}}">
      <view bindtap="handleItemActive" data-index="{{index}}">{{item.name}}</view>
    </block>
  </view>
  <view class="tab_content">
    <slot></slot>
  </view>
</view>

// com.js
Component({
  properties: {
    tabItems:{
      type:Array,
      value:[]
    }
  },
  /**
   * 組件的初始數據
   */
  data: {
  },

  /**
   * 組件的方法列表
   */
  methods: {
    handleItemActive(e){
      this.triggerEvent('mytap','haha');
    }
  }
})

11.6. 小結

  1. 標簽名 是 中划線的方式

  2. 屬性的方式 也是要中划線的方式

  3. 其他情況可以使用駝峰命名

    1. 組件的文件名如 myHeader.js 的等

    2. 組件內的要接收的屬性名 如 innerText

  4. 更多。。

 

12. 小程序生命周期

分為應用生命周期頁面生命周期

 

關於小程序前后台的定義和小程序的運行機制,請參考運行機制章節。

12.1. 應用生命周期

12.2. 頁面生命周期

12.3. 頁面生命周期圖解

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM