初学微信小程序

首先登陆微信公众平台:https://mp.weixin.qq.com/

注册一个账号,注册成功后可以获取到一个appId,这个appId就是开发者的唯一标识;

微信开发者工具下载:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html       (不用特意去记,在微信公众平台翻翻就能找到)

 小程序文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/config.html

普通web和微信小程序的区别

 新建项目

我们可以打开微信开发者工具,点击项目选项,新建一个项目,然后设置项目名称,指定项目文件地址,输入appId,即可新建一个小程序项目;

小程序目录结构

新建成功后会有这样的一个目录结构:

 pages里面是放页面的,里面会有两个预制的页面

 index是首页,logs是显示日志的页面

我们可以看到每个页面都有4个部分构成,.js,.json,.wxml,.wxss,分别代表js文件、页面配置文件、'html'页面、'css'页面;

utils文件中放着一些公共的方法

app.js是整个小程序的入口文件

app.json是控制整个小程序大体接口的文件,比如页面数量配置,导航条默认标题,导航条背景明暗设置,导航条字体颜色设置;

app.wxss是默认全局的样式

project.config.json是项目配置文件,对应到开发者工具中详情按钮的内容,我们可以在开发者工具里用图形化的形式进行操作;可以配置项目名称、appid等信息;

 小程序配置介绍

一个小程序应用会包括最基本的两种配置文件,一种是全局的app.json和页面自己的page.json

全局配置app.json:

app.json是当前小程序的全局配置,包括了小程序的所有页面路径、页面表现、网络超时时间、底部tab等;

小程序中如何新增页面呢?我们第一种想法可能是,按照结构目录一个一个新建页面,但是这种方式在小程序中显得繁琐,我们可以在app.json中的pages想汇总新增一个页面路径,小程序自动会为我们建立页面里对应的文件的!!

 如上,新增页面路径后,ctrl+s保存一下,小程序就会自动建立对应的页面了;

另外有一个需要注意,pages中哪个路径在最前面,小程序启动的时候,默认页面就是谁!!!

小程序文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/config.html

如何添加底部/顶部tab栏?

同样在app.json中配置:(yabBar要求至少两个,最多5个,否则会报错),其它配置看文档

"tabBar": {
    "list": [{
      "pagePath": "pages/index/index",//对应的页面路径
      "text": "首页",//tab名称
      "iconPath": "images/tabbar/home.png",//默认图标
      "selectedIconPath": "images/tabbar/activeHome.png",//被选择是的图标
    },
    {
      "pagePath": "pages/logs/logs",
      "text": "日志",
      "iconPath": "images/tabbar/log.png",
      "selectedIconPath": "images/tabbar/activeLog.png"
    }]
  }

小程序汇总页面配置

进入某一个页面的xxxx.json(具体参考文档)

{
  "usingComponents": {},
  "navigationBarBackgroundColor":"#00b26a",//配置导航栏背景色
  "navigationBarTitleText":"页面2",//配置导航栏文字内容
}

 视图层wxml

<text>:类似于web中的span标签,是行内元素

<view>:类似于web中的div标签,是块级元素

<block>:用于包括含有多个节点的代码片段,相当于一个容器,也是块级元素

数据绑定(类似vue中的双向绑定):

在某个页面的xxx.js中定义几个变量:

data: {
    msg:"hello world 1",
    person:{
      name:"小明",
      height:185
    },
    title:"这是一个标题"
  },

在xxx.wxml中绑定这些变量:(可以绑定普通值,也可以绑定属性,需要注意的是,绑定布尔值时要加上双括号,否则会报错或不生效)

<view>
  {{ msg }}
  <view>
  {{person.name}}--{{person.height}}
  </view>
  <view data-id="{{title}}">title</view>
  <view>
    <checkbox checked="{{false}}"></checkbox>
  </view>
</view>

 列表渲染

wx:for        (既可以循环数组也可以循环对象)

项的变量名默认为item,wx:for-item可以指定数组当前元素的变量名

下标变量名默认为index,wx:for-index可以指定数组当前下标的变量名

xxx.js:

data: {
    arr:["苹果","香蕉","西瓜"],
    person:{
      name:"小明",
      height:180
    }
  },

xxx.wxml:

<view>
  <view wx:for="{{arr}}" wx:key="{{index}}">
    {{index}}:{{item}}
  </view>

  <view wx:for="{{arr}}" wx:for-item="aa" wx:for-index="bb" wx:key="{{aa}}">
    {{bb}}:{{aa}}
  </view>

  <view wx:for="{{[1,2,3,4,5]}}" wx:key="*this">
    {{item}}
  </view>

  <view wx:for="{{person}}" wx:for-item="val" wx:for-index="key" wx:key="*this">
    {{key}}:{{val}}
  </view>
