小程序之入门布局篇

前言

阅读这篇文章你将学到:

  • 快速启动一个小程序项目
  • 快速上手小程序重构业务
  • 在页面布局中遇到的一些坑
  • 使用mpvue框架进行快速开发

基础

起步

安装

安装微信web开发者工具,根据自己的操作系统下载对应的安装包进行安装,有关开发者工具更详细的介绍可以查看《开发者工具介绍》

注册

当打开微信开发者工具后,会需要我们填写AppID,点击注册申请AppID

1.png

将申请好的AppID复制填入相应位置,根据相应提示即可成功创建一个项目。

2.png

工具

如下图所示:

  • ①预览模拟器
  • ②调试工具
  • ③编译模式
    • 可保存当前页的调试
  • ④手机预览
    • Ctrl+Shift+P为快捷键,可不必拿手机扫码预览
  • ⑤目录树
    • 文件操作
      • 1.在pages下新建一个文件夹后,可右键点击page生成4个模板页面wxml、wxss、js、json
      • 2.在app.json的pages字段,添加需要新建的页面路径,也会自动生成改页面所需要的文件
  • ⑦ 小程序主题样式
    • 可配置标题栏的背景色和文字颜色
    • 输入window可自动补全
  • ⑧ 底部菜单栏
    • 输入tabBar可自动补全
3.png

代码构成

JSON配置

在项目的根目录有一个app.json和project.json,此外在页面pages/index目录下还有一个index.json,下面依次说明一下他们的用途。

开发者工具配置

工具配置 project.config.json

在使用一个工具的时候,会做一些个性化的配置,例如界面的颜色、编译配置、快捷键等等,当我们重装这个工具的时候,就又要重复配置一次,很麻烦。所以这个project.config.json用来记录开发者工具的信息,比较常用的一点是,这个文件可以记录项目名称、AppId,就不用去询问技术同事AppID是多少,他们只需将我们的微信号添加为开发者,则可启动小程序。project.config.json部分配置如下:

{
    "description": "项目配置文件",
    "packOptions": {
        "ignore": []
    },
    "setting": {
        "urlCheck": true,
        "es6": true,
        "postcss": true,
        "minified": true,
        "newFeature": true
    },
    "compileType": "miniprogram",
    "libVersion": "2.3.0",
    "appid": "wxdfee0be3b147059f",
    "projectname": "stream",
    "debugOptions": {
        "hidedInDevtools": []
    }
}

其他配置项细节可以参考文档 开发者工具的配置

全局配置

小程序全局配置app.json
app.json是当前小程序的全局配置,包括了小程序所有的页面路径、界面表现、网络超过时间、底部tab切换等。app.json内容如下:

{
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":{
    backgroundColor:#000,
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle":"black"
  },
  "tabBar": {
    "list": [
        {
          "pagePath": "pages/index/index",
          "text": "首页"
        },
        {
          "pagePath": "pages/logs/logs",
          "text": "日志"
        }
    ]
  },
}
  • 1.pages字段
    • 用于描述当前小程序所有页面路径
  • 2.window字段
    • 定义小程序所有页面的下拉背景颜色(可将此背景颜色设置与主页面背景颜色一致)、导航栏背景颜色、文字颜色等。
  • 3.tabBar
    • 底部tab栏的表现

以上字段均可自动补全,其他配置项细节可以参考文档 小程序的配置 app.json

页面配置

页面配置 page.json

这个的page.json指的是pages/index.json这类的相关配置。例如,index.json只能配置app.json中"window"字段,且页面配置会覆盖app.json中的"window"字段

WXML模板

WXML(WeiXin Markup Language)是框架设计的一套标签语言,在小程序中,WXML充当HTML的角色,描述当前页面的结构。

数据绑定

通过 {{ }} 的语法把一个变量绑定到界面上,我们称为数据绑定。
数据绑定的方式,提倡把渲染和逻辑分开,简单来说就是不要让JS直接操控DOM,WXML只管渲染,JS只需要管理状态即可,WXML中动态数据均来自于Page中的data,如以下代码:

WXML :

<view> {{ message }} </view>

WXS:

Page({ // Page能够自动补全
  data: {
    message: '你好呀!'
  },
  onLoad: function (options) {
   this.setData({ 
    msg: "我很好!" 
   })  
  },
})

列表渲染

wx:for

在组件上使用 wx:for 控制属性绑定一个数组,默认数组的当前项下标默认为index,数组当前项变量名为item,如下代码:

WXML

<view wx:for="{{array}}">
  {{index}}: {{item.message}}
</view>

WXS

Page({
  data: {
    array: [
        {
          message: 'foo',
        },
        {
          message: 'bar'
        }
    ]
  }
})

如果你不想使用默认的index和item,可以使用小程序提供的wx:for-index,指定当前下标变量名,使用wx:for-item指定当前项变量名,如下代码:

WXML

<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
  {{idx}}: {{itemName.message}}
</view>

wx:for 也可以嵌套,下边是一个九九乘法表,代码如下:

WXML

<view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="i">
  <view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="j">
    <view wx:if="{{i <= j}}">
      {{i}} * {{j}} = {{i * j}}
    </view>
  </view>
</view>

wx:key
如果列表中项目的位置会动态改变,或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征(如<input/>中输入内容,<switch/>的选中状态),需要使用wx:key来指定列表中项目的唯一标识符。

如果不提供wx:key,会报一个warning,如果明确知道列表是静态的,或者不必关注其顺序,可以选择忽略

5.png

当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。

