小程序从0到1:微信全栈工程师一本通
上QQ阅读APP看书,第一时间看更新

2.1 从splash功能开始

首次进入某些App时,通常在界面的底部有三个面板指示点,分别对应于三张图片,可以左右滑动查看。

本节将以实现这个功能来开启小程序的实践之旅。

2.1.1 创建项目

接下来开始逐步实现splash功能,首先打开微信开发者工具,单击“+”号按钮创建新项目,如图2-1所示。

图2-1

相关参数在图2-1中已有展示,需要注意的是,“项目目录”必须选择一个空目录,“AppID”和“项目名称”需要根据自己的实际情况来填写,然后单击“添加项目”按钮。

之后,单击工具栏中的“详情”按钮,得到图2-2所示的界面。

图2-2

在图2-2中,选中框线中的所有复选框,特别是其中的“开发环境不检验请求域名”、TLS版本以及HTTP证书。如果不选中该复选框,那么请求豆瓣API将会失败。

操作完成,至此即成功创建了一个新的项目。

2.1.2 隐藏模拟器

在创建项目之后,我们就来完成这项操作。在微信开发者工具中,单击工具栏中的“编辑”按钮,切换到编辑状态,如图2-3所示。

图2-3

单击左上角的手机图标,使得模块器在编辑模式下隐藏,此举将便于编辑代码。如果需要预览,请切换至调试模式。

2.1.3 快捷创建页面

创建新页面的常用方法有以下两种:

第一种方法是在文档树中单击打开app.json文件,如图2-4所示。

图2-4

app.json是小程序的全局配置文件,在这个文件中可以设置页面路径、窗口样式、网络超时时间及tarBar等。

在打开的app.json文件中,将光标定位在“pages/index/index”这一行,同时按<Alt+Shift+Down>组合键两下,复制出两行新的“pages/index/index”。将新复制的两行分别修改为“pages/douban/index”和“pages/douban/splash”,如图2-5所示。

图2-5

因为在1.2节中已经设置了编辑器自动保存文件,所以此处无须保存。

在文档树中单击展开pages目录,可以看到文件已经自动生成,如图2-6所示。

图2-6

使用这种方法可以显著提高新建page页面文件的效率。

第二种标准的新建页面的方法如图2-7所示。

图2-7

首先,在文档树中点选目标后面的“…”选项按钮;其次,单击“新建”;最后,选择新建的文件类型。

这种方法比较麻烦、低效,建议直接使用快捷自动创建法。至于自动生成的.json与.wxss文件,如果用不到也不用删除。项目在上传过程中会自动压缩,无须介意这些空文件。如果要用到.json页面配置文件,则省去了再次创建的麻烦。

2.1.4 引用sim.js类库

sim.js类库是笔者开发的一个开源类库,旨在帮助初学者快速开发小程序前端。

在电脑上打开https://github.com/rixingyike/sim.js,或者直接扫描下方的二维码,下载sim.js类库压缩包。

打开github页面,单击Download Zip按钮,下载源码包,如图2-8所示。

图2-8

另外还有一种方法,即在命令行终端中使用git clone指令下载源码,这种方法更普遍,稍后会有介绍。

现在将下载的源码,解压至豆豆电影小程序的根目录之下,如图2-9所示。

图2-9

然后在文档树中打开app.js文件,在顶部引用sim.js类库:

    let app = require("./sim.js/index.js")

