微信小程序 九宫格实例代码

微信小程序 九宫格

实现效果图:

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

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

首先来考虑九宫格数据的生成,每一个格子需要有一个图标、一个标题、一个便于跳转的路由,那天现在我们有九个页面,所以定义一个一维数组即可。为了更好的进行后续的配置,我们将这个数组独立到一个文件中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元素来呈现格子,所以每个格子自然就可以导航了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 微信小程序小组件 基于Canvas实现直播点赞气泡效果

    先发Canvas实现直播点赞气泡效果图: 实现细节: 1.JS: drawImage:function(data){[/align] var that = this var p10= data[0][0]; /* 三阶贝塞尔曲线起点坐标值*/ var p11= data[0][1]; /* 三阶贝塞尔曲线第一个控制点坐标值*/ var p12= data[0][2]; /* 三阶贝塞尔曲线第二个控制点坐标值*/ var p13= data[0][3]; /* 三阶贝塞尔曲线终点坐标值*/ var

  • 微信小程序 详解页面跳转与返回并回传数据

    微信小程序 详解页面跳转与返回并回传数据 A页面: .wxml文件 <view class="flex-wrp"> <text style="width: 32%;">选择城市</text> <input style="width: 68%;" type="text" bindtap="city" placeholder="请选择城市" valu

  • 微信小程序 开发中遇到问题总结

    微信小程序 开发中遇到问题总结 1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app.js的全局数据时,无法按顺序加载.例: //app.js App({ ajax:function(){ let that = this; wx.request({ url: 'https://a.com/url.php', method: 'GET', success: function(e){ that.data = 123; } }) }; }) //conte

  • 微信小程序 数据交互与渲染实例详解

    微信小程序 数据交互与渲染 实现效果图: 微信小程序的api中提供了网络交互的api,我们只要调用即可和后端进行数据交互,该api为wx.request.,具体代码如下. //list.js //获取应用实例 var app = getApp() Page({ data: { list:[], hiddenLoading: true, url: '' }, loadList: function () { var that = this; that.setData({ hiddenLoading:

  • 微信小程序中实现一对多发消息详解及实例代码

    微信小程序中实现一对多发消息详解及实例代码 微信小程序中各个界面之间的传值和通知比较蛋疼.所以模仿了iOS中的通知中心,在微信小程序中写了一套类似的通知中心. 通知中心可以做到:1对多发消息,传递object.使用十分简洁. 使用时,在需要接收消息的界面注册一个通知名.然后在需要发消息的界面post这个通知名就可以了.可以在多个界面注册同一个通知名.这样就可以1对多发消息. 使用方法: 1:在app.js中引用notification.js var notificationCenter = re

  • 微信小程序 Nginx环境配置详细介绍

    微信小程序Server环境配置详解 主要内容: 1. SSL免费证书申请步骤 2. Nginx HTTPS 配置 3. TLS 1.2 升级过程 微信小程序要求使用 https 发送请求,那么Web服务器就要配置成支持 https,需要先申请SSL证书 小程序也要求 TLS(传输层安全协议)的版本至少为 1.2,在配置好 https之后,如果 TLS 的版本较低,就涉及到升级问题 所以 Server端环境配置的主要步骤: 申请 SSL 证书 配置web服务器支持https(我使用的是nginx)

  • 微信小程序 this和that详解及简单实例

    微信小程序中,在wx.request({});方法调用成功或者失败之后,有时候会需要获取页面初始化数据data的情况,这个时候,如果使用,this.data来获取,会出现获取不到的情况,调试页面也会报undefiend.原因是,在javascript中,this代表着当前对象,会随着程序的执行过程中的上下文改变,在wx.request({});方法的回调函数中,对象已经发生改变,所以已经不是wx.request({});方法对象了,data属性也不存在了.官方的解决办法是,复制一份当前的对象,如

  • 微信小程序 弹幕功能简单实例

    1.微信小程序----弹幕的实现(无后台) 小程序刚刚出来,现在网上的demo是多,但是要找到一个自己需要的却不容易.今天跟大家分享自己写的一个弹幕功能. 效果图: 我的思路是这样的,先用<switch>标签确定是否打开弹幕,若打开弹幕则出现弹幕文本框和发射按钮,还有弹幕遮罩层. 先贴wxml和wxss代码. wxml代码如下: <!-- pages/index/index.wxml --> <swiper indicator-dots="{{indicatorDo

  • 微信小程序 九宫格实例代码

    微信小程序 九宫格 实现效果图: 小程序是长在微信上的,是移动端的界面,为了能够更方便的使用,我们常常希望使用九宫格界面的方式作为导航,那要如何实现呢? 基于一个简单的思考,九宫格就是三行三列,如果把行作为一个单位,再将每一行分成三列,那是不是就可以了?我们实践一下. 首先来考虑九宫格数据的生成,每一个格子需要有一个图标.一个标题.一个便于跳转的路由,那天现在我们有九个页面,所以定义一个一维数组即可.为了更好的进行后续的配置,我们将这个数组独立到一个文件中routes.js,然后将其在index

  • 微信小程序 参数传递实例代码

    微信小程序 参数传递实例代码 1.通过事件传递参数 实例代码: <view data-id="103" bindtap="evenName"></view> Page({ evenName: function(e) { //获得点击事件传递的id console.log(e.target.dataset.id); })  2.通过页面跳转传递参数 页面1: wx.navigateTo({ url: '/pages/scan-order/sca

  • 微信小程序 石头剪刀布实例代码

    微信小程序 石头剪刀布 昨天看有个石头剪刀布的练习,就拿出来做了一下,布局的代码浪费了很多时间,果然CSS这块的还不是很熟练,下面直接上图上代码了. .js: var numAi = 0 var timer Page({ data:{ //控制按钮是否可点击 btnState:false, //记录获胜次数 winNum:0, //中间的话"Ho~ You Win" gameOfPlay:'', //用户选择的图片 imageUserScr:'/pages/image/wenhao.p

  • 微信小程序日历插件代码实例

    这篇文章主要介绍了微信小程序日历插件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.wxml代码 <view class="timePick"> <picker mode="date" fields="month" value="{{timestamp}}" start="1999-01-01" end="2999-

  • 微信小程序 navbar实例详解

    微信小程序 navbar实例详解 实现效果图: data typeList: [ { name: "日报", id: "1" }, { name: "周报", id: "2" }, { name: "月报", id: "3" }, { name: "目录", id: "4" }] js that.setData({ dateValue: util.

  • Python简单基础小程序的实例代码

    1 九九乘法表 for i in range(9):#从0循环到8 i += 1#等价于 i = i+1 for j in range(i):#从0循环到i j += 1 print(j,'*',i,'=',i*j,end = ' ',sep='') # end默认在结尾输出换行,将它改成空格 sep 默认 j,'*',i,'=',i*j 各元素输出中间会有空格 print()#这里作用是输出换行符 i = 1 while i <= 9: j = 1 while j <= i: print(&

  • 微信小程序计算器实例详解

    微信小程序计算器实例,供大家参考,具体内容如下 index.wxml <view class="content"> <view class="num">{{num}}</view> <view class="operotor">{{op}}</view> </view> <view class="entry"> <view> <

  • Python爬取微信小程序通用方法代码实例详解

    背景介绍 最近遇到一个需求,大致就是要获取某个小程序上的数据.心想小程序本质上就是移动端加壳的浏览器,所以想到用Python去获取数据.在网上学习了一下如何实现后,记录一下我的实现过程以及所踩过的小坑.本文关键词:Python,小程序,Charles抓包 目标小程序: 公众号"同城商圈网"左下角"找商家"->汽车维修->小车维修->所有的商家信息,如下图所示: 环境 PC端:Windows 10 移动端:iPhone 软件:Charles Char

  • 微信小程序 实战实例开发流程详细介绍

    前言:         微信小程序最近要发布了,抽空学习下如何开发,在网上找到的实例,觉得不错,给大家分享, 前后两天花了大约四五个小时制作完了自己第一个小程序,当然是没法发布的,小程序的发布要求还是挺严格的:企业资质.HTTPS.审核. 先大概介绍下自己,我9年前和很多网友一样开始自学编程,这些年来什么语言都学过.什么平台都接触过,自己也做过十来个产品,所以编程基础不是很稳固但是各方面都相对比较熟悉,因此在接触小程序的时候上手比较快. 至于为什么现在选择开发小程序,原因很简单,尝尝鲜! 学习

  • 微信小程序实现全局搜索代码高亮的示例

    需求 最近在做微信小程序的时候,需要实现在搜索框的输入内容的时候实现全局匹配实现高亮效果,目前的思路是,递归后台来返回的数据,并将对象的value值替换为需要的dom节点,并且通过rich-text来实现,高亮效果. 代码 wxml: <view class='homePage'> <input bindinput="bindKeyInput"></input> <view wx:for="{{newJson}}" wx:f

随机推荐