小程序的模板化编程

笔记内容:小程序的模板化编程
笔记日期:2018-01-08

将业务中的数据分离到单独的数据文件中

之前编写的新闻列表页面中,我们把示例数据都放在了js文件中,但实际上数据是不应该写在js文件中的,所以我们得把这些数据分离到一个单独的数据文件中。然后post.js文件就加载这个数据文件中的数据即可,这样也可以模拟一下加载服务器数据的过程。

1.新建一个data目录,并在该目录下创建一个.js文件:

2.将数据剪切到该新建的文件中:

// 将数据整合成数组类型
var local_database = [
  {
    date: "Jan 06 2018",
    title: "正是虾肥蟹壮时",
    imgSrc: "/images/post/crab.png",
    avatar: "/images/avatar/1.png",
    content: "“山明水净夜来霜,数树深红出浅黄。试上高楼清入骨,岂如春色嗾人狂。”金秋时节,天高云淡,秋风送爽,气候宜人。秋风秋阳中,硕果坠挂枝头,玉米抚须含笑,高粱引颈高歌,豆荚饱满圆润。",
    reading: "112",
    collection: "96",
  },
  {
    date: "Jan 03 2018",
    title: "比利·林恩的中场战事",
    imgSrc: "/images/post/bl.png",
    avatar: "/images/avatar/2.png",
    content: "伊拉克战争时期,来自美国德州的19岁技术兵比利·林恩(乔·阿尔文 Joe Alwyn 饰)因为一段偶然拍摄的视频而家喻户晓。那是一次规模不大却激烈非常的遭遇战,战斗中林恩所在的B班班长(范·迪塞尔 Vin Diesel 饰)遭到当地武装分子的伏击和劫持,而林恩为了营救班长不惜铤而走险冲锋陷阵。",
    reading: "92",
    collection: "65",
  },
  {
    date: "Jan 05 2018",
    title: "肖申克的救赎",
    imgSrc: "/images/post/xs.jpg",
    avatar: "/images/avatar/3.png",
    content: "20世纪40年代末,小有成就的青年银行家安迪(蒂姆·罗宾斯 Tim Robbins 饰)因涉嫌杀害妻子及她的情人而锒铛入狱。在这座名为肖申克的监狱内,希望似乎虚无缥缈,终身监禁的惩罚无疑注定了安迪接下来灰暗绝望的人生。",
    reading: "92",
    collection: "65",
  },
  {
    date: "Jan 01 2018",
    title: "霸王别姬",
    imgSrc: "/images/post/bj.jpg",
    avatar: "/images/avatar/4.png",
    content: "段小楼(张丰毅)与程蝶衣(张国荣)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向配合天衣无缝,尤其一出《霸王别姬》,更是誉满京城,为此,两人约定合演一辈子《霸王别姬》。但两人对戏剧与人生关系的理解有本质不同,段小楼深知戏非人生,程蝶衣则是人戏不分。",
    reading: "92",
    collection: "65",
  },
  {
    date: "Jan 08 2018",
    title: "这个杀手不太冷",
    imgSrc: "/images/post/ss.jpg",
    avatar: "/images/avatar/5.png",
    content: "里昂(让·雷诺饰)是名孤独的×××,受人雇佣。一天,邻居家小姑娘马蒂尔达(纳塔丽·波特曼饰)敲开他的房门,要求在他那里暂避杀身之祸。原来邻居家的主人是警方缉毒组的眼线,只因贪污了一小包×××而遭恶警(加里·奥德曼饰)杀害全家的惩罚。",
    reading: "92",
    collection: "65",
  },
  {
    date: "Jan 04 2018",
    title: "阿甘正传",
    imgSrc: "/images/post/ag.jpg",
    avatar: "/images/avatar/1.png",
    content: "阿甘(汤姆·汉克斯 饰)于二战结束后不久出生在美国南方阿拉巴马州一个闭塞的小镇,他先天弱智,智商只有75,然而他的妈妈是一个性格坚强的女性,她常常鼓励阿甘“傻人有傻福”,要他自强不息。",
    reading: "92",
    collection: "65",
  },
]

这个文件实际上充当了一个本地数据库,到时候脚本文件从这个文件中加载数据即可。注意:我把一些属性名称更改了,wxml文件中的名称也要跟着更改。


使用require方法加载js模块文件

1.在数据文件中增加以下代码,设置一个数据出口:

// 设置一个数据出口,当前这个文件相当于是一个js模块
module.exports = {
  // 输出的是一个Array对象
  postList: local_database,
}

2.然后在脚本文件中通过require方法加载js模块文件:

// 注意:这里只能使用相对路径
var postsData = require(‘../../data/posts-data.js‘)

Page({
  data: {
  },

  onLoad: function (options) {
    this.setData({
      // 通过postsData来拿到postList对象
      posts_key: postsData.postList
    });
  },
})

以上就完成了数据与逻辑的分离,在我们平时开发中,应尽量避免这种数据与逻辑或者逻辑与视图代码混杂在一块的情况。

