注册安装流程

  • 首先去 “微信公众平台” 官网注册,注册完然后把 AppID 保存好

  • 去官网下载 “微信开发者工具”,安装完打开

  • 微信开发者工具插件推荐(Prettier,WXML)

小程序的配置文件

⼀个⼩程序应⽤程序会包括最基本的两种配置⽂件。⼀种是 全局的 app.json⻚⾯⾃⼰的 page.json

全局配置app.json

app.json 是当前⼩程序的全局配置,包括了⼩程序的所有⻚⾯路径、界⾯表现、⽹络超时时间、底部tab等。普通快速启动项⽬⾥边的 app.json 配置

字段的含义:

  1. pages 字段⸺⽤于描述当前⼩程序所有⻚⾯路径,这是为了让微信客⼾端知道当前你的⼩程序 ⻚⾯定义在哪个⽬录。
  2. window 字段⸺定义⼩程序所有⻚⾯的顶部背景颜⾊,⽂字颜⾊定义等。
  3. 完整的配置信息请参考app.json配置

页面配置page.json

  • 这⾥的 page.json 其实⽤来表⽰⻚⾯⽬录下的 page.json 这类和⼩程序⻚⾯相关的配置。
  • 开发者可以独⽴定义每个⻚⾯的⼀些属性,如顶部颜⾊、是否允许下拉刷新等等。
  • ⻚⾯的配置只能设置 app.json 中部分 window 配置项的内容,⻚⾯中配置项会覆盖 app.jsonwindow 中相同的配置项

注意:并不是所有 app.json 中的配置都可以在页面覆盖或单独指定,具体的可以参考page.json配置

sitemap配置(了解)

小程序根⽬录下的 sitemap.json ⽂件⽤于配置⼩程序及其⻚⾯是否允许被微信索引,如果没有 sitemap.json则默认为所有页面都允许被索引,具体看文档:sitemap配置

创建一个页面

  • 方法1:在左边栏右键创建

  • 方法2:在 app.json里的 pages 字段写入路径按保存自动生成

    如果想在进入小程序时显示的页面是 home,则可以在 pages 字段里调整路径的顺序调到第一去

  • 方法3:首先到小程序项目的路径下,右键选择【通过 code打开】,然后就可以在 vs code 上编写代码了,注意新增页面后需要到 微信开发者工具 里保存刷新才能看到新增的页面

