在项目的更目录下新建一个文件夹data,在该文件下新建data.js,将post,js文件中Onload函数下的postList数组的数据整体剪切到data.js文件中,从而避免污染业务层,将所有的内容都堆积在post.js文件中.
我们还需要使用module.exports向外部暴露一个接口。在data.js文件的最下部添加以下代码:module.exports = { postList:postList}
定义好模块后,接下来就可以在其他js文件中引用这个模块。
我们需要在post.js中引入data.js这个模块。
var dataObj = require("../../data/data.js")
;
代码中的require(path)将模块引入到post.js中,并将模块对象赋值给dataObj。随后在onLoad函数里取出postList数据,并进行数据绑定。
onLoad:function(){
this.setData({
postList:dataObj.postList
})
}
要使用模板,自然需要先新建模板文件。在/pages/post下新建目录post-item,作为模板文件目录。接着在该目录下新建2个文件:post-item-tpl.wxml和post-item-tpl.wxss。
来引用模板。对于templatePath路径
<import src="post-item/post-item-tpl.wxml"/>
//省略代码
<block wx:for="{{postList}}" wx:for-item="item" wx:for-index="idx" wx:key="key">
<template is="postItemTpl" data="{{item}}"></template>
</block>
(1)将post.wxss中同文章相关的样式(所有以post-开头的样式)全部剪切到post-item-tpl.wxss文件中,post.wxss文件只留下swiper组件相关的样式。
(2)在定义了postItemTpl后,我们需要在post.wxml中引用它。同样,当定义了模板的wxss文件后,也需要在post.wxss文件中引用它。引用样式文件的语法是@import “src”。
在页面的JS文件中,我们使用Page(object)来注册页面,并在object中指定页面的生命周期函数等。同样,可以在app.js文件中使用App(object)来注册小程序,并在object中指定小程序的生命周期函数等。
进过分析,最好的初始化数据库的时机是在应用程序启动时,在app.js中加入以下代码:
var dataObj = require("data/data.js");
App({
onLaunch:function(){
wx.setStorage({
data: dataObj.postList,
key: 'postList',
success:function(res){
//succss
},
fail:function(){
//fail
},
complete:function(){
//compete
}
})
},
})
上述代码中,首先通过require加载data.js文件作为初始化数据。在应用程序生命周期函数onLaunch里,使用wx.setStorage方法将初始化数据存入到小程序的缓存中。
所有的缓存操作方法还有一个同步的版本,用同步的方法来改写一下代码清单
var dataObj = require("data/data.js");
App({
onLaunch:function(){
wx.setStorageSync('postList', dataObj.postList);
},
})
App({
onLaunch:function(){
var storageData = wx.getStorageSync('postList');
if(!StorageData){
var dataObj = require("data/data.js");
wx.clearStorageSync();
wx.setStorageSync('postList',dataObj.postList);
}
},
})
wx.getStorageSync(key)这个方法可以获取指定key的缓存内容。如果指定key的缓存不存在,则说明数据库还没有初始化。那么此时首先使用wx.clearStorageSync()清除所有的缓存数据,接着再重新读取并设置初始化数据。
以上代码只有当缓存数据库不存在时,才通过require加载data.js文件,并初始化数据库。这样可以避免每次启动应用程序都重复初始化数据库。
虽然通常来说,require都是放在代码文件的顶部,但我们也可以在需要的时候才引用它。
本地缓存数据库,我们就初步建立完成了,后续内容我们还会持续完善这个数据库。
var DBPost = function(){
this.storageKeyName = "postList";//所有文章的缓冲键值}
DBPost.prototype={
getAllPostData:function(){
var res = wx.getStorageSync(this.storageKeyName);
if(!res){
res = require("../data/data.js").postList;
this.execSetStorageSync(res);
}
return res;
}, //本地缓存 保留/更新
execSetStorageSync:function(data){
wx.setStorageSync(this.storageKeyName,data);
}
};
module.exports={
DBPost:DBPost
};
上述代码首先定义了一个DBPost构造函数。在构造函数中,我们将post数据在缓存数据库中的key, postList,赋值给构造函数的this变量。注意,这个postList必须同app.js中我们初始化数据库时设置的文章数据的key相同,否则无法读取数据。
随后,我们在构造函数的原型链上添加一个对象,这个对象的所有属性和方法都会被构造函数的实例继承。eg:我们在这个对象中增加了一个getAllPostData方法,这个方法将可以获取缓存数据库中所有的文章数据。
在getAllPostData中,我们做了一个判断,如果缓存不存在将重新加载data.js数据文件,并存入到缓存数据库中。
最后,还是使用module.exports将DBPost输出。
现在,我们尝试在post.js中使用上一小节中定义的数据库操作类,将post.js代码更改一下
var DBPost = require("../../db/DBPost.js").DBPost;
Page({
data: {},
onLoad:function(){
var dbPost = new DBPost();
this.setData({
postList:dbPost.getAllPostData()
});
},
})
需特别注意的是,这里没有直接使用require加载data.js文件,因为data.js现在只是初始化数据,它已经在app.js中被装载到缓存数据库中。所以,我们现在require的是DB操作类所在的模块文件,通过这个类来操作文章数据。
代码第一行同样使用reuqire加载DBPost.js文件,并读取DBPost。
那么,如果要使用DBPost,必须先使用操作符“new”将DBPost实例化。实例化DBPost后,就可以调用该对象的getAllPostData方法,从而读取所有文章的缓存数据并绑定到postList中。
class DBPost{
constructor(url){
this.storageKeyName="postList";
}
getAllPostData(){
var res = wx.getStorageSync(this.storageKeyName);
if(!res){
res = require("../data/data.js").postList;
this.initPostList(res);
}
return res;
}
execSetStorageSync(data){
wx.setStorageSync(this.storageKeyName,data)
}
};
export{DBPost}
注意Class中定义的两个函数,它们是不需要function关键字的。同时,方法之间不要加“,”,否则会报错。
最后export输出语法也非常简洁,如export {DBPost};
接着,我们再看如何使用ES6版本的DBPost。
import {DBPost} from "../../db/DBPost.js";
Page({
data: {},
onLoad:function(){
var dbPost = new DBPost();
this.setData({
postList:dbPost.getAllPostData()
});
},
})
注意,这里不再使用require来加载DBPost.js这个文件,而是使用ES6导入模块的关键字import将DBPost导入进来。
在data.js文件中添加两篇文章
-注意:点击开发工具左侧的【缓存】按钮,随后在弹出的菜单中点击【清除数据缓存】,然后再编译项目,发现文章列表里已经有5篇文章了。