关于setData方法的一些问题:
1.直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致。
2.单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。
3.请不要把 data 中任何一项的 value 设为 undefined ,否则这一项将不被设置并可能遗留一些潜在问题。


template模板的使用

之前我们使用for循环改写了新闻列表页面,解决了重复代码的问题,但是使用for循环只能解决当前页面代码重复的问题,如果别的页面也要使用相同的代码的话,就无法使用for循环来解决了。不过小程序给我们提供了一个template模板,使用template模板就能解决这种问题。因为template可以让多个页面共享一个模板文件中的代码,如果熟悉23种设计模式的话,就应该知道这种模式类似于模板设计模式。

1.在posts目录下创建一个目录,并在该目录下创建一个wxml和wxss文件:

注:js文件无法作为模板文件,即便创建了也不会运行,因为小程序没有模块化的编程,只有模板化的编程

2.将post.wxml中需要被复用的代码剪切到post-item-template.wxml模板文件中:

<!-- 模板文件需要使用template标签包围 -->
<template name="postItem">
  <view class=‘post-container‘>
      <view class=‘post-author-date‘>
        <image src=‘{{item.avatar}}‘ class=‘post-author‘></image>
        <text class="post-date">{{item.date}}</text>
      </view>
      <text class=‘post-title‘>{{item.title}}</text>
      <image class=‘post-image‘ src=‘{{item.imgSrc}}‘></image>
      <text class=‘post-content‘>{{item.content}}</text>
      <view class=‘post-like‘>
        <image src=‘../../images/icon/chat.png‘ class=‘post-like-img‘></image>
        <text class=‘post-like-font‘>{{item.reading}}</text>
        <image src=‘../../images/icon/view.png‘ class=‘post-like-img‘></image>
        <text class=‘post-like-font‘>{{item.collection}}</text>
      </view>
    </view>
</template>

3.接着在post.wxml中引入模板文件,代码如下:

<!-- 通过import标签引入模板文件,可以使用相对路径也可以使用绝对路径 -->
<import src="post-item/post-item-template.wxml" />
<view>
  <!-- 需要在父节点里定义宽高,indicator-dots属性指定显示轮播图的小点,纵向滚动则使用vertical属性 -->
  <swiper indicator-dots=‘true‘ autoplay=‘true‘ interval=‘5000‘>
    <!-- 每一项里都放了一个图片 -->
    <swiper-item>
      <!-- 使用绝对对路径 -->
      <image src=‘/images/wx.png‘></image>
    </swiper-item>
    <swiper-item>
      <image src=‘/images/vr.png‘></image>
    </swiper-item>
    <swiper-item>
      <image src=‘/images/iqiyi.png‘></image>
    </swiper-item>
  </swiper>

  <!-- wx:for需要接收一个数组、集合类型的值,wx:for-item用于设置一个变量来代表子元素 -->
  <!-- wx:for-index用于设置一个变量来代表下标值 -->
  <block wx:for="{{posts_key}}" wx:for-item="item" wx:for-index="index" >
    <!-- is的值是模板文件中定义的模板名称,data是将循环出来的子元素对象传递到模板文件中 -->
    <template is="postItem" data="{{item}}" />
  </block>
</view>

4.以上完成了wxml代码的模板,现在还需要把一些可复用的wxss代码也做成模板,首先剪切post.wxss样式文件中的代码到模板文件中:
post-item-template.wxss文件内容如下:

.post-author-date{
  margin: 10rpx 0px 20rpx 10rpx ;
}
.post-author{
  width: 30px;
  height: 60rpx;
  vertical-align: middle;
}
.post-date{
  margin-left: 20rpx;
  vertical-align: middle;
  margin-bottom: 5px;
  font-size: 26rpx;
}
.post-title{
  font-size: 34rpx;
  font-weight: 600;
  color: #333;
  margin-bottom: 10px;
  margin-left: 10px;
}
.post-image{
  margin-left: 16px;
  width: 100%;
  height: 340rpx;
  margin: auto 0;
}
.post-content{
  color: #666;
  font-size: 28rpx;
  margin-bottom: 20rpx;
  margin-left: 20rpx;
  letter-spacing: 2rpx;
  line-height: 40rpx;
  margin-top: 15px;
}
.post-like{
  font-size: 13px;
  flex-direction: row;
  line-height: 16px;
  margin-left: 10px;
}
.post-like-img{
  height: 16px;
  width: 16px;
  margin-right: 8px;
  vertical-align: middle;
}
.post-like-font{
  vertical-align: middle;
  margin-right: 20px;
}

5.然后在post.wxss文件里引用模板样式:

<!-- 使用@import来引用模板样式 -->
@import "post-item/post-item-template.wxss";

swiper{
  width:100%;
  height:600rpx
}

