小程序開(kāi)發(fā)實(shí)戰(zhàn):實(shí)現(xiàn)九宮格界面的導(dǎo)航的代碼實(shí)現(xiàn)
小程序是長(zhǎng)在微信上的,是移動(dòng)端的界面,為了能夠更方便的使用,我們常常希望使用九宮格界面的方式作為導(dǎo)航,那要如何實(shí)現(xiàn)呢?
基于一個(gè)簡(jiǎn)單的思考,九宮格就是三行三列,如果把行作為一個(gè)單位,再將每一行分成三列,那是不是就可以了?我們實(shí)踐一下。
首先來(lái)考慮九宮格數(shù)據(jù)的生成,每一個(gè)格子需要有一個(gè)圖標(biāo)、一個(gè)標(biāo)題、一個(gè)便于跳轉(zhuǎn)的路由,那天現(xiàn)在我們有九個(gè)頁(yè)面,所以定義一個(gè)一維數(shù)組即可。為了更好的進(jìn)行后續(xù)的配置,我們將這個(gè)數(shù)組獨(dú)立到一個(gè)文件中routes.js,然后將其在index.js頁(yè)面中引用,routes放到index的目錄下。
var PageItems = [ { text: '格子1', icon: '../../images/c1.png', route: '../c1/c1', }, { text: '格子2', icon: '../../images/c2.png', route: '../c2/c2', }, { text: '格子3', icon: '../../images/c3.png', route: '../c3/c3', }, { text: '格子4', icon: '../../images/c4.png', route: '../c4/c4', }, { text: '格子5', icon: '../../images/c5', route: '../c5/c5', }, { text: '格子6', icon: '../../images/c6.png', route: '../c6/c6', }, { text: '格子7', icon: '../../images/c7.png', route: '../c7/c7', }, { text: '格子8', icon: '../../images/c8', route: '../c8/c8', }, { text: '格子9', icon: '../../images/c9.png', route: '../c9/c9', } ]; module.exports = { PageItems: PageItems }
在index.js頁(yè)面中我們引用routes.js,然后得到數(shù)據(jù)PageItems,但PageItems是一維數(shù)組,而我們前面思考是要用一行三列為一個(gè)組的,所以需要將這一維數(shù)組進(jìn)行重新組合,最直接的方法就是生成一個(gè)數(shù)組,每個(gè)數(shù)組的元素又包含了一個(gè)只有三個(gè)元素的一維數(shù)組,代碼如下
//index.js //獲取應(yīng)用實(shí)例 var app = getApp() var routes = require('routes'); Page({ data: { userInfo: {}, cellHeight: '120px', pageItems: [] }, //事件處理函數(shù) onLoad: function () { var that = this console.log(app); //調(diào)用應(yīng)用實(shí)例的方法獲取全局?jǐn)?shù)據(jù) app.getUserInfo(function (userInfo) { wx.setNavigationBarTitle({ title: '全新測(cè)試追蹤系統(tǒng)-' + userInfo.nickName, success: function (res) { // success } }) that.setData({ userInfo: userInfo }) var pageItems = []; var row = []; var len = routes.PageItems.length;//重組PageItems len = Math.floor((len + 2) / 3) * 3; for (var i = 0; i < len; i++) { if ((i + 1) % 3 == 0) { row.push(indexs.PageItems[i]); pageItems.push(row); row = []; continue; } else { row.push(indexs.PageItems[i]); } } wx.getSystemInfo({ success: function (res) { var windowWidth = res.windowWidth; that.setData({ cellHeight: (windowWidth / 3) + 'px' }) }, complete: function () { that.setData({ pageItems: pageItems }) } }) }) } })
在index.wxml中,我們來(lái)布局界面,由于每一個(gè)格子都是一樣的,只是數(shù)據(jù)不一樣,所以想到用模板來(lái)呈現(xiàn)。為此,我們先做一個(gè)單元格的模板面cell.wxml.
<template name="cell"> <navigator url="{{route}}" class="pages-item" style="height:{{cellHeight}}"> <view class="{{text==null||text.length==0?'pages-icon-wrapper-no-bg':'pages-icon-wrapper'}}" > <image src="{{icon}}" class="pages-icon"></image> </view> <view class="pages-text-wrapper"> <text class="pages-text">{{text}}</text> </view> </navigator> </template>
這里看到兩個(gè)大括號(hào)內(nèi)套的是從外面?zhèn)魅氲臄?shù)據(jù),然后在里面可以進(jìn)行簡(jiǎn)單的邏輯判斷,以便于更好的呈現(xiàn)。比如text==null的時(shí)候,我們希望呈現(xiàn)的是一個(gè)空背景的格子,在有數(shù)據(jù)的時(shí)候我們希望呈現(xiàn)一個(gè)含背景的格子,所以
"{{text==null||text.length==0?'pages-icon-wrapper-no-bg':'pages-icon-wrapper'}}".
另外一點(diǎn),由于我們是將該界面文件作為模板的,所以必須要用template標(biāo)記來(lái)包住,同時(shí)命一個(gè)名字name,這樣在引用模板的地方才可以識(shí)別調(diào)用。 現(xiàn)在我們?cè)趇ndex.wxml中引用這個(gè)模板
<!--index.wxml--> <import src="cell.wxml" /> <view class="pages-container"> <scroll-view scroll-y="true" class="pages-wrapper"> <view wx:for="{{pageItems}}" wx:key="{{text}}"> <view class="pages-row"> <template is="cell" data="{{...item[0],cellHeight}}" /> <template is="cell" data="{{...item[1],cellHeight}}" /> <template is="cell" data="{{...item[2],cellHeight}}" /> </view> </view> </scroll-view> </view>
模板的引用使用import來(lái)引用,在調(diào)用的地方使用template和is,其中is指定的是cell.wxml中的name。item[0]、item[1]、item[2]是循環(huán)傳入的數(shù)據(jù),cellHeight是在index.js的data中存放的數(shù)據(jù)。在將數(shù)據(jù)傳入到模板內(nèi)部時(shí),框架會(huì)將其展開(kāi)在字段的形式,即key-value對(duì),所以再看cell.wxml文件,就會(huì)發(fā)現(xiàn)內(nèi)部是直接使用key來(lái)作為數(shù)據(jù)的。 將數(shù)據(jù)呈現(xiàn)到界面之后,我們需要相當(dāng)?shù)臉邮絹?lái)配合,index.wxss代碼如下。
/**index.wxss**/ .pages-container { height: 100%; display: flex; flex-direction: column; box-sizing: border-box; padding-top: 10rpx; padding-bottom: 10rpx; } .pages-title-bg { width: 100%; } .pages-wrapper { } .pages-row { width: 100%; display: flex; flex-direction: row; justify-content: space-around; } .pages-item { position: relative; padding: 10rpx; width: 33%; background-color: #fff; border: #ddd solid 1px; } .pages-icon-wrapper { display: flex; justify-content: space-around; align-items: center; margin: 10rpx; border-radius: 30%; height: 75%; background:#00CD0D; } .pages-icon-wrapper-no-bg { display: flex; justify-content: space-around; align-items: center; margin: 10rpx; height: 75%; } .pages-icon { width: 100rpx; height: 100rpx; } .pages-text-wrapper { text-align: center; } .pages-text { font-weight: bolder; }
效果如下圖
我們模板中使用navigator元素來(lái)呈現(xiàn)格子,所以每個(gè)格子自然就可以導(dǎo)航了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 微信小程序(應(yīng)用號(hào))簡(jiǎn)單實(shí)例應(yīng)用及實(shí)例詳解
- 微信小程序 實(shí)戰(zhàn)小程序?qū)嵗?/a>
- 微信小程序 參數(shù)傳遞詳解
- 微信小程序 數(shù)據(jù)訪(fǎng)問(wèn)實(shí)例詳解
- 微信小程序 實(shí)現(xiàn)列表刷新的實(shí)例詳解
- 微信小程序 獲取微信OpenId詳解及實(shí)例代碼
- 微信小程序 頁(yè)面跳轉(zhuǎn)傳參詳解
- 微信小程序 觸控事件詳細(xì)介紹
- 微信小程序入門(mén)教程
- 微信小程序 后臺(tái)https域名綁定和免費(fèi)的https證書(shū)申請(qǐng)?jiān)斀?/a>
- 微信小程序(九)scroll-view組件詳細(xì)介紹
相關(guān)文章
javascript Number 與 Math對(duì)象的介紹
這篇文章主要介紹了javascript Number 與 Math對(duì)象,文章圍繞 Number 與 Math對(duì)象的相關(guān)資料展開(kāi)內(nèi)容,需要的朋友可以參考一下,希望對(duì)你有所幫助2021-11-11JavaScript深拷貝方法structuredClone使用
這篇文章主要為大家介紹了JavaScript深拷貝方法structuredClone使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02JavaScript前端學(xué)算法題解LeetCode最大重復(fù)子字符串
這篇文章主要為大家介紹了JavaScript前端學(xué)算法題解LeetCode最大重復(fù)子字符串,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09JS輕量級(jí)函數(shù)式編程實(shí)現(xiàn)XDM一
這篇文章主要為大家介紹了JS輕量級(jí)函數(shù)式編程實(shí)現(xiàn)XDM示例詳解第1/3篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06JS前端可擴(kuò)展的低代碼UI框架Sunmao使用詳解
這篇文章主要為大家介紹了JS前端可擴(kuò)展的低代碼UI框架Sunmao使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07可拖動(dòng)窗口,附帶鼠標(biāo)控制漸變透明,開(kāi)啟關(guān)閉功能
可拖動(dòng)窗口,附帶鼠標(biāo)控制漸變透明,開(kāi)啟關(guān)閉功能...2006-06-06微信小程序組件 contact-button(客服會(huì)話(huà)按鈕)詳解及實(shí)例代碼
這篇文章主要介紹了微信小程序組件 contact-button(客服會(huì)話(huà)按鈕)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01JavaScript設(shè)計(jì)模式之原型模式和適配器模式示例詳解
這篇文章主要為大家介紹了JavaScript 原型模式和適配器模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08TypeScript獲取二叉樹(shù)的鏡像實(shí)例
這篇文章主要為大家介紹了TypeScript獲取二叉樹(shù)的鏡像實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09