全局配置

  • 通过查看文档可以知道全局配置是怎么配置的:[全局配置](https://developers.weixin.qq.com/miniprogram/dev/framework/config.html# 全局配置)

  • window(设置小程序的状态栏、导航条、标题、窗口背景色)颜色对照表

  • tabBar(客户端窗口的底部或顶部有 tab 栏可以切换页面)

    图标不支持 网络路径,只能是 本地路径,所以需要创建一个文件存放图标(大小限制为 40kb,建议尺寸为 81px * 81px

  • 小技巧:按【ALT】选中几个可以同时修改

  • 小技巧:按【ALT】+【方向键】选中代码可以实现上下移动

  • 注意:pages 字段第一个要和 tabBar 字段第一个相同

app.json

{
  "pages": [
    "pages/index/index", 
    "pages/home/home"
  ],
  "window": {
    "navigationBarBackgroundColor": "# bed742", //导航栏背景颜色,只能这种"# "格式
    "navigationBarTextStyle": "white", //名字颜色,只能black,white
    "navigationBarTitleText": "旺仔牛奶糖", //名字
    "backgroundTextStyle":"dark", //下拉 loading 的样式,仅支持 dark / light
    "enablePullDownRefresh":true, //true:开启下拉刷新
    "backgroundColor":"# afb4db" //这个是下拉刷新的背景颜色,只能这种"# "格式
  },
  "tabBar": {
    "list": [
      {
        "pagePath": "pages/index/index",
        "text": "首页",
        "iconPath": "imga/icon/_home.png", //未选中时的图标
        "selectedIconPath": "imga/icon/home.png" //选中时的图标
      },
      {
        "pagePath": "pages/img/img",
        "text": "图库",
        "iconPath": "imga/icon/_img.png",
        "selectedIconPath": "imga/icon/img.png"
      },
      {
        "pagePath": "pages/my/my",
        "text": "我的",
        "iconPath": "imga/icon/_my.png",
        "selectedIconPath": "imga/icon/my.png"
      },
      {
        "pagePath": "pages/search/search",
        "text": "搜索",
        "iconPath": "imga/icon/_search.png",
        "selectedIconPath": "imga/icon/search.png"
      }
    ],
    "color":"# 9d9087", //未选中时字体的颜色
    "selectedColor": "# f47920", // 选中时的字体颜色
    "backgroundColor": "# bed742", //tab 的背景色
    "borderStyle":"black", //tabbar 上边框的颜色, 仅支持 black / white
    "position":"bottom"   //tabBar 的位置,仅支持 bottom / top,默认是bottom
  }
}

注意json不能有注释!!!(方便以后查看所以我在文章代码里注释了)

页面配置文件

  • 配置各个页面的外观名字等,直接复制全局配置 app.jsonwindow 属性即可
  • 下面是配置 img 页面的示例,其他页面也是这样操作即可

img.json

{
  "usingComponents": {},
  "navigationBarBackgroundColor": "# bed742",
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "我的图片",
    "backgroundTextStyle":"dark",
    "enablePullDownRefresh":true,
    "backgroundColor":"# afb4db"
}

模板语法

  • text 相当于以前web中的 span标签 行内元素 不会换行
  • view 相当于以前web中的 div标签 块级元素 会换行
  • checkbox 以前web的复选框标签

dema1.wxml

<!-- pages/demo1/demo1.wxml --><!--  -->
<!-- 1.字符串 -->
<view> {{msg}} </view> <!-- 两个{},里面填写data类型 -->
<!-- 2.数字类型 -->
  <view> {{num}} </view>
  <!-- 3.bool类型 -->
<view> 是不是傻逼:{{isGirl}} </view>
<!-- 4.object类型 -->
<view> {{person.age}} </view>
<view> {{person.height}} </view>
<view> {{person.weight}} </view>
<view> {{person.name}} </view>

<!-- 5.在标签的属性中使用 -->
<view data-num="{{num}}"> 自定义属性 </view>
<!-- 6.使用bool类型充当属性
      注意:字符串和花括号之间不要存在空格,否则会导致识别失败
      以下是错误示范:<checkbox checked="   {{ischecked}}"></checkbox>

 -->
<view>
    <checkbox checked> </checkbox><!-- 表示复选框选中状态 -->
    <checkbox checked="{{ischecked}}"></checkbox><!-- 等同上面 -->
</view>

demo1.js

Page({
  data:{
    msg:"Hello World", //变量名自定义,字符串类型
    num:12345, //数字类型
    isGirl:false, //bool类型
    person:{ //对象类型
      age:74,
      height:180,
      weight:200,
      name:"富婆"
    },
    ischecked:false //复选框判断
  }
})

运算

demo1.wxml

<!-- 运算=>表达式
    1.可以在花括号中加入表达式 -- "语句"
    2.表达式
    指的是一些简单运算,数字运算,字串符拼接,逻辑运算。。。
    3.语句
    <1>复杂的代码段
    <2>if else
    <3>Switch
    <4>do while...
    <5>for...  
  -->
  <view>{{1+1}}</view> <!-- 输出2 -->
  <view>{{'1'+'1'}}</view> <!-- 输出11 -->
  <!-- 注意:===:严格等于不仅值相等类型也要相等 -->
  <view>{{11%2===0 ? '偶数' : '奇数'}}</view> <!-- 输出奇数 -->

数组和对象循环

demo1.js

Page({
  data:{
    msg:"Hello World", //变量名自定义,字符串类型
    num:12345, //数字类型
    isGirl:false, //bool类型
    person:{ //对象类型
      age:74,
      height:180,
      weight:200,
      name:"富婆"
    },
    ischecked:false,
    list:[
      {
        id:0,
        name:"孙悟空"
      },
      {
        id:1,
        name:"猪八戒"
      },
      {
        id:2,
        name:"悟能"
      }
    ]
  }
})

demo1.wxml

<!-- 8.列表循环
     1.wx:for="{{数组或者对象}}" wx:for-item="循环项的名称" wx:for-index="循环项的索引"
     2.wx:key="唯一的值" 用来提高列表渲染的性能
       <1>wx:key 绑定一个普通的字符串时,那么这个字符串名称就是循环数组中的对象的唯一属性(相当于主键)
       <2>wx:key="*this" 表示 你的数组是一个普通的数组 *this 表示是循环项 如[1,2,3,44,5]
     3.当出现 数组的嵌套循环时尤其注意以下绑定的名称不要重名 
     wx:for-item="item" wx:for-index="index"
     4.默认情况下我们不写上面这句,只有一层循环的话可以省略 
 -->
 <view>
   <view 
   wx:for="{{list}}" wx:key="id">
      索引:{{index}}
      --
      值:{{item.name}}
  </view>
 </view>

 <!-- 9.对象循环
        1.wx:for="{{对象}}" wx:for-item="循环项的名称" wx:for-index="循环项的索引"
        2.循环对象时最好把 item和index的名称都修改一下
        wx:for-item="value" wx:for-index="key"
 -->
 <view>
   <view>对象循环</view>
   <view wx:for="{{person}}" wx:for-item="value" wx:for-index="key" wx:key="age"> <!-- 因为对象里面每一个值都是唯一的所以随便给一个就行 -->
     属性:{{key}}
     --
     值:{{value}}
   </view>
 </view>

block标签和条件渲染

 <!-- 10.block标签
      1.占位符的标签
      2.写代码可以看到这标签存在,页面渲染时会被移除掉
 -->
 <view>
  <block 
  wx:for="{{list}}" wx:key="id" class="my_list">
     索引:{{index}}
     --
     值:{{item.name}}
 </block>
</view>
<!-- 11.条件渲染 
      1.wx:if="{{true/false}}"
        <1>if,else,elif
      2.hidden(实现显示或者隐藏)
        <1>在标签上直接加属性
         <2>hidden="{{true}}" 
      3.什么场景下用哪个?
       <1>当标签不是频繁的切换显示,优先使用 wx:if
         直接把标签从页面结构给移除掉
       <2>当标签频繁的切换显示时,优先使用 hidden    
         通过添加样式的方式来切换显示 
         hidden属性不要和display一起使用  
-->
<view>
  <view>条件渲染</view>
  <view wx:if="{{true}}">显示</view> <!-- 为真显示 -->
  <view wx:if="{{false}}">隐藏</view> <!-- 为假隐藏 -->
  <view wx:if="{{false}}">1</view>
  <view wx:elif="{{true}}">2</view>
  <view wx:else>3</view>
</view>

<view>----------------</view>
<view hidden>hidden1</view>
<view hidden="{{false}}">hidden2</view>

<view>--------888-------</view>
<view wx:if="{{false}}">111</view>
<view hidden>222</view>
<view hidden style="display: flex;">小苗</view>

  • 条件渲染:在框架中,使用 wx:if="" 来判断是否需要渲染该代码块
  • wx:if 也是惰性的,如果在初始渲染条件为 false,框架什么也不做,在条件第一次变成真的时候才开始局部渲染
  • hidden 就简单的多,组件始终会被渲染只是简单的控制显示与隐藏
  • 通过查看元素可以知道 hidden 是通过添加 none 样式进行隐藏
  • 如果需要频繁切换的情景下,用 hidden 更好,如果在运行时条件不大可能改变则 wx:if 较好

  • hidden 属性不要和 display 一起使用

事件绑定

  • input 组件是输入框,typeinput 的类型,默认是 text 类型 文档:input
  • bindinput 绑定监听事件,可以监听到当前输入框的值,通过 e.detail.value 可以获取到 input的值,return 返回的字符串可以替换掉输入的字符串
  • console.log() 函数是将 “内容” 输出在控制台上,方便调试

demo1.js

  • e 就是 源对象

  • 通过 e.detail.value 来获取输入的值
  • 然后注意一下赋值写法,用到 setData

Page({
  data:{
    num:0
  },
  //输入框的input时间的执行逻辑
  handleInput(e){
    //console.log(e.detail.value);
    this.setData({
      num:Number(e.detail.value) //注意需要转换为数值
    })
  },
  //+ - 按钮的事件
  handletap(e){
    //console.log(e);
    //获取自定义属性 operation
    const operation = e.currentTarget.dataset.operation;
    this.setData({
      num:this.data.num + operation
    })
  }
})

demo1.json

  • 关于事件绑定的传参问题不能直接传参,需要自定义属性的方式进行传参
  • data-自定义属性,组件上触发的事件时,会发送给事件处理函数
  • data-operation 是自定义的属性,需要注意的是 data-operation=“1" 是传字符类型data-operation=”{{1}}" 是传数值类型
  • 获取自定义属性 operation(一步步通过控制台知道值在哪)
  • const operation=e.currentTarget.dataset;

  • 注意:因为 input 默认是 string 类型, 所以需要用 Number() 函数转换输入的值(你不输入则数值正常加或者减,但是一旦输入数字再按加或减就会变成字符串拼接形式)菜鸟教程JavaScript Number() 函数

<!--
  1.需要给 input标签绑定 input事件
     绑定关键字 bindinput 
   2.如何获取 输入框的值:
      通过事件源对象来获取 
      e.detail.value
   3.把输入的值 赋值到 data中
      不能直接这样写:
      this.data.num=e.detail.value
      this,num=e.detail.value
      正确写法:
      this.setData({
        num:e.detail.value
      })  
   4.需要加入一个点击事件
   bindtap
   <1>通过自定义属性的方式来传参 
   <2>在事件源中获取 自定义属性      
 -->
<input type="text" bindinput="handleInput" /> <!-- 注意后面有结束符/ handleInput是事件名-->
<!-- 不能直接写参数 handletap(1)或者handletap(-1),这样系统会变成这样调用
  :handletap(1)(num){} 改变了原来的名字会找不到的 
-->

<button bindtap="handletap" data-operation="{{1}}">+</button> <!-- 加入按钮 -->
<button bindtap="handletap" data-operation="{{-1}}">-</button>
<view>{{num}}</view>

样式WXSS

尺寸单位

  • rpx :可以根据屏幕宽度进行自适应,规定屏幕宽为 750rpx,如在 iPhone6上,屏幕宽度为 375px,共有 750 物理像素,则 750rpx=375px=750物理像素1rpx=0.5px=1物理像素

  • 使⽤步骤:

    确定设计稿宽度 pageWidth
    计算⽐例 750rpx = pageWidth px ,因此 1px = 750rpx/pageWidth
    less ⽂件中,只要把设计稿中的 px=>750/pageWidth rpx 即可

  • 计算公式:calc(750rpx*被适配的元素/机型像素单位)

    注意750rpx 中间不要留空格运算符 两边要留空格

  • calc() 函数用于动态计算长度值,菜鸟教程:CSS calc() 函数

  • margin 是指从自身边框到另一个容器边框之间的距离,就只是容器外距离。

  • padding 是指自身边框到自身内部另一个容器边框之间的距离,就是容器内距离。

demo1.wxss

/* 
1.小程序中不需要自动来引入样式文件
2.需要把页面某个元素的单位由 px 改成 rpx 
  <1>设计稿 750px
      750px=750rpx
      1px=1rpx
  <2>把屏幕宽度改成 375px
      375px=750rpx
      1px=2rpx
      1rpx=0.5px
3.存在一个设计稿 宽度 414 或者 未知page
  <1>设计稿page 存在一个元素宽度100px,假设page=375
  <2>拿以上需求去实现不同宽度的页面适配
  公式:calc(750rpx*被适配的元素/机型像素单位)
  注意:不能漏了calc()
 */

/* 不建议写死view,当前只是示例 */
view{
  width: calc(750rpx * 100 / 375);
  height: 200rpx;/*1rpx=0.5px,所以这里是100px*/
  font-size: 40rpx;
  background-color: aquamarine;
}

样式导入

  • wxss 中⽀持样式直接导⼊功能,也可以和 less 中的导⼊混⽤
  • 使⽤ @import 语句可以导⼊外联样式表,只⽀持 相对路径
/* 引入代码是通过 @import 来引入的,只支持相对路径 */
@import "../../style/common.wxss"; /* 第一个../是退出当前demo1.wxss,第二个../是退出demo1文件夹 */

选择器和使用less

  • 特别需要注意的是 ⼩程序 不⽀持通配符 * 因此以下代码⽆效! 菜鸟教程:CSS 选择器
*{
  margin:0;
  padding:0;
  box-sizing:border-box;
}
  • ⽬前⽀持的选择器有:

  • 原⽣⼩程序不⽀持 less ,其他基于⼩程序的框架⼤体都⽀持,如 wepy,mpvue,taro 等。 但是仅仅因为⼀个 less 功能,⽽去引⼊⼀个框架,肯定是不可取的。因此可以⽤以下⽅式来实现:

    ① 在 VS Code 里安装插件 easy less

    ② 在 VS code 设置 settings.json 里添加以下代码:

"less.compile": {
        "outExt": ".wxss"
    }

在要编写样式的地方,新建 less 文件,如 demo1.less ,然后正常编辑即可

常见组件

view和text标签

  • view 标签,见文档:view

  • text 标签,见文档:text

    ⽂本标签

    只能嵌套 text

    ⻓按⽂字可以复制(只有该标签有这个功能)

    可以对空格,回⻋进⾏编码

  • HTML 特殊符号对照表:HTML特殊符号对照表,这里面不是所有 decode 都可以解码,可以参考文档 Bug & Tip

<!--
  1.长按复制 	user-select
    <1>selectable已经弃用
    <2>需要加属性decode解码才能用&nbsp  

 -->
<text user-select decode>text&nbsp;123<</text>

image标签

  • 图片一般使用 外链 的方式引入,支持 JPG、PNG、SVG、WEBP、GIF 等格式,不使用绝对路径,我目前使用的是去不图床
  • image 组件默认宽度320px高度240px
  • image 组件中二维码/小程序码图片 不支持长按识别。仅在 wx.previewImage支持长按识别

待更新

艹了,压力大没时间搞小程序,还有蓝桥杯单片机,高数,英语,数据结构等等等等要学,只要我还没挂我还有希望继续学小程序!!