您當前位置>首頁 » 新聞資(zī)訊 » 小程序相關(guān) >
微信小程序入門教程之三:腳本編程
發表時間:2021-1-5
發布人:葵宇科技
浏覽次數:58
今天,接着往下(xià)講,教大家為小程序加入 JavaScript 腳本,做出動(dòng)态效果,以及如(rú)何跟用戶互動(dòng)。學會了腳本,就能做出複雜的頁面了。
本篇的難度要大于前兩篇,如(rú)果覺得不好理解,可(kě)以先跟着例子(zǐ),動(dòng)手做一遍,然後再讀文(wén)字說明,可(kě)能就容易理解了。
一、數據綁定
前面的所有示例,小程序的頁面都是寫死的,也就是頁面内容不會變。但是,頁面數據其實可(kě)以通(tōng)過腳本傳入,通(tōng)過腳本改變頁面,實現動(dòng)态效果。
小程序提供了一種特别的方法,讓頁面可(kě)以更方便地使用腳本數據,叫做"數據綁定"(data binding)。
所謂"數據綁定",指的是腳本裡面的某些數據,會自動(dòng)成為頁面可(kě)以讀取的全局變量,兩者會同步變動(dòng)。也就是說,腳本裡面修改這個(gè)變量的值,頁面會随之變化;反過來,頁面上修改了這段内容,對應的腳本變量也會随之變化。這也叫做 MVVM 模式。
下(xià)面看一個(gè)例子(zǐ)。打開home.js
文(wén)件,改成下(xià)面這樣。
Page({ data: { name: '張三' } });
上面代碼中(zhōng),Page()
方法的配置對象有一個(gè)data
屬性。這個(gè)屬性的值也是一個(gè)對象,有一個(gè)name
屬性。數據綁定機制規定,data
對象的所有屬性,自動(dòng)成為當前頁面可(kě)以讀取的全局變量。也就是說,home
頁面可(kě)以自動(dòng)讀取name
變量。
接着,修改home.wxml
文(wén)件,加入name
變量。
<view> <text class="title">hello {{name}}text> view>
上面代碼中(zhōng),name
變量寫在{{...}}
裡面。這是小程序特有的語法,兩重大括号表示,内部不是文(wén)本,而是 JavaScript 代碼,它的執行結果會寫入頁面。因此,{{name}}
表示讀取全局變量name
的值,将這個(gè)值寫入網頁。
注意,變量名區分大小寫,name
和(hé)Name
是兩個(gè)不同的變量名。
開發者工具導入項目代碼,頁面渲染結果如(rú)下(xià)。
可(kě)以看到,name
變量已經自動(dòng)替換成了變量值"張三"。
這個(gè)示例的完整代碼,可(kě)以查看代碼倉庫。
頁面和(hé)腳本對于變量name
是數據綁定關(guān)系,無論哪一方改變了name
的值,另一方也會自動(dòng)跟着改變。後面講解到事件時,會有雙方聯動(dòng)的例子(zǐ)。
二、全局數據
數據綁定隻對當前頁面有效,如(rú)果某些數據要在多個(gè)頁面共享,就需要寫到全局配置對象裡面。
打開app.js
,改寫如(rú)下(xià)。
App({ globalData: { now: (new Date()).toLocaleString() } });
上面代碼中(zhōng),App()
方法的參數配置對象有一個(gè)globalData
屬性,這個(gè)屬性就是我們要在多個(gè)頁面之間分享的值。事實上,配置對象的任何一個(gè)屬性都可(kě)以共享,這裡起名為globalData
隻是為了便于識别。
然後,打開home.js
,改成下(xià)面的内容,在頁面腳本裡面獲取全局對象。
const app = getApp(); Page({ data: { now: app.globalData.now } });
上面代碼中(zhōng),getApp()
函數是小程序原生提供的函數方法,用于從頁面獲取 App 實例對象。拿到實例對象以後,就能從它上面拿到全局配置對象的globalData
屬性,從而把app.globalData.now
賦值給頁面腳本的now
屬性,進而通(tōng)過數據綁定機制,變成頁面的全局變量now
。
最後,修改一下(xià)頁面代碼home.wxml
。
<view> <text class="title">現在是 {{now}}text> view>
開發者工具導入項目代碼,頁面渲染結果如(rú)下(xià)。
可(kě)以看到,頁面讀到了全局配置對象app.js
裡面的數據。
這個(gè)示例的完整代碼,可(kě)以查看代碼倉庫。
三、事件
事件是小程序跟用戶互動(dòng)的主要手段。小程序通(tōng)過接收各種用戶事件,執行回調函數,做出反應。
小程序的常見事件有下(xià)面這些。
tap
:觸摸後馬上離(lí)開。longpress
:觸摸後,超過 350ms 再離(lí)開。如(rú)果指定了該事件的回調函數并觸發了該事件,tap
事件将不被觸發。touchstart
:觸摸開始。touchmove
:觸摸後移動(dòng)。touchcancel
:觸摸動(dòng)作被打斷,如(rú)來電提醒,彈窗等。touchend
:觸摸結束。
上面這些事件,在傳播上分成兩個(gè)階段:先是捕獲階段(由上層元素向下(xià)層元素傳播),然後是冒泡階段(由下(xià)層元素向上層元素傳播)。所以,同一個(gè)事件在同一個(gè)元素上面其實會觸發兩次:捕獲階段一次,冒泡階段一次。詳細的介紹,請參考我寫的事件模型解釋。
小程序允許頁面元素,通(tōng)過屬性指定各種事件的回調函數,并且還能夠指定是哪個(gè)階段觸發回調函數。具體方法是為事件屬性名加上不同的前綴。小程序提供四種前綴。
capture-bind
:捕獲階段觸發。capture-catch
:捕獲階段觸發,并中(zhōng)斷事件,不再向下(xià)傳播,即中(zhōng)斷捕獲階段,并取消随後的冒泡階段。bind
:冒泡階段觸發。catch
:冒泡階段觸發,并取消事件進一步向上冒泡。
下(xià)面通(tōng)過一個(gè)例子(zǐ),來看如(rú)何為事件指定回調函數。打開home.wxml
文(wén)件,改成下(xià)面的代碼。
<view> <text class="title">hello {{name}}text> <button bind:tap="buttonHandler">點擊button> view>
上面代碼中(zhōng),我們為頁面加上了一個(gè)按鈕,并為這個(gè)按鈕指定了觸摸事件(tap
)的回調函數buttonHandler
,bind:
前綴表示這個(gè)回調函數會在冒泡階段觸發(前綴裡面的冒号可(kě)以省略,即寫成bindtap
也可(kě)以)。
回調函數必須在頁面腳本中(zhōng)定義。打開home.js
文(wén)件,改成下(xià)面的代碼。
Page({ data: { name: '張三' }, buttonHandler(event) { this.setData({ name: '李四' }), } });
上面代碼中(zhōng),Page()
方法的參數配置對象裡面,定義了buttonHandler()
,這就是