html
vue
推廣app 或公衆號的成本過高。node
開發適配成本低。react
容易小規模試錯,而後快速迭代。git
跨平臺。github
2016年1月11日,微信之父張小龍時隔多年的公開亮相,解讀了微信的四大價值觀。張小龍指出,愈來愈多產品經過公衆號來作,由於這裏開發、獲取用戶和傳播成本更低。拆分出來的服務號並無提供更好的服務,因此微信內部正在研究新的形態,叫「微信小程序」 須要注意的是,以前是叫作 應用號web
2016年9月21日,微信小程序正式開啓內測。在微信生態下,觸手可及、用完即走的微信小程序引發普遍關注。騰訊雲正式上線微信小程序解決方案,提供小程序在雲端服務器的技術方案。json
2017年1月9日,微信推出的「小程序」正式上線。「小程序」是一種無需安裝,便可使用的手機「應用」。不須要像往常同樣下載App,用戶在微信中「用完即走」。小程序
微信小程序
信息傳達數達到450億,較去年增加18%;視頻通話4.1億次,增加100%
小程序覆蓋超過200+行業,交易額增加超過6倍,服務1000億+人次,創造出了5000億+的商業價值
支付寶小程序
百度小程序
QQ小程序
今日頭條 + 抖音小程序
拼多多
滴滴出行
歡樂鬥地主
智行火車票
惟品會
。。。
開發微信小程序以前,必需要準備好相應的環境
建議使用全新的郵箱,沒有註冊過其餘小程序或者公衆號的。
登陸,成功後可看到以下界面
而後複製你的APPID,悄悄的保存起來,不要給別人看到。
微信小程序自帶開發者工具,集 開發 預覽 調試 發佈 於一身的 完整環境。
可是因爲編碼的體驗不算好,所以 建議使用 vs code
+ 微信小程序編輯工具
來實現編碼
vs code
負責敲代碼,微信編輯工具
負責預覽。
注意 第一次登陸的時候 須要掃碼登陸
小程序框架的目標是經過儘量簡單、高效的方式讓開發者能夠在微信中開發具備原生 APP 體驗的服務。
小程序框架提供了本身的視圖層描述語言 WXML
和 WXSS
,以及 JavaScript
,並在視圖層與邏輯層間提供了數據傳輸和事件系統,讓開發者可以專一於數據與邏輯。
注意:配置文件中不能出現註釋。
{ "pages":[ "pages/index/index", "pages/logs/logs" ], "window":{ "backgroundTextStyle":"light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "WeChat", "navigationBarTextStyle":"black" } }
pages
字段 —— 用於描述當前小程序全部頁面路徑,這是爲了讓微信客戶端知道當前你的小程序頁面定義在哪一個目錄。
window
字段 —— 定義小程序全部頁面的頂部背景顏色,文字顏色定義等。
完整的配置信息請參考 app.json配置
這裏的 page.json
其實用來表示頁面目錄下的 page.json
這類和小程序頁面相關的配置。
開發者能夠獨立定義每一個頁面的一些屬性,如頂部顏色、是否容許下拉刷新等等。
頁面的配置只能設置 app.json
中部分 window
配置項的內容,頁面中配置項會覆蓋 app.json
的 window
<view> {{ message }} </view>
Page({ data: { message: 'Hello MINA!' } })
<view id="item-{{id}}"> </view>
Page({ data: { id: 0 } })
不要直接寫 checked="false",其計算結果是一個字符串
<checkbox checked="{{false}}"> </checkbox>
<view hidden="{{flag ? true : false}}"> Hidden </view>
<view> {{a + b}} + {{c}} + d </view>
Page({ data: { a: 1, b: 2, c: 3 } })
<view wx:if="{{length > 5}}"> </view>
<view>{{"hello" + name}}</view>
Page({ data:{ name: 'MINA' } })
項的變量名默認爲 item
wx:for-item
能夠指定數組當前元素的變量名
下標變量名默認爲 index
wx:for-index
能夠指定數組當前下標的變量名
wx:key
用來提升數組渲染的性能
wx:key
綁定的值 有以下選擇
list:[{id:0,name:"炒飯"},{id:1,name:"炒麪"}]
wx:key="id"
2.
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' }] } })
<block wx:for="{{[1, 2, 3]}}" wx:key="*this" >
<view> {{index}}: </view>
<view> {{item}} </view>
</block>
<view wx:if="{{false}}">1</view> <view wx:elif="{{true}}">2</view> <view wx:else>3</view>
<view hidden="{{condition}}"> True </view>
頻繁切換 用 hidden
不常使用 用 wx:if
小程序中綁定事件,經過bind關鍵字來實現。如 bindtap
bindinput
bindchange
等
不一樣的組件支持不一樣的事件,具體看組件的說明便可。
<input bindinput="handleInput" />
Page({ // 綁定的事件 handleInput: function(e) { console.log(e); console.log("值被改變了"); } })
1.
<input bindinput="handleInput(100)" />
2.
<input bindinput="handleInput" data-item="100" />
3.事件觸發時獲取數據
handleInput: function(e) { // {item:100} console.log(e.currentTarget.dataset) // 輸入框的值 console.log(e.detail.value); }
與 CSS 相比,WXSS 擴展的特性有:
樣式導入
使用步驟:
肯定設計稿寬度 pageWidth
計算比例 750rpx = pageWidth px
,所以 1px=750rpx/pageWidth
。
在less文件中,只要把設計稿中的 px
=> 750/pageWidth rpx
便可。
wxss中直接就支持,樣式導入功能。
也能夠和 less中的導入混用。
使用@import
語句能夠導入外聯樣式表,只支持相對路徑。
示例代碼:
/** common.wxss **/ .small-p { padding:5px; }
/** app.wxss **/ @import "common.wxss"; .middle-p { padding:15px; }
*{ margin:0; padding:0; box-sizing:border-box; }
目前支持的選擇器有:
安裝插件 easy less
3. 在vs code的設置中加入以下,配置
"less.compile": { "outExt": ".wxss" }
https://developers.weixin.qq.com/miniprogram/dev/component/
重點講解小程序中經常使用的佈局組件
<view hover-class="h-class">
點擊我試試
</view>
只能嵌套text
長按文字能夠複製(只有該標籤有這個功能)
能夠對空格 回車 進行編碼
<text selectable="{{false}}" decode="{{false}}"> 普 通 </text>
支持懶加載
mode 有效值:
mode 有 13 種模式,其中 4 種是縮放模式,9 種是裁剪模式。
默認寬度 100% 高度 150px
滑塊視圖容器。
導航組件 相似超連接標籤
open-type 有效值:
代碼
// 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 World!' }] }] }, tap() { console.log('tap') } })
文本節點:type = text
rich-text
組件內屏蔽全部節點的事件。
attrs
屬性不支持 id ,支持 class 。
name
屬性大小寫不敏感。
若是使用了不受信任的 HTML
節點,該節點及其全部子節點將會被移除。
img
標籤僅支持網絡圖片。
<button type="default" size="{{defaultSize}}" loading="{{loading}}" plain="{{plain}}" > default </button>
size 的合法值
type 的合法值
form-type 的合法值
open-type 的合法值
登陸微信小程序官網,添加 客服 - 微信
爲了方便演示,我本身準備了兩個帳號
普通用戶 A
客服-微信 B
就是幹!
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>
能夠經過 color屬性來修改顏色
myHeader.json
{ "component": true }
同時,還要在組件的 wxml
文件中編寫組件模板,在 wxss
文件中加入組件樣式。
slot
表示插槽,相似vue中的slot
myHeader.wxml
<!-- 這是自定義組件的內部WXML結構 -->
<view class="inner">
{{innerText}}
<slot></slot>
</view>
/* 這裏的樣式只應用於這個自定義組件 */ .inner { color: red; }
myHeader.js
Component({ properties: { // 這裏定義了innerText屬性,屬性值能夠在組件使用時指定 innerText: { // 指望要的數據是 string類型 type: String, value: 'default value', } }, data: { // 這裏是一些組件內部數據 someData: {} }, methods: { // 這裏是一個自定義方法 customMethod: function(){} } })
{ // 引用聲明 "usingComponents": { // 要使用的組件的名稱 // 組件的路徑 "my-header":"/components/myHeader/myHeader" } }
<view> <!-- 如下是對一個自定義組件的引用 --> <my-header inner-text="Some text"> <view>用來替代slot的</view> </my-header> </view>
子組件經過事件的方式向父組件傳遞參數
父組件 把數據 {{tabs}}
傳遞到 子組件的 tabItems
屬性中
父組件 監聽 onMyTab
事件
子組件 觸發 bindmytap
中的 mytap
事件
自定義組件觸發事件時,須要使用 triggerEvent
方法,指定事件名
、detail
對象
父 -> 子 動態傳值 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'); } } })
屬性的方式 也是要中劃線的方式
其餘狀況可使用駝峯命名
組件的文件名如 myHeader.js
的等
組件內的要接收的屬性名 如 innerText