小程序开发实战:实现九宫格界面的导航的代码实现

发布时间 - 2026-01-10 22:39:27    点击率:

小程序是长在微信上的,是移动端的界面,为了能够更方便的使用,我们常常希望使用九宫格界面的方式作为导航,那要如何实现呢?

基于一个简单的思考,九宫格就是三行三列,如果把行作为一个单位,再将每一行分成三列,那是不是就可以了?我们实践一下。

首先来考虑九宫格数据的生成,每一个格子需要有一个图标、一个标题、一个便于跳转的路由,那天现在我们有九个页面,所以定义一个一维数组即可。为了更好的进行后续的配置,我们将这个数组独立到一个文件中routes.js,然后将其在index.js页面中引用,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页面中我们引用routes.js,然后得到数据PageItems,但PageItems是一维数组,而我们前面思考是要用一行三列为一个组的,所以需要将这一维数组进行重新组合,最直接的方法就是生成一个数组,每个数组的元素又包含了一个只有三个元素的一维数组,代码如下

//index.js 
//获取应用实例 
var app = getApp() 
var routes = require('routes'); 
Page({ 
 data: { 
  userInfo: {}, 
  cellHeight: '120px', 
  pageItems: [] 
 }, 
 //事件处理函数 
 onLoad: function () { 
  var that = this 
  console.log(app); 
  //调用应用实例的方法获取全局数据 
  app.getUserInfo(function (userInfo) { 
   wx.setNavigationBarTitle({ 
    title: '全新测试追踪系统-' + 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中,我们来布局界面,由于每一个格子都是一样的,只是数据不一样,所以想到用模板来呈现。为此,我们先做一个单元格的模板面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> 

这里看到两个大括号内套的是从外面传入的数据,然后在里面可以进行简单的逻辑判断,以便于更好的呈现。比如text==null的时候,我们希望呈现的是一个空背景的格子,在有数据的时候我们希望呈现一个含背景的格子,所以

复制代码 代码如下:
"{{text==null||text.length==0?'pages-icon-wrapper-no-bg':'pages-icon-wrapper'}}".

另外一点,由于我们是将该界面文件作为模板的,所以必须要用template标记来包住,同时命一个名字name,这样在引用模板的地方才可以识别调用。 现在我们在index.wxml中引用这个模板

<!--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来引用,在调用的地方使用template和is,其中is指定的是cell.wxml中的name。item[0]、item[1]、item[2]是循环传入的数据,cellHeight是在index.js的data中存放的数据。在将数据传入到模板内部时,框架会将其展开在字段的形式,即key-value对,所以再看cell.wxml文件,就会发现内部是直接使用key来作为数据的。 将数据呈现到界面之后,我们需要相当的样式来配合,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元素来呈现格子,所以每个格子自然就可以导航了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# 微信小程序开发九宫格  # 小程序  # 九宫格  # 微信小程序  # 微信小程序(应用号)简单实例应用及实例详解  # 微信小程序 实战小程序实例  # 微信小程序 参数传递详解  # 微信小程序 数据访问实例详解  # 微信小程序 实现列表刷新的实例详解  # 微信小程序 获取微信OpenId详解及实例代码  # 微信小程序 页面跳转传参详解  # 微信小程序 触控事件详细介绍  # 微信小程序入门教程  # 微信小程序 后台https域名绑定和免费的https证书申请详解  # 微信小程序(九)scroll-view组件详细介绍  # 的是  # 将其  # 要用  # 就可以  # 应用实例  # 这一  # 就会  # 是在  # 那是  # 那天  # 是从  # 才可以  # 作为一个  # 在里面  # 跳转  # 再看  # 更方便  # 再将  # 将该 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel观察者模式如何使用_Laravel Model Observer配置  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel如何自定义分页视图?(Pagination示例)  大连 网站制作,大连天途有线官网?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  香港服务器租用费用高吗?如何避免常见误区?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  太平洋网站制作公司,网络用语太平洋是什么意思?  JavaScript如何操作视频_媒体API怎么控制播放  进行网站优化必须要坚持的四大原则  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  JS经典正则表达式笔试题汇总  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel Fortify是什么,和Jetstream有什么关系  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何在IIS中配置站点IP、端口及主机头?  如何用IIS7快速搭建并优化网站站点?  lovemo网页版地址 lovemo官网手机登录  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  黑客如何通过漏洞一步步攻陷网站服务器?  Firefox Developer Edition开发者版本入口  高防服务器租用首荐平台,企业级优惠套餐快速部署  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  网易LOFTER官网链接 老福特网页版登录地址  Laravel如何使用模型观察者?(Observer代码示例)  怎样使用JSON进行数据交换_它有什么限制  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  微信小程序 scroll-view组件实现列表页实例代码  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  linux写shell需要注意的问题(必看)  简单实现Android文件上传  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  如何快速重置建站主机并恢复默认配置?  高防服务器租用指南:配置选择与快速部署攻略  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  javascript读取文本节点方法小结  EditPlus 正则表达式 实战(3)  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Java解压缩zip - 解压缩多个文件或文件夹实例  JavaScript如何实现继承_有哪些常用方法  Laravel如何实现数据库事务?(DB Facade示例)  高防服务器如何保障网站安全无虞?  使用spring连接及操作mongodb3.0实例