所以当有循环的时候,建议还是要加上wx:key。

条件渲染

wx:if

因为 wx:if 是一个控制属性,需要将它添加到一个标签上。如果要一次性判断多个组件标签,可以使用一个 <block/> 标签将多个组件包装起来,并在上边使用 wx:if 控制属性。

<block wx:if="{{true}}">
  <view> view1 </view>
  <view> view2 </view>
</block>

注意: <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

引号变量

组件属性、控制属性、关键字属性均需要在双引号之内,否则会报错,如下代码:

WXML

<view id="item-{{id}}">组件属性</view>
<view wx:if="{{condition}}">控制属性</view>
<checkbox checked="{{false}}">关键字</checkbox>

WXS

Page({
  data: {
    id: 0,
    condition: true,
  }
})

特别注意:不要直接写 checked="false",其计算结果是一个字符串,转成 boolean 类型后代表真值。

WXSS样式

WXSS 具有 CSS 大部分的特性,小程序在 WXSS 也做了一些扩充和修改。

新增了尺寸单位。在写 CSS 样式时,开发者需要考虑到手机设备的屏幕会有不同的宽度和设备像素比,采用一些技巧来换算一些像素单位。WXSS 在底层支持新的尺寸单位 rpx ,开发者可以免去换算的烦恼,只要交给小程序底层来换算即可。

提供了全局的样式和局部样式。和前边 app.json, page.json 的概念相同,你可以写一个 app.wxss
作为全局样式,会作用于当前小程序的所有页面,局部页面样式 page.wxss 仅对当前页面生效。

此外 WXSS 仅支持部分 CSS 选择器。

WXS

点击 button 按钮的时候,我们希望把界面上 msg 显示成 "Hello World",于是我们在 button 上声明一个属性: bindtap ,在 JS 文件里边声明了 clickMe 方法来响应这次点击操作:

WXML

<view>{{ msg }}</view>
<button bindtap="clickMe">点击我</button>

WXS

Page({
  clickMe: function() {
    this.setData({ msg: "Hello World" })
  }
})

踩坑

  • Q1:小程序背景图
    问题:小程序不支持background本地图。
    解决:将图片上传七牛云服务器中的存储空间

  • Q2:服务器图片缓存
    问题:在服务器更新图片时,会有缓存,暂时访问不到最新的图片
    解决:在请求的链接后加上参数

    8.png

  • Q3:小程序上下拉动出现白屏
    问题:当用力往下拉,页面顶部会出现一段空白的地方,用户体验不好
    解决:在当前页面的json文件里,加上属性"disableScroll":true,再配合scroll-view一起使用,可解决多内容超出滚动,适配小屏幕手机

  • Q4:小程序open-data组件
    问题:open-data组件添加样式无效
    解决:使用overflow: hidden

    <view class="userinfo">
        <open-data  type="userAvatarUrl" class="userAvatarUrl"></open-data>
        <open-data type="userNickName" class="userNickName"></open-data>
    </view>
    
  • Q5:小程序scroll-view横向划动
    问题:scroll-view横向划动无效
    解决:
    1.要给scroll-view设置宽度,并设置white-space:nowrap;
    2.将容器内的子元素每一项设置宽度和display:inline-block

mpvue

介绍

mpvue (github 地址请参见)是一个使用 Vue.js 开发小程序的前端框架。框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验。

名称由来

  • mp:mini program 的缩写
  • mpvue:Vue.js in mini program

主要特性

  • H5 代码转换编译成小程序目标代码的能力
  • 彻底的组件化开发能力:提高代码复用性
  • 支持使用 npm 外部依赖
  • 完整的 Vue.js 开发体验
  • 方便的 Vuex 数据管理方案:方便构建复杂应用
  • 快捷的 webpack 构建机制:自定义构建策略、开发阶段 hotReload
  • 使用 Vue.js 命令行工具 vue-cli 快速初始化项目

5分钟教程

通过 Vue.js 命令行工具 vue-cli,你只需在终端窗口输入几条简单命令,即可快速创建和启动一个带热重载、保存时静态检查、内置代码构建功能的小程序项目:

# 1.全局安装 vue-cli
npm install -g @vue/cli-init

# 2.创建一个基于 mpvue-quickstart 模板的新项目
$ vue init mpvue/mpvue-quickstart my-project

# 3.进入项目文件夹
$ cd my-project

# 4.安装依赖
$ npm install

创建项目过程如下图:

6.png

mpvue目录如下图:

7.png

本文参考:https://developers.weixin.qq.com/miniprogram/dev/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 因新工作主要负责微信小程序这一块,最近的重心就移到这一块,该博客是对微信小程序整体的整理归纳以及标明一些细节点,初...
    majun00阅读 7,338评论 0 9
  • 整理于网络 http://blog.poetries.top/2018/08/09/xiaochengxu-not...
    程序员poetry阅读 8,484评论 2 36
  • IjkPlayer是B站基于ffmpeg封装而来的非常优秀的一款播放组件,今天将之前项目中用到ijkPlayer的...
    等风来_Android阅读 5,586评论 4 4
  • H:“不是说买泡面怎么没买?” 妈:“我买了啊,一箱五十多块呢!” H:“哪呢哪呢?我都没有见到过” 妈:“那我已...
    yingerzhang阅读 228评论 0 0
  • 1,无所适从型,不知道如何找工作、找不到工作、有工作但做不好而去创业的,百分百会死; 2,想法点子型,有个好想法、...
    MrHeng阅读 206评论 0 0