</view>

 wxss

wxss相当于web中的css,只不过新增了尺寸单位rpx,和样式导入

rpx可以根据屏幕的宽度进行自适应,规定屏幕宽度为750rpx,如在iphone6上,屏幕宽度为375px,共有750个物理像素,则750rpx=375px=750物理像素,1rpx=0.5px=1物理像素;可以理解为1rpx是屏幕宽度的1/750;

xxx.wxss:

.box1{
  width:50rpx;
  height:50rpx;
  background-color: aqua;
}

样式导入

@import语句可以导入外联样式表, @import后跟需要导入的外联样式表的相对路径,用;表示语句结束。

例子:

我们在根目录下建立一个stylues文件夹,里面建立一个box.wxss文件

box.wxss

.lg_box{
  width:200rpx;
  height:200rpx;
  background-color: aqua;
}

之后在某个页面的xxx.wxss中引入这个样式表:

@import "../../stylues/box.wxss";

样式表中的注释是/**/这样的

基础组件

<view>组件:类似于web中的div标签,不过在小程序汇总它有个hover-class等属性,当标签被点击时会触发这个样式;

<view hover-class='lg_box'>dasd</view>

<text>组件:类似于span标签,不过在小程序汇总也添加了其它属性,比如selectable,指定文本是否可选,默认值为false

decode属性用来指定是否解码text标签中的内容,如果为false,在标签中的&emsp;这些空格会鸳鸯展示出来

<text selectable='{{true}}' decode>dsadaa&emsp;sdassa</text>

 <image>组件:

文档地址:https://developers.weixin.qq.com/miniprogram/dev/component/image.html

小程序中的image标签和web中的img标签存在很大区别:

image组件默认宽度300px、高度240px,

小程序中不存在背景图片的说法,image标签是背景图片和img标签的结合体

src属性还是指的图片路径,

mode属性表示图片裁剪缩放的方式:

默认值是scaleToFill:缩放模式,不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素

mode 的合法值

说明最低版本
scaleToFill 缩放模式,不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素  
aspectFit 缩放模式,保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来。  
aspectFill 缩放模式,保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。  
widthFix 缩放模式,宽度不变,高度自动变化,保持原图宽高比不变  
top 裁剪模式,不缩放图片,只显示图片的顶部区域  
bottom 裁剪模式,不缩放图片,只显示图片的底部区域  
center 裁剪模式,不缩放图片,只显示图片的中间区域  
left 裁剪模式,不缩放图片,只显示图片的左边区域  
right 裁剪模式,不缩放图片,只显示图片的右边区域  
top left 裁剪模式,不缩放图片,只显示图片的左上边区域  
top right 裁剪模式,不缩放图片,只显示图片的右上边区域  
bottom left 裁剪模式,不缩放图片,只显示图片的左下边区域  
bottom right 裁剪模式,不缩放图片,只显示图片的右下边区域  

 lazy-load:图片是否懒加载 默认值是false

show-menu-by-longpress:开启长按图片显示识别小程序码菜单  默认值false

binderror:加载发生错误时触发,值是事件

bindload:加载完成时触发,值是事件

<view>
  <image src='../../images/bigImg.png' mode='widthFix'></image>
</view>

<swiper>:轮播组件

<swiper>滑块视图容器,默认宽度100%,高度150px。其中只可放置swiper-item组件,否则会导致未定义的行为。<swiper-item>默认宽度高度都是100%;

swiper的属性:

属性类型默认值必填说明最低版本
indicator-dots boolean false 是否显示面板指示点 1.0.0
indicator-color color rgba(0, 0, 0, .3) 指示点颜色 1.1.0
indicator-active-color color #000000 当前选中的指示点颜色 1.1.0
autoplay boolean false 是否自动切换 1.0.0
current number 0 当前所在滑块的 index 1.0.0
interval number 5000 自动切换时间间隔 1.0.0
duration number 500 滑动动画时长 1.0.0
circular boolean false 是否采用衔接滑动 1.0.0
vertical boolean false 滑动方向是否为纵向 1.0.0
previous-margin string "0px" 前边距,可用于露出前一项的一小部分,接受 px 和 rpx 值 1.9.0
next-margin string "0px" 后边距,可用于露出后一项的一小部分,接受 px 和 rpx 值 1.9.0
display-multiple-items number 1 同时显示的滑块数量 1.9.0
skip-hidden-item-layout boolean false 是否跳过未显示的滑块布局,设为 true 可优化复杂情况下的滑动性能,但会丢失隐藏状态滑块的布局信息 1.9.0
easing-function string "default" 指定 swiper 切换缓动动画类型 2.6.5
bindchange eventhandle   current 改变时会触发 change 事件,event.detail = {current, source} 1.0.0
bindtransition eventhandle   swiper-item 的位置发生改变时会触发 transition 事件,event.detail = {dx: dx, dy: dy} 2.4.3
bindanimationfinish eventhandle   动画结束时会触发 animationfinish 事件,event.detail 同上 1.9.0

