您好,登錄后才能下訂單哦!
這篇文章主要介紹“微信小程序視圖層的知識(shí)點(diǎn)有哪些”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“微信小程序視圖層的知識(shí)點(diǎn)有哪些”文章能幫助大家解決問(wèn)題。
小程序框架的視圖層由WXML(WeiXin Markup Language,微信標(biāo)記語(yǔ)言)與WXSS(WeiXin Style Sheet,微信樣式表)編寫,由組件來(lái)進(jìn)行展示。視圖層負(fù)責(zé)將邏輯層的數(shù)據(jù)顯示在頁(yè)面上,同時(shí)將視圖層的事件發(fā)送給邏輯層。WXML用來(lái)描述頁(yè)面的結(jié)構(gòu),WXSS用于描述頁(yè)面的樣式,組件是視圖的基本組成單元。這三者的關(guān)系可以類比為HTML,CSS與HTML里面各種標(biāo)簽的關(guān)系。除了這三者之外,還有一套用于小程序的腳本語(yǔ)言——WXS(WeiXin Script)。WXS和WXML結(jié)合起來(lái),可以構(gòu)建出頁(yè)面結(jié)構(gòu)。
數(shù)據(jù)綁定的基本原則:
1)在 data 中定義頁(yè)面的數(shù)據(jù):在頁(yè)面對(duì)應(yīng)的 .js 文件中,把數(shù)據(jù)定義到 data 對(duì)象中即可。
Page({ data:{ //字符串類型的數(shù)據(jù) info: 'init data ' , //數(shù)組類型的數(shù)據(jù) msgList: [{msg: 'hello'},{msg: "world '}] } })
2)在 WXML 中使用數(shù)據(jù):把data中的數(shù)據(jù)綁定到頁(yè)面中渲染,使用 Mustache 語(yǔ)法(雙大括號(hào))將變量包起來(lái)即可。語(yǔ)法格式為:
<view>{{要綁定的數(shù)據(jù)名稱}}</view>
Mustache 語(yǔ)法的主要應(yīng)用場(chǎng)景如下:
①內(nèi)容。直接在頁(yè)面上顯示數(shù)據(jù)內(nèi)容。
②組件屬性。用后端變量來(lái)設(shè)置前端部分組件的屬性,注意由雙大括號(hào)括起來(lái)的變量需要在屬性的雙引號(hào)內(nèi)。
③控制屬性。用后端變量來(lái)控制前端組件的顯示效果,注意由雙大括號(hào)括起來(lái)的變量需要在屬性的雙引號(hào)內(nèi)。
④關(guān)鍵字。主要用于邏輯判斷。
①三元運(yùn)算??梢栽陔p大括號(hào)內(nèi)進(jìn)行三元運(yùn)算。
.js中:
Page({ data: { randomNum:Math.random()*10 } })
.wxml中:
<view>{{randomNum>=5?'數(shù)字大于等于5':'數(shù)字小于5'}}</view>
②算術(shù)運(yùn)算。在雙大括號(hào)內(nèi),可以進(jìn)行基本的算術(shù)運(yùn)算,會(huì)直接顯示運(yùn)算后的結(jié)果。
③邏輯判斷。在雙大括號(hào)內(nèi),可以進(jìn)行邏輯運(yùn)算,返回boolean類型的true或false,可以用于某些屬性的控制。
④字符串運(yùn)算。在雙大括號(hào)內(nèi),可以做字符串的拼接運(yùn)算。
⑤數(shù)據(jù)路徑運(yùn)算。對(duì)于數(shù)組和JSON對(duì)象類型的數(shù)據(jù),在雙大括號(hào)內(nèi)可以通過(guò)索引的方式取其值。
①數(shù)組
②對(duì)象
通過(guò) wx:for 可以根據(jù)指定的數(shù)組,循環(huán)渲染重復(fù)的組件結(jié)構(gòu),語(yǔ)法示例如下:
.js中:
Page({ data: { array:['a','b','c'] } })
.wxml中:
<view wx:for="{{array}}"> 索引是:{{index}},當(dāng)前項(xiàng)是:{{item}} </view>
默認(rèn)情況下,當(dāng)前循環(huán)項(xiàng)的索引用 index 表示;當(dāng)前循環(huán)項(xiàng)用 item 表示。
使用 wx:for-index 可以指定當(dāng)前循環(huán)項(xiàng)的索引的變量名
使用 wx:for-item 可以指定當(dāng)前項(xiàng)的變量名
.wxml中:
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName"> 索引是:{{idx}},當(dāng)前項(xiàng)是:{{itemName}} </view>
類似于 Vue 列表渲染中的 :key,小程序在實(shí)現(xiàn)列表渲染時(shí),也建議為渲染出來(lái)的列表項(xiàng)指定唯一的 key 值,從而提高渲染的效率,示例代碼如下:
.js中:
Page({ data: { userList:[ {id:1,name:'冠軍'}, {id:2,name:'亞軍'}, {id:3,name:'季軍'} ] } })
.wxml中:
<view wx:for="{{userList}}" wx:key="id">{{item.name}}</view>
wx:key的值以如下兩種形式提供:
1)字符串。代表在wx:for循環(huán)的數(shù)組中某一項(xiàng)的某個(gè)屬性,該屬性的值需要是列表中唯一的字符串或者數(shù)字,且不能動(dòng)態(tài)改變。
2)保留關(guān)鍵字*this。代表在wx:for循環(huán)中的某一項(xiàng)本身,這種表示需要這一項(xiàng)本身是一個(gè)唯一的字符串或者數(shù)字。
在小程序中,使用 wx:if="{{condition}}" 來(lái)判斷是否需要渲染該代碼塊,也可以用 wx:elif 和 wx:else 來(lái)添加 else 判斷。示例如下:
.js中:
Page({ data: { type:1 } })
.wxml中:
<view wx:if="{{type === 1}}">男</view> <view wx:elif="{{type === 2}}">女</view> <view wx:else>保密</view>
<block>
使用 wx:if如果要一次性控制多個(gè)組件的展示與隱藏,可以使用一個(gè) <block ></block >
標(biāo)簽將多個(gè)組件包裝起來(lái),并在<block>
標(biāo)簽上使用 wx:if 控制屬性,示例如下:
<block wx:if="{{true}}"> <view>view1</view> <view>view2</view> </block>
注意: <block>
并不是一個(gè)組件,它只是一個(gè)包裹性質(zhì)的容器,不會(huì)在頁(yè)面中做任何渲染。
在小程序中,直接使用 hidden="{{ condition }}" 也能控制元素的顯示與隱藏:
<view hidden="{{flag}}">true隱藏,false顯示</view>
1)運(yùn)行方式不同:
wx:if 以動(dòng)態(tài)創(chuàng)建和移除元素的方式,控制元素的展示與隱藏。
hidden 以切換樣式的方式(display: none/block;),控制元素的顯示與隱藏。
2)使用建議:
頻繁切換時(shí),建議使用 hidden。
控制條件復(fù)雜時(shí),建議使用 wx:if 搭配 wx:elif、wx:else 進(jìn)行展示與隱藏的切換。
事件是視圖層到邏輯層的通信方式,它可以將用戶的行為反饋到邏輯層講行處理。事件一般綁定在組件上,當(dāng)設(shè)定監(jiān)聽(tīng)的事件被觸發(fā)時(shí),視圖層會(huì)將攜帶了id、dataset、touches等信息的事件對(duì)象發(fā)送到邏輯層中,此時(shí)框架就會(huì)執(zhí)行邏輯層中
對(duì)應(yīng)的事件處理函數(shù),來(lái)響應(yīng)用戶的操作。
事件分為冒泡事件和非冒泡事件。
冒泡事件:當(dāng)一個(gè)組件上的事件被觸發(fā)后,該事件會(huì)向父節(jié)點(diǎn)傳遞。
非冒泡事件:當(dāng)一個(gè)組件上的事件被觸發(fā)后,該事件不會(huì)向父節(jié)點(diǎn)傳遞。
.wxml中:
<button type="primary" bindtap="btnTapHandler">按鈕</button>
.js中定義事件處理函數(shù):
Page({ // 定義按鈕的事件處理函數(shù) btnTapHandler(event){ console.log(event) } })
當(dāng)組件觸發(fā)事件時(shí)。邏輯層綁定該事件的處理函數(shù)會(huì)收到一個(gè)事件對(duì)象。
通過(guò)調(diào)用 this.setData(dataObject) 方法,可以給頁(yè)面 data 中的數(shù)據(jù)重新賦值。示例如下:
.wxml中:
<button type="primary" bindtap="countChange">+1</button>
.js中定義事件處理函數(shù):
Page({ data: { count:0 }, //+1 按鈕的事件處理函數(shù) countChange(){ this.setData({ count:this.data.count +1 }) } })
小程序中的事件傳參比較特殊,不能在綁定事件的同時(shí)為事件處理函數(shù)傳遞參數(shù)??梢詾榻M件提供 data-* 自定義屬性傳參,其中 * 代表的是參數(shù)的名字,示例代碼如下:
.wxml中:( info 會(huì)被解析為參數(shù)的名字,數(shù)值 2 會(huì)被解析為參數(shù)的值。)
<button type="primary" bindtap="binTap2" data-info="{{2}}">+2</button>
.js中:(在事件處理函數(shù)中,通過(guò) event.target.dataset.參數(shù)名 即可獲取到具體參數(shù)的值)
Page({ data: { count:0 }, //+2 binTap2(event){ this.setData({ count:this.data.count + event.target.dataset.info }) } })
在小程序中,通過(guò) input 事件來(lái)響應(yīng)文本框的輸入事件。
.wxml中:
<input bindinput="inputHandler"></input>
.js 中定義事件處理函數(shù):
Page({ //input輸入框的事件處理函數(shù) inputHandler(event){ console.log(event.detail.value) } })
實(shí)現(xiàn)步驟:①定義數(shù)據(jù);②渲染結(jié)構(gòu);③美化樣式;④綁定 input 事件處理函數(shù)。
WXML提供兩種文件引用方式:import 和 include
1)import 可以在該文件中使用目標(biāo)文件定義的模板。import 有作用域的概念,即只會(huì)導(dǎo)入目標(biāo)文件中定義的模板,而不會(huì)導(dǎo)入目標(biāo)文件導(dǎo)入的模板。
2)include 可以將目標(biāo)文件除了<template/><wxs/>
外的整個(gè)代碼引入,相當(dāng)于復(fù)制到 include 位置。
WXSS (WeiXin Style Sheets)是一套樣式語(yǔ)言,用于美化 WXML 的組件樣式,類似于網(wǎng)頁(yè)開(kāi)發(fā)中的 CSS。WXSS 具有 CSS 大部分特性,同時(shí),WXSS 還對(duì) CSS 進(jìn)行了擴(kuò)充以及修改,以適應(yīng)微信小程序的開(kāi)發(fā)。
與 CSS 相比,WXSS 擴(kuò)展的特性有:
rpx 尺寸單位
@import 樣式導(dǎo)入
rpx(responsive pixel)是微信小程序獨(dú)有的,用來(lái)解決屏適配的尺寸單位。
rpx 的實(shí)現(xiàn)原理非常簡(jiǎn)單:鑒于不同設(shè)備屏幕的大小不同,為了實(shí)現(xiàn)屏幕的自動(dòng)適配,rpx 把所有設(shè)備的屏幕,在寬度上等分為 750 份(即:當(dāng)前屏幕的總寬度為 750rpx)。
在較小的設(shè)備上,1rpx 所代表的寬度較小
在較大的設(shè)備上,1rpx 所代表的寬度較大
小程序在不同設(shè)備上運(yùn)行的時(shí)候,會(huì)自動(dòng)把 rpx 的樣式單位換算成對(duì)應(yīng)的像素單位來(lái)渲染,從而實(shí)現(xiàn)屏幕適配。
在 iPhone6 上,屏幕寬度為375px,共有 750 個(gè)物理像素,等分為 750rpx。則:
750rpx = 375px = 750 物理像素
1rpx = 0.5px = 1物理像素
官方建議:開(kāi)發(fā)微信小程序時(shí),設(shè)計(jì)師可以用 iPhone6 作為視覺(jué)稿的標(biāo)準(zhǔn)。
使用 WXSS 提供的 @import 語(yǔ)法,可以導(dǎo)入外聯(lián)的樣式表。
@import 后跟需要導(dǎo)入的外聯(lián)樣式表的相對(duì)路徑,用 ;
表示語(yǔ)句結(jié)束。
內(nèi)聯(lián)樣式是框架組件上支持使用 style、class 屬性來(lái)控制組件的樣式。
1)style:用于接收動(dòng)態(tài)樣式,在運(yùn)行時(shí)會(huì)進(jìn)行解析。
2)class:用于指定樣式規(guī)則。其值是樣式規(guī)則中類選擇器名(樣式類名)的集合。一般將靜態(tài)樣式寫到對(duì)應(yīng)樣式類名的定義中。多個(gè)樣式類名之間用空格分隔。
和CSS一樣,WXSS也需要使用選擇器來(lái)決定樣式的作用對(duì)象。
1)全局樣式:定義在 app.wxss 中的樣式為全局樣式,作用于每一個(gè)頁(yè)面。
2)局部樣式:在頁(yè)面的 .wxss 文件中定義的樣式為局部樣式,只作用于當(dāng)前頁(yè)面。
注意:
當(dāng)局部樣式和全局樣式?jīng)_突時(shí),根據(jù)就近原則,局部樣式會(huì)覆蓋全局樣式。
當(dāng)局部樣式的權(quán)重大于或等于全局樣式的權(quán)重時(shí),才會(huì)覆蓋全局的樣式。
WXS(WeiXin Script)是小程序獨(dú)有的一套腳本語(yǔ)言,結(jié)合 WXML,可以構(gòu)建出頁(yè)面的結(jié)構(gòu)。
wxml 中無(wú)法調(diào)用在頁(yè)面的 .js 中定義的函數(shù),但是,wxml 中可以調(diào)用 wxs 中定義的函數(shù)。因此,小程序中 wxs 的典型應(yīng)用場(chǎng)景就是“過(guò)濾器”。
雖然 wxs 的語(yǔ)法類似于 JavaScript,但是 wxs 和 JavaScript 是完全不同的兩種語(yǔ)言:
(1)wxs 有自己的數(shù)據(jù)類型:
number 數(shù)值類型
string 字符串類型
boolean 布爾類型
object 對(duì)象類型
function函數(shù)類型
array 數(shù)組類型
date 日期類型
regexp 正則
(2)wxs 不支持類似于 ES6 及以上的語(yǔ)法形式
不支持:let、const、解構(gòu)賦值、展開(kāi)運(yùn)算符、箭頭函數(shù)、對(duì)象屬性簡(jiǎn)寫、etc…
支持:var 定義變量、普通 function函數(shù)等類似于 ES5 的語(yǔ)法
(3)wxs 遵循 CommonJS 規(guī)范
module 對(duì)象
require() 函數(shù)
module.exports 對(duì)象
wxs 代碼可以編寫在 wxml 文件中的 <wxs>
標(biāo)簽內(nèi),就像 Javascript 代碼可以編寫在 html 文件中的 <script>
標(biāo)簽內(nèi)一樣。
wxml 文件中的每個(gè) <wxs></wxs>
標(biāo)簽,必須提供 module 屬性,用來(lái)指定當(dāng)前 wxs 的模塊名稱,方便在 wxml 中訪問(wèn)模塊中的成員。
.wxml中:
<view>{{m1.toUpper(username)}}</view> <wxs module="m1"> //將文本轉(zhuǎn)為大寫形式zs -> ZS module.exports.toUpper = function(str) { return str.toUpperCase() } </wxs>
wxs 代碼還可以編寫在以 .wxs 為后綴名的文件內(nèi),就像 javascript 代碼可以編寫在以 .js 為后綴名的文件中一樣。示例代碼如下:
//tools.wxs文件 function toLower(str) { return str.toLowerCase() } module.exports = { toLower: toLower }
在 wxml 中引入外聯(lián)的 wxs 腳本時(shí),必須為 標(biāo)簽添加 module 和 src 屬性,其中:
module 用來(lái)指定模塊的名稱
src 用來(lái)指定要引入的腳本的路徑,且必須是相對(duì)路徑
示例代碼如下:
<!--調(diào)用m2模塊中的方法--> <viewr>{{m2.toLower(country)}}</view> <!--引用外聯(lián)的tools.wxs腳本,并命名為 m2--> <wxs src=" ../../utils/tools.wxs " module="m2"></wxs>
(1)與 JavaScript 不同
為了降低 wxs(WeiXin Script)的學(xué)習(xí)成本, wxs 語(yǔ)言在設(shè)計(jì)時(shí)借大量鑒了 JavaScript 的語(yǔ)法。但是本質(zhì)上,wxs 和 JavaScript 是完全不同的兩種語(yǔ)言!
(2)不能作為組件的事件回調(diào)
wxs 典型的應(yīng)用場(chǎng)景就是“過(guò)濾器”,經(jīng)常配合 Mustache 語(yǔ)法進(jìn)行使用。但是,在 wxs 中定義的函數(shù)不能作為組件的事件回調(diào)函數(shù)。
(3)隔離性
隔離性指的是 wxs 的運(yùn)行環(huán)境和其他 JavaScript 代碼是隔離的。體現(xiàn)在如下兩方面:
①wxs 不能調(diào)用 js 中定義的函數(shù)
②wxs 不能調(diào)用小程序提供的 API
(4)性能好
①在 iOS 設(shè)備上,小程序內(nèi)的 WXS 會(huì)比 JavaScript 代碼快 2 ~ 20 倍
②在 android 設(shè)備上,二者的運(yùn)行效率無(wú)差異
關(guān)于“微信小程序視圖層的知識(shí)點(diǎn)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。