微信小程序,學習筆記(一)框架,視圖層
學習鏈接:http://www.w3cschool.cn/weixinapp/
因爲其實並非原創,但是並沒有什麼好的類別可選,所以修改成:“翻譯”了。
熟悉
文檔結構介紹
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
全局變量、對象、方法
普通類型
對象
-
App
應用程序全局實例,在
app.js
中定義,每個程序只有一個實例,可以通過如下方式獲取var app = getApp();
該對象內容,全局屬性或全局方法可以在這裏面定義
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
使用方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
視圖層(View)
數據綁定({{}}
)和條件渲染(wx:if
)
使用兩個嵌套的大括號方式
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
-
普通綁定:
<view>{{name}}</view>
-
組件屬性綁定: 必須使用引號引起來,在js改變
index
值的時候,頁面會自動刷新最新值<view id="item-{{index}}"></view>
-
控制屬性:即屬性值是需要通過滿足一定條件達到目的
<view wx:if="{{condition}}"></view>
也可以是條件表達式,或運算表達式:
<view hidden="{{flag ? true : false}}"></view>
多級條件判斷,如:
if ... elif ... else
- 1
- 2
- 3
- 1
- 2
- 3
-
使用
<block>
塊標籤來使用條件判斷控制多個組件的行爲,<block>
只起到分組的作用,並不會真的渲染到出來- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
-
算術運算
- 1
- 2
- 1
- 2
-
對象綁定
其實和普通類型綁定差不多
- 1
- 1
PS: 使用條件來控制view
時候,和hidden
屬性的比較
- view
的條件判斷,會在條件中的值發生變化的時候,會先銷燬原先的,然後滿足條件的時候重新渲染和銷燬
- hidden
屬性控制view
的顯示和隱藏,這個屬性的組件始終會被渲染,只是在需要的時候控制它的隱藏和顯示
最後比較得出:如果需要頻繁頻繁切換的情況下用hidden
屬性控制,如果在綁定的數據基本不變的情況下使用wx:if
條件來控制
列表渲染(wx:for
)
-
wx:for
,可以同時生成多個元素參數屬性說明:
wx:key="unique..."
:指定組件的唯一標識,列表發生變化需要保持自身的狀態和特徵不發生變化,並且能在重新渲染的時候,重新排序;wx:key="*this"
:功能同上,但這個是要求項目中的item本身是唯一的,也就是你需要用到的屬性值是唯一;wx:for-index="index"
:指定循環的下標變量名,默認:index
;wx:for-item="item"
: 指定當前項變量名,默認:item
例如:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
模版(template)
用來定義代碼片段,完成之後可以在其他地方通過模版直接套用該模版中組件。
-
模版定義:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
-
模版使用:通過模版名稱
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
-
模版和列表
wx:for
結合使用,同時生成多個模版使用的時候使用半閉合標籤,以及需要使用到
is=""
來指定模版名稱去使用的指定模版- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
-
運行時通過條件判斷來決定使用哪個模版
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
PS: 生成的模版擁有自己獨立的作用域,因此所使用的數據必須是data=
中指定的數據
事件處理
-
點擊事件:
bindtap
例如:
<button class="button button-refresh" bindtap="refreshDateTbl">refresh</button>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
從輸出結果得出,event 對象主要包含以下部分
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
-
事件對象:
event
原生事件屬性列表:
type
: 即當前事件類型(tap / touch);currentTarget
:表示當前組件信息集合;target
: 通過打印看了下,console.log( event.currentTarget == event.target );
結果:false
,說明currentTarget
和target
不是同一個對象,但是裏面的東西應該都是當前目標的屬性(不是很確定);看文檔解釋是:觸發事件的組件的屬性集合(currentTarget是當前,target是觸發事件的組件,不是很明白區別在哪??)timeStamp
: 這個時間也不知道是啥,應該不是點擊動作時間也不是響應時間,有2.8秒之久。(理解錯誤,正確:事件生成的時間戳)
自定義事件對象屬性列表:
detail
: 當前組件的座標(x, y);
觸摸事件對象屬性列表:
touches
:這個接觸的對象數組,難道是和事件冒泡有關?表示網上冒泡的父對象集合??瞎猜,應該是:當前觸摸事件的觸摸點信息數組;changedTouches
: 應該和上面的touches
有聯繫,解釋爲:當前變化的觸摸點信息的數組;
以下是各事件屬性的內容,很容易理解
target
:id
,dataset
,offsetLeft
,offsetTop
,dataset
要解釋下:表示事件源組件上的自定義屬性data-
的集合;-
currentTarget
:id
, ‘dataset,
tagName`;dataset
:自定義屬性集合,其中自定義屬性data-
中必須都爲小寫,需要使用-
作爲連接符, 自定義後的屬性都會出現在事件對象的dataset
對象上,舉例:<view data-my-name="lizc" data-myAge="30"></view>
最終
name
和age
可以通過如下方式去調用- 1
- 2
- 1
- 2
因此推薦使用
-
連接符去書寫自定義數據屬性 -
touches
:觸摸點數組,觸摸點對象Touch
或CanvasTouch
的集合,表示當前頁面上所有觸摸點的集合,包含屬性:Touch
對象identifier
: 觸摸點標識符,類型:Number,應該是個類似標記的東西,或者索引之類的,唯一;pageX
,pageY
:相對於整個文檔而言,距離文檔左上角的x
和y
軸的距離;clientX
,clientY
:相對於可是區域而言,xy
軸的距離
CanvasTouch
對象:identifier
: 同上;x
,y
:這個只有一個座標,即相對畫布左上角而言的座標;
-
changedTouches
:表示發生變化的觸摸點對象集合,比如該觸摸點發生了touchstart
,touchmove
,touchend
,touchcancel
變化; -
detail
:跟自定義事件有關,自定義事件攜帶的數據,不是很明白,具體內容有待考證。
PS1: 中午休息了會,打開代碼,隨便點擊了幾下按鈕,突然發現這個timestamp
可能是什麼鬼了!!!
下面是打印
```
Object {type: "tap", timeStamp: 5053127, target: Object, currentTarget: Object, detail: Object…}
Object {type: "tap", timeStamp: 5053311, target: Object, currentTarget: Object, detail: Object…}
Object {type: "tap", timeStamp: 5053496, target: Object, currentTarget: Object, detail: Object…}
Object {type: "tap", timeStamp: 5054722, target: Object, currentTarget: Object, detail: Object…}
Object {type: "tap", timeStamp: 5054936, target: Object, currentTarget: Object, detail: Object…}
Object {type: "tap", timeStamp: 5055120, target: Object, currentTarget: Object, detail: Object…}
new Date() 一下:
new Date(0)
Thu Jan 01 1970 08:00:00 GMT+0800 (中國標準時間)
new Date(5053127)
Thu Jan 01 1970 09:24:13 GMT+0800 (中國標準時間)
結果發現相差了 1:24:13,這不是剛剛啓動程序那會!!!!
```
從而得出結論:這個timestamp
應該就是程序運行的時間,單位:(ms)
PS2: 好傻!!看完事件大概,居然沒繼續往下看,文檔下面就有每個屬性的明確解釋
timeStamp: 事件生成時的時間戳;我還把它當成了程序運行時間~~~~, 也就是該頁面打開到事件觸發時的這段時間。
-
事件類型:冒泡和非冒泡
冒泡事件:(除以下冒泡事件之外的其他事件均爲非冒泡事件)
- touchstart: 手指剛碰觸到屏幕的時候觸發的事件;
- touchmove:手指觸摸後移動時觸發;
- touchcancel:手指觸摸動作被打斷,即非正常退出觸摸,如來電或短信等;
- touchend:手指觸摸結束;
- tap:手指觸摸,即點擊事件,觸摸即離開;
- longtap:手指觸摸後超過350ms再離開,會被判定爲長按。
非冒泡事件
<form/>
標籤的submit
事件<input/>
標籤的input
事件<scroll-view/>
標籤的scroll
事件
特殊事件:
<canvas />
的觸摸事件不可冒泡,因此沒有currentTarget
,理解:因爲不存在冒泡行爲,也就是說被點擊事件和當前事件組件永遠只可能是同一個組件。
-
target
和currentTarget
對比分析測試代碼:日期列表,點擊日期行,通過事件冒泡去觸發父組件的
tapDateRow
事件- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
從輸出可知,target即你點擊的那個組件,也就是觸發點擊事件的組件,而
currentTarget
是你綁定點擊事件的那個組件,如果點擊事件句柄同時綁定在被點擊的那個組件上,那麼這兩個對象是不是應該是指同一個組件呢?(猜測對一半錯一半,驗證如下:)- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
結論:通過輸出可知,兩個對象的內容是一模一樣的,說明這兩個屬性都是代表着當前被點擊的組件,但是兩者卻不是指向同一個空間,即該組件。說明這兩個對象具有自己獨立的內存空間,而非在綁定事件和觸發事件對象相同時都指向同一個內存空間。
-
事件綁定:
bind
和catch
,即冒泡和非冒泡bind:
- 1
- 2
- 1
- 2
catch:
- 1
- 2
- 1
- 2
例如:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 點擊 view3 會調用 f1, 然後調用 f2,到此結束,因爲 view2 用的是非冒泡綁定,阻止了事件繼續往上冒泡到 view1;
- 點擊 view2 只會調到 f2;
- 點擊 view1 只會調到 f1;
事件總結:
- 事件對象:
event
; - 事件類型:冒泡和非冒泡;
- 事件綁定:
bindtap
,bindtouch*
; - 事件源和觸發源:
event.currentTarget
和event.target
;
a.id
:事件組件對象的id
;
b.target
:自定義屬性集合dataset
(屬性定義:data-my-name
,使用:event.target.dataset.myName
);
c.offsetLeft/offsetTop
: 事件組件的left/top
實際值。 - 事件戳:
event.timeStamp
,單位:(ms); - 觸摸點對象:
event.touches
(Touch
:identifier
,pageX/pageY
,clientX/clientY
;CanvasTouch
:identifier
,x/y
); - 變化的觸摸點對象:
event.changedTouches
; - 自定義事件攜帶的數據對象:
event.detail
。
引用
引用外部文件方式:import
和 include
,兩個引入剛好相反或者說互補,前者是引入文件中的模版代碼template
,而後者是引入文件中除了template
定義的之外的所有代碼完整拷貝到當前位置。
-
import
使用
import
引入時不能嵌套引入,即:加入a.wxml
中引入了b.wxml
中的模版,然後b.wxml
引入了c.wxml
中的模版,那麼a.wxml
中也無法直接引入c.wxml
中的模版。- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
未報錯,只是警告,但也可知
import
無法嵌套跨文件引入:- 1
- 2
- 1
- 2
-
include
這個引入的是除了
template
定義之外的所有代碼,相當於將代碼拷貝到當前位置。- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
結果: 如下,只是單純引入了除
template
之外的代碼,並且是拷貝到inlucde
使用的當前位置- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
總結:該文主要是根據 W3CSchool
上的資料,學習記錄下來的(後續也會一直學習微信小程序的東西)其實也基本差不多是 copy
到一起了吧,不過這樣有助於記憶,沒有什麼技術含量的東西。最近一段時間有點忙,博客什麼的壓根都沒上過,一個人在負責一塊還是感覺有點人手不足的,這段時間幾乎每天都是10點,11點多下班,週六還要加班。
忍不住要吐槽,不吐不快。。。。。。
- 槽點1:組內來了兩個應屆生,組長之前就說好了讓我一個跟着我讓我帶着,一起幫忙負責這一塊,可是說是這麼說,中途不停的給他安排其他任務,我總感覺是說安排到我這,就是來打醬油的,最後還是的自己去弄,後面又新接了一個開發的任務,搞的人都快搞虛了,不過也算是樂在其中吧,還是比較喜歡創造新東西,每天不停的去給別人填坑也是種苦,寶寶心裏苦
~!)
新開發任務總算完結了,後期測試也算告終,其實也不是什麼複雜的東西,只是今年剛進公司對公司業務這塊並不是非常熟悉,所以花了點時間。現在搞完了自己也算有點成就感,嘿嘿~~!!!
-
槽點2:來了快一年,接觸過無數廠家的前端代碼,有些寫的複雜的讓人頭疼,給人感覺就是:我就是要寫的這麼複雜,甚至對象嵌套多達6-7層(Σ( ° △ °|||)︴),顯得我牛逼呀,哈哈~~~,是SB吧 - -!。還有一些廠家代碼確實非常不錯,對象,原型,閉包,命名等等,都是用的溜溜轉,也學到不少東西。
-
槽點3:代碼風格,代碼格式,代碼規範,規範,規範啊,重要的事情說三遍,包括本公司的代碼,和大多數其他廠家的代碼,代碼幾乎沒有任何規範,格式縮進命名等等,每次看到那種代碼,我真想跳樓,
本來就一個很小的BUG,因爲代碼問題,硬是要花半天甚至一天才能找到問題點,然後發現其實就是個變量用錯地方,或者是哪個單詞寫錯了。
這一年來,經歷了很多事情和看了很多代碼,對自己要求也嚴格了
- 變量名可以稍微長點(不能太長哦,:-)),但一定要表達清楚其意義,讓人一看到就知道是幹什麼的(繼續吐槽:全局變量漫天飛,還命名毫無語義感,不找找還真不知道是幹嘛的,另外也很少見過全局變量用一種約定方式去定義,比如說:前面統一加上個公司英文符號也好撒,或者你前面加個
g/global
什麼的也好啊,個人比較喜歡用g
開頭去定義全局變量); - 代碼風格,包括縮進,空格的使用,有了進一步的認知和運用;
- 另外還就是一種思想:面向對象思想,真的很重要,包括新開發的任務上也運用上了,不過水平有限,也只是簡單的運用而已;
好了,很久沒記錄什麼了,也快放假回去過年了,雖然最近煩心事多,還是要好好努力下去不是,30歲或許是道砍,也或許不是,端看自己怎麼去看待和對待自己的人生了,多年來的感受只有一點:做自己最熱愛的事情,讓你能徹夜不眠還樂在其中的事情,那纔是人生的樂趣,一味的爲了生活而生活何嘗不是行屍走肉般的活着。
給自己加把油,加油!
友情鏈接:http://blog.csdn.net/gccll/article/details/54140177