easing-function 的合法值

说明最低版本
default 默认缓动函数  
linear 线性动画  
easeInCubic 缓入动画  
easeOutCubic 缓出动画  
easeInOutCubic 缓入缓出动画  

 示例

<swiper autoplay indicator-dots indicator-color='rgba(0,0,0,.3)' indicator-active-color='rgba(0,100,100,1)' current='0' interval='5000'
duration='500' circular vertical previous-margin='20px' next-margin='20px' display-multiple-items='1' skip-hidden-item-layout>
  <swiper-item>
    <image src='../../images/bigImg.png' mode='aspectFit'></image>
  </swiper-item>
  <swiper-item>
    <image src='../../images/bigImg.png' mode='aspectFit'></image>
  </swiper-item>
  <swiper-item>
    <image src='../../images/bigImg.png' mode='aspectFit'></image>
  </swiper-item>
</swiper>

 <navigator>:导航组件,类似于web中的a标签

属性类型默认值必填说明最低版本
target string self 在哪个目标上发生跳转,默认当前小程序 2.0.7
url string   当前小程序内的跳转链接 1.0.0
open-type string navigate 跳转方式 1.0.0
delta number 1 当 open-type 为 'navigateBack' 时有效,表示回退的层数 1.0.0
app-id string   target="miniProgram"时有效,要打开的小程序 appId 2.0.7
path string   target="miniProgram"时有效,打开的页面路径,如果为空则打开首页 2.0.7
extra-data object   target="miniProgram"时有效,需要传递给目标小程序的数据,目标小程序可在 App.onLaunch()App.onShow() 中获取到这份数据。详情 2.0.7
version string release target="miniProgram"时有效,要打开的小程序版本 2.0.7
hover-class string navigator-hover 指定点击时的样式类,当hover-class="none"时,没有点击态效果 1.0.0
hover-stop-propagation boolean false 指定是否阻止本节点的祖先节点出现点击态 1.5.0
hover-start-time number 50 按住后多久出现点击态,单位毫秒 1.0.0
hover-stay-time number 600 手指松开后点击态保留时间,单位毫秒 1.0.0
bindsuccess string   target="miniProgram"时有效,跳转小程序成功 2.0.7
bindfail string   target="miniProgram"时有效,跳转小程序失败 2.0.7
bindcomplete string   target="miniProgram"时有效,跳转小程序完成 2.0.7

target属性:默认值是self,跳转到当前小程序的页面,miniProgram:跳转到其它小程序

url:指定跳转到当前小程序的链接地址

open-type:跳转方式

open-type 的合法值

说明最低版本
navigate 对应 wx.navigateTowx.navigateToMiniProgram 的功能,但不能跳到tabBar页面  
redirect 对应 wx.redirectTo 的功能,但不能重定向到tabbar页面  
switchTab 对应 wx.switchTab 的功能,跳转到tabbar页面,并且关闭所有非tabbar页面  
reLaunch 对应 wx.reLaunch 的功能,关闭所有页面,跳转到指定的所有类型页面,包括tabbar页面 1.1.0
navigateBack 对应 wx.navigateBack 的功能 1.1.0
exit 退出小程序,target="miniProgram"时生效 2.1.0

示例:

<!-- navigate -->
<navigator url='../index2/index2' open-type='navigate'>跳转到页面2</navigator>
<!-- redirect  无历史记录-->
<navigator url='../index2/index2' open-type='redirect'>重定向到页面2</navigator>
<!-- switchTab -->
<navigator url='../index/index' open-type='switchTab'>跳转到tabbar页面,并且关闭非tabbar页面</navigator>
<!-- reLaunch -->
<navigator url='../index/index' open-type='reLaunch'>关闭所有页面,可以跳转到包括tabbar内的所有页面</navigator>

 <vedio>:视频组件(更多用法查看文档)