swiper image{
  width:100%;
  height:600rpx
}
.post-container{
  display: flex;
  flex-direction: column;
  margin-top:20rpx;
  margin-bottom: 40rpx;
  background-color: #fff;
  border-bottom: 1px solid #ededed;
  border-top: 1px solid #ededed;
  padding-bottom: 5px;
}

完成以上操作后,我们就构建了两个模板——wxml模板以及wxss模板,在这之后哪个页面文件需要复用这些样式或wxml代码就只需引入相应的模板即可。通过这种模板化的编程就很好的提高了代码的复用性,可惜小程序不支持模块化,不然就可以把一些可复用的js代码做成模板,这样就可以再进一步的进行代码的复用了。

原文地址:http://blog.51cto.com/zero01/2058738

时间: 2024-10-05 04:16:41

小程序的模板化编程的相关文章

微信小程序开发模板消息的时候 出现 errcode: 41028, errmsg: &quot;invalid form id hint:

小程序开发模板消息的时候  出现 errcode: 41028, errmsg: "invalid form id hint: 我是使用的微信支付发送模板消息,提示的formid无效的 大家知道获取到的prepay id 还非常的诡异  他不是直接一个参数 而是还带了字符串 比如 prepay_id=wx2017xx 这样格式的 那传递到微信模板消息这里的formid上要怎么传值呢? 最后检验是需要去除掉prepay id 这个字符串的  然后传递过去就可以了 然后,还会有提示无效的,就是没有支

微信小程序发送模板消息(最通俗易懂)

公司需要用到微信小程序推送   经过一下午的资料查阅,得出以下经验. 首先得去微信公众平台小程序的模板消息  创建模板  也能通过接口去创建,但是我觉得挺麻烦的  还不如去后台创建 下面是我写的测试代码,只有具体数据都是测试的模拟数据,实际业务肯定需要拿到业务数据,大家后面可以自我发挥. 对了,还有一点,电脑的小程序的开发工具是拿不到formid 的  会提示 the formId is a mock one ,只能用手机测试才能拿到formid 下面看代码吧: 这个是前台页面 1 <butto

小程序自定义模板的正确使用方式

最近在做小程序项目开发,遇到一些公用的模块就顺便使用了自定义的模板,渲染模板数组的时候遇到了一些问题: template.wxml <template name="primary"> <button class='btn-class' type='primary'>{{button.con}}</button> </template> <template name="warn"> <button cl

微信小程序之模板消息推送

最近在用sanic框架写微信小程序,其中写了一个微信消息推送,还挺有意思的,写了个小demo 具体见官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html 文档其实写的很详细清除了,包括返回数据的类型,报错信息 大致流程就是:调用微信小程序的接口,获取access_token,然后再调用发送模板信息的接口,发送消息 获取access_t

8步安装多多客小程序全插件化1.0开源版

多多客(doodooke)小程序开源版 多多客免费开源的小程序SaaS系统,koa.js + vue.js插件化最佳实践. 安装部署 开发环境安装1.手动下载zip代码或者使用命令下载git clone https://gitee.com/doodooke/doodoo.git2.进入代码根目录,然后执行命令安装依赖yarn install3.进入mysql数据库,创建doodoo数据库4.首先修改.env?.env.web数据库配置文件,其他配置项可稍后配置5.执行命令启动npm run de

小程序最最最基础编程之计时器使用

对于JS编程高手可略过此文,仅供新手学习参考. 问题 打开微信小程序,随便创建一个页面(不妨设置为test).然后,在test.js文件中加入如下代码: data: {times: 0}, /** 生命周期函数--监听页面加载*/onLoad: function (options) {var that = this; var term = setInterval(function () {console.log('times:',that.data.times);if (that.data.ti

微信小程序之模板的使用

初步学习小程序模板,就把过程写一下了. 1.在app.json里面注册temlate/public,生成模板wxml,wxss等系列页面 2.注册模板 <1>无数据传参的模板 <template name="hello"> <view>hello world!</view> </template> <2>带数据传参的模板 <template name="hello2"> <vi

小程序开发之socket编程 小程序直播答题开发的直播弹幕使用web socket编程

最近有一个项目很火,那就是直播答题的,接到公司的这个任务,开发直播答题的聊天室功能.在线的人相互聊天.之前做过类似的,当时都是使用的ajax轮询的,这种非常的耗费服务器.所以这次就开始使用socket来做,我主要负责后端开发,主要就是配合前端做一些接口. 小程序前端使用微信的空间 wx.connectSocket  做好相关的wss配置,然后我这边使用PHP来做socket 服务读写. 公司采用的是gateway worker 具体不多说,大家可以看他的文档哈,我就直接上代码了 GatewayW

微信小程序消息模板

前段时间研究了下微信模板消息:服务通知(开发api: https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html) 我在过程中遇到的keng,就是post传的 form_id(前提就是在微信后台已经添加了消息模板) form_id    表单提交场景下,为 submit 事件带上的 formId:支付场景下,为本次支付的 prepay_id 1.表单提交场景下(需在真机上运行) <form bindsubmit="formSubmit