将第4行代码

    App({

替换为

    App(Object.assign(app, {

将最后一行替换为:

    }))

经过以上步骤,sim.js引入完毕。这两步注入将sim.js类库提供的工具类方法,附在了App对象之上。在接下来的开发中,通过getApp()来获取App对象将能通过它使用sim.js类库提供的这些方法。

let是JS语言声明变量的关键字,关于变量的更多信息,请参见本书的15.1.1节。

2.1.5 实现splash效果

首先,在文档树中打开pages/douban/splash.wxml文件,将代码修改为:

    <swiper style="height: 100%; width: 100%; " indicator-dots>
        <swiper-item wx:for="{{ subjects }}" wx:key="{{ item.id }}" style="flex: 1; ">
            <image src="{{ item.images.large }}" mode="aspectFill" style="position:
                absolute; height: 100%; width: 100%; opacity: .8; " />
        </swiper-item>
    </swiper>

这里使用了swiper组件,其中的indicator-dots是布尔属性,不需要填写任何值,仅仅放在那里就能表示其值为true,与填写任何值均等效。

swiper-item是swiper组件的子项,有多少张图片便有多少个子项。它的宽高会被自动设置为100%,所以无须重复设置。对全屏起决定性作用的,则是swiper的style属性,它将宽高均设置为100%。关于swiper组件的更多内容,请参见本书的11.3节。

image组件的mode属性,用于设置图像的缩放策略。aspectFill是最常用的缩放模式,它会保持一定的比例将图片完整地显示出来。关于image组件的更多内容,请参见本书的14.3节。

然后,在文档树中打开pages/douban/splash.js文件,将代码修改为:

    // pages/douban/splash.js
    Page({
        data: {
            subjects: [],
        },
        onLoad(options) {
            let app = getApp()
                app. request("https://api.douban.com/v2/movie/coming_soon? start=
                    0&count=3").then(
                data => {
                    this.setData({ subjects: data.subjects })
                }
            )
        }
    })

在上述代码中,subjects是wxml代码中用于数据绑定的数组。这里使用了app.request方法,用于请求豆瓣的API。获取到数据之后,即可使用setData方法渲染视图。这里的setData会实现如下两个功能。

❑ 保存数据至subjects变量。

❑ 通知页面视图,若数据有更新,则进行渲染。

在app.request()方法返回的对象上调用then方法,是处理接口调用成功之后的逻辑。then方法接受一个函数为参数,笔者在这里传入的是使用箭头符号简写的匿名函数。关于箭头函数,参见本书的15.2.9节。

在2.1.4节引用sim.js类库,就是为了此时在这里使用。2.1.4节通过注入方法修改了默认的App定义,是为了把sim.js类库的request方法加到App对象上。选择App对象注入,可以最大限度地减少项目对框架的注入依赖。

在任何页面,只要能通过getApp()取得全局唯一的App对象,就可以使用sim.js类库的功能。

1.如何设置首页

在文档树中打开app.json文件,将光标定位到图2-10所示的这一行。

图2-10

同时按下<Command+Up>(或<Ctrl+Up>)组合键,将“pages/douban/splash”移至首行,因为首行意味着首页。

2.如何添加样式

此时已将“pages/douban/splash”设置为首页,同时按下<Command+B>组合键(或<Ctrl+B>组合键)刷新项目,什么都看不到。为什么?接下来将通过调试面板来寻找原因。

在调试工具区域,切换至wxml面板,可以看到已经渲染了三个swiper-item,如图2-11所示。

图2-11

但是swiper的高度为0。这是因为在小程序中,page容器的高度默认是0。将swiper组件的高度样式设置为100%是无用的,因为父容器没有高度。

解决办法很简单,在文档树中打开app.wxss文件,在尾部添加以下样式:

    page{
        height: 100%;
        background-color: #f9f9f9;
    }

这里除了高度以外,还添加了一个浅灰色的背景色。浅灰色的默认背景有助于设计产品的UI。

再次按下<Command+B>组合键(或<Ctrl+B>组合键)刷新项目,功能已然正常。之前没有显示,是因为swiper容器没有获得足够的高度,我们通过调试面板查出了问题所在。善用调试面板,有助于在开发中快速找到出错的缘由。

2.1.6 下载源码

在本节的学习过程中,如果遇到问题,可以通过如下方式来解决。

❑ 加入小程序微信群与作者以及其他读者一同探讨。微信扫描前言中的二维码,关注“艺述思维”,发送“小程序”进群。

❑ 下载作者的源码,对照查找问题。在公众号发送“豆豆电影2.1”获取下载地址。