属性类型默认值必填说明最低版本
src string   要播放视频的资源地址,支持云文件ID(2.3.0 1.0.0
duration number   指定视频时长 1.1.0
controls boolean true 是否显示默认播放控件(播放/暂停按钮、播放进度、时间) 1.0.0
danmu-list Array.<object>   弹幕列表 1.0.0
danmu-btn boolean false 是否显示弹幕按钮,只在初始化时有效,不能动态变更 1.0.0
enable-danmu boolean false 是否展示弹幕,只在初始化时有效,不能动态变更 1.0.0
autoplay boolean false 是否自动播放 1.0.0
loop boolean false 是否循环播放 1.4.0
muted boolean false 是否静音播放 1.4.0
initial-time number 0 指定视频初始播放位置 1.6.0
page-gesture boolean false 在非全屏模式下,是否开启亮度与音量调节手势(废弃,见 vslide-gesture) 1.6.0
direction number   设置全屏时视频的方向,不指定则根据宽高比自动判断 1.7.0
show-progress boolean true 若不设置,宽度大于240时才会显示 1.9.0
show-fullscreen-btn boolean true 是否显示全屏按钮 1.9.0
show-play-btn boolean true 是否显示视频底部控制栏的播放按钮 1.9.0
show-center-play-btn boolean true 是否显示视频中间的播放按钮 1.9.0
enable-progress-gesture boolean true 是否开启控制进度的手势 1.9.0
object-fit string contain 当视频大小与 video 容器大小不一致时,视频的表现形式 1.0.0
poster string   视频封面的图片网络资源地址或云文件ID(2.3.0)。若 controls 属性值为 false 则设置 poster 无效 1.0.0
show-mute-btn boolean false 是否显示静音按钮 2.4.0
title string   视频的标题,全屏时在顶部展示 2.4.0
play-btn-position string bottom 播放按钮的位置 2.4.0
enable-play-gesture boolean false 是否开启播放手势,即双击切换播放/暂停 2.4.0
auto-pause-if-navigate boolean true 当跳转到其它小程序页面时,是否自动暂停本页面的视频 2.5.0
auto-pause-if-open-native boolean true 当跳转到其它微信原生页面时,是否自动暂停本页面的视频 2.5.0
vslide-gesture boolean false 在非全屏模式下,是否开启亮度与音量调节手势(同 page-gesture) 2.6.2
vslide-gesture-in-fullscreen boolean true 在全屏模式下,是否开启亮度与音量调节手势 2.6.2
ad-unit-id string   视频前贴广告单元ID,更多详情可参考开放能力视频前贴广告 2.8.1
bindplay eventhandle   当开始/继续播放时触发play事件 1.0.0
bindpause eventhandle   当暂停播放时触发 pause 事件 1.0.0
bindended eventhandle   当播放到末尾时触发 ended 事件 1.0.0
bindtimeupdate eventhandle   播放进度变化时触发,event.detail = {currentTime, duration} 。触发频率 250ms 一次 1.0.0
bindfullscreenchange eventhandle   视频进入和退出全屏时触发,event.detail = {fullScreen, direction},direction 有效值为 vertical 或 horizontal 1.4.0
bindwaiting eventhandle   视频出现缓冲时触发 1.7.0
binderror eventhandle   视频播放出错时触发 1.7.0
bindprogress eventhandle   加载进度变化时触发,只支持一段加载。event.detail = {buffered},百分比 2.4.0

示例:

<view>
  <video style='100%;' src='http://47.90.213.237/youtube/JU3AL8S3zyE.mp4' controls duration='60' autoplay></video>
</view>

 自定义组件:相当于vue中的组件

新建自定义组件:在跟文件下建立一个components文件夹,里面建一个MyHeader文件夹,然后再右键这个文件新建component,开发者工具会帮我们新建4个文件,很方便

 xxx.json文件中有一句:"component": true,,是声明这是一个组件

xxx.wxml中写点内容:slot是插槽,可以将父组件里的内容插进去

<view class='myheader'>
  {{cData}}
  <view>
    <slot></slot>
  </view>
</view>

xxx.wxss中可以写点简单的样式:

.myheader{
  font-size: 50px;
  background-color: yellow;
}

xxx.js中可以定义组件自身的属性(cData)

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    cData:{
      value:"组件的默认值",
      type:String
    }
  },

  /**
   * 组件的初始数据
   */
  data: {

  },

  /**
   * 组件的方法列表
   */
  methods: {

  }
})

以上是简单的定义了一个组件,那么如何在页面内引用呢?

在要引用此组件的页面的json文件汇总这样设置:

{
  "usingComponents": {
    "MyHeader":"../../components/MyHeader/MyHeader"
  },
  "navigationBarBackgroundColor": "#00b26a",
  "navigationBarTitleText": "页面3"

}

在这个页面中记得使用MyHeader组件

<view>
  <MyHeader cData="我是父组件传给子组件的值">我是自定义组件的插槽内容</MyHeader>
</view>
原文地址:https://www.cnblogs.com/fqh123/p/11621660.html