小程序声明周期和基本语法

模板语法:

WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件事件系统,可以构建出页面的结构。

数据绑定

普通写法:

<view> {{ message }} </view>
Page({
  data: {
    message: 'Hello MINA!'
  }
})

组件属性:

<view id="item-{{id}}"> </view>
Page({
  data: {
    id: 0
  }
})

列表渲染:

wx:for

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

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

wx:key 用来提高数组渲染的性能

wx:key 绑定的值 有如下选择

1.string 类型,表示 循环项中的唯一属性 如

list:[{id:0,name:"炒饭"},{id:1,name:"炒面"}]

wx:key="id"

2. 保留字 *this ,它的意思是 item 本身 ,*this 代表的必须是 唯一的字符串和数组。

list:[1,2,3,4,5]

wx:key="*this"

代码

<view wx:for="{{array}}" wx:key="id">
  {{index}}: {{item.message}}
</view>
Page({
  data: {
    array: [{
      id:0,
      message: 'foo',
    }, {
      id:1,
      message: 'bar'
    }]
  }
})

block: 渲染一个包含多节点的结构块 block最终不会变成真正的dom元素

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

条件渲染:

data:{
condition:0
}
<!-- 条件渲染 -->
<view wx:if="{{condition===0}}">满足显示为0</view>
<view wx:else>不满足显示为1</view>
<view hidden="{{false}}">显示</view>

 hidden:

<view hidden="{{condition}}"> True </view>

类似 wx:if

频繁切换 用 hidden

不常使用 用 wx:if

事件绑定:

  // 声明一个函数
  clickHandler(){
    console.log('1')
  },
<!-- 
  事件绑定
  1.声明事件函数 (data同级声明一个函数)
  2.给元素绑定事件 bind 固定写法 tap就是click

 -->
<button bind:tap="clickHandler" type="primary">按钮</button>

事件传值 通过标签自定义属性的方式 data- 固定写法

<button bind:tap="clickHandler" data-num="{{2}}" type="primary">按钮</button>
// 声明一个函数 typeof 检测数据类型
  clickHandler(e){
    console.log(e.target.dataset.num)
  },

 input 事件

<!-- input 事件 -->
<input type="text" bind:input="inputHandler"/>
<view>{{msg}}</view>
/* input 函数 */
  inputHandler(e){
  console.log(e.detail.value),
  this.setData({
    msg:e.detail.value
  })
  },

样式 WXSS

WXSS(WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式。

CSS 相比,WXSS 扩展的特性有:

  • 响应式长度单位 rpx

  • 样式导入

尺寸单位

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

设备rpx换算px (屏幕宽度/750)px换算rpx (750/屏幕宽度)
iPhone51rpx = 0.42px1px = 2.34rpx
iPhone61rpx = 0.5px1px = 2rpx
iPhone6 Plus1rpx = 0.552px1px = 1.81rpx

建议: 开发微信小程序时设计师可以用 iPhone6 作为视觉稿的标准。

使用步骤:

  1. 确定设计稿宽度 pageWidth

  2. 计算比例 750rpx = pageWidth px ,因此 1px=750rpx/pageWidth

  3. 在less文件中,只要把设计稿中的 px => 750/pageWidth rpx 即可。

样式导入:

wxss中直接就支持,样式导入功能。

也可以和 less中的导入混用。

使用@import语句可以导入外联样式表,只支持相对路径

示例代码:

/** common.wxss **/
.small-p {
  padding:5px;
}
/** app.wxss **/
@import "common.wxss";
.middle-p {
  padding:15px;
}

选择器:

特别需要注意的是 小程序 不支持通配符 * 因此以下代码无效

*{
    margin:0;
    padding:0;
    box-sizing:border-box;
}

目前支持的选择器有:

选择器样例样例描述
.class.intro选择所有拥有 class="intro" 的组件
#id#firstname选择拥有 id="firstname" 的组件
elementview选择所有 view 组件
element, elementview, checkbox选择所有文档的 view 组件和所有的 checkbox 组件
nth-child(n)view:nth-child(n)选择某个索引的标签
::afterview::after`在 view 组件后边插入内容
::beforeview::before在 view 组件前边插入内容

常见组件:

重点讲解小程序中常用的布局组件

view,text,rich-text,button,image,navigator,icon,swiper,radio,checkbox。等。

view

代替 原来的 div 标签

  <view hover-class="h-class">
  点击我试试
  </view>

text

  1. 文本标签

  2. 只能嵌套text

  3. 长按文字可以复制(只有该标签有这个功能)

  4. 可以对空格 回车 进行编码

属性名类型默认值说明
selectableBooleanfalse文本是否可选
decodeBooleanfalse是否解码

代码 

  <text selectable="{{ false }}" decode="{{ false }}">
    普&nbsp;通
  </text>

image

  1. 图片标签,image组件默认宽度320px、高度240px

  2. 支持懒加载

属性名类型默认值说明
srcString图片资源地址
modeString'scaleToFill'图片裁剪、缩放的模式
lazy-loadBooleanfalse图片懒加载

mode 有效值:mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式。

模式说明
缩放scaleToFill不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素
缩放aspectFit保持纵横比缩放图片,使图片的长边能完全显示出来。
缩放aspectFill保持纵横比缩放图片,只保证图片的短边能完全显示出来。
缩放widthFix宽度不变,高度自动变化,保持原图宽高比不变
裁剪top不缩放图片,只显示图片的顶部区域
裁剪bottom不缩放图片,只显示图片的底部区域
裁剪center不缩放图片,只显示图片的中间区域
裁剪left不缩放图片,只显示图片的左边区域
裁剪right不缩放图片,只显示图片的右边区域
裁剪top left不缩放图片,只显示图片的左上边区域
裁剪top right不缩放图片,只显示图片的右上边区域
裁剪bottom left不缩放图片,只显示图片的左下边区域
裁剪bottom right不缩放图片,只显示图片的右下边区域

 swiper

微信内置滑动组件。

 默认宽度 100% 高度 150px

属性名类型默认值说明
indicator-dotsBooleanfalse是否显示面板指示点
indicator-colorColorrgba(0, 0, 0, .3)指示点颜色
indicator-active-colorColor#000000当前选中的指示点颜色
autoplayBooleanfalse是否自动切换
intervalNumber5000自动切换时间间隔
circularBooleanfalse是否循环轮播

swiper:滑块视图容器。

swiper-item:滑块 默认宽度和高度都是100% 

navigator

导航组件 类似超链接标签

属性名类型默认值说明
targetStringself在哪个目标上发生跳转,默认当前小程序,可选值self/miniProgram
urlString当前小程序内的跳转链接
open-typeStringnavigate跳转方式

 open-type 有效值:

说明
navigate保留当前页面,跳转到应用内的某个页面,但是不能跳到 tabbar 页面
redirect关闭当前页面,跳转到应用内的某个页面,但是不允许跳转到 tabbar 页面。
switchTab跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
reLaunch关闭所有页面,打开到应用内的某个页面
navigateBack关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层
exit退出小程序,target="miniProgram"时生效

rich-text

富文本标签。可以将字符串解析成 对应标签,类似 vuev-html功能

代码

// 1   index.wxml  加载 节点数组
<rich-text nodes="{{nodes}}" bindtap="tap"></rich-text>
// 2 加载 字符串
<rich-text nodes='<img src="https://developers.weixin.qq.com/miniprogram/assets/images/head_global_z_@all.png" alt="">'></rich-text> 
 
    
// index.js
    
Page({
  data: {
    nodes: [{
      name: 'div',
      attrs: {
        class: 'div_class',
        style: 'line-height: 60px; color: red;'
      },
      children: [{
        type: 'text',
        text: 'Hello&nbsp;World!'
      }]
    }]
  },
  tap() {
    console.log('tap')
  }
})

nodes属性:

nodes属性支持 字符串标签节点数组

属性说明类型必填备注
name标签名string支持部分受信任的 HTML 节点
attrs属性object支持部分受信任的属性,遵循 Pascal 命名法
children子节点列表array结构和 nodes 一致

文本节点:type = text

属性说明类型必填备注
text文本string支持entities
  • nodes 不推荐使用 String 类型,性能会有所下降。

  • rich-text 组件内屏蔽所有节点的事件。

  • attrs 属性不支持 id ,支持 class 。

  • name 属性大小写不敏感。

  • 如果使用了不受信任的 HTML 节点,该节点及其所有子节点将会被移除。

  • img 标签仅支持网络图片。

button

<button
  type="default"
  size="{{defaultSize}}"
  loading="{{loading}}"
  plain="{{plain}}"
>
  default
</button>
属性类型默认值必填说明
sizestringdefault按钮的大小
typestringdefault按钮的样式类型
plainbooleanfalse按钮是否镂空,背景色透明
disabledbooleanfalse是否禁用
loadingbooleanfalse名称前是否带 loading 图标
form-typestring用于 `` 组件,点击分别会触发 `` 组件的 submit/reset 事件
open-typestring微信开放能力

 size 的合法值

说明
default默认大小
mini小尺寸

type 的合法值

说明
primary绿色
default白色
warn红色

 form-type 的合法值

说明
submit提交表单
reset重置表单

open-type 的合法值

说明
contact打开客服会话,如果用户在会话中点击消息卡片后返回小程序,可以从 bindcontact 回调中获得具体信息,具体说明
share触发用户转发,使用前建议先阅读使用指引
getPhoneNumber获取用户手机号,可以从bindgetphonenumber回调中获取到用户信息,具体说明
getUserInfo获取用户信息,可以从bindgetuserinfo回调中获取到用户信息
launchApp打开APP,可以通过app-parameter属性设定向APP传的参数具体说明
openSetting打开授权设置页
feedback打开“意见反馈”页面,用户可提交反馈内容并上传日志,开发者可以登录小程序管理后台后进入左侧菜单“客服反馈”页面获取到反馈内容

open-type 的 contact的实现流程

将小程序 的appid 由测试号改为 自己的appid

icon

属性类型默认值必填说明
typestringicon的类型,有效值:success, success_no_circle, info, warn, waiting, cancel, download, search, clear
sizenumber/string23icon的大小
colorstringicon的颜色,同css的color

 

 代码:

js

Page({
  data: {
    iconSize: [20, 30, 40, 50, 60, 70],
    iconType: [
      'success', 'success_no_circle', 'info', 'warn', 'waiting', 'cancel', 'download', 'search', 'clear'
    ],
    iconColor: [
      'red', 'orange', 'yellow', 'green', 'rgb(0,255,255)', 'blue', 'purple'
    ],
  }
})

wxml

<view class="group">
  <block wx:for="{{iconSize}}">
    <icon type="success" size="{{item}}"/>
  </block>
</view>

<view class="group">
  <block wx:for="{{iconType}}">
    <icon type="{{item}}" size="40"/>
  </block>
</view>

<view class="group">
  <block wx:for="{{iconColor}}">
    <icon type="success" size="40" color="{{item}}"/>
  </block>
</view>

radio

可以通过 color属性来修改颜色

 checkbox

可以通过 color属性来修改颜色。

 需要搭配 checkbox-group 一起使用

自定义组件

类似 vue 或者 react 中的自定义组件,小程序允许我们使用自定义组件的方式来构建页面

创建自定义组件:

类似于页面,一个自定义组件由 json wxml wxss js 4个文件组成

可以在微信开发者工具中快速创建组件的文件结构

在文件夹内components/myHeader,创建组件 名为 myHeader

 

 声明组件:

首先需要在组件的 json 文件中进行自定义组件声明

myHeader.json

{
  "component": true
}

编辑组件:同时,还要在组件的 wxml 文件中编写组件模板,在 wxss 文件中加入组件样式

slot表示插槽,类似vue中的slot

myHeader.wxml

<!-- 这是自定义组件的内部WXML结构 -->
<view class="inner">
  {{innerText}}
    <slot></slot>
</view>

 在组件的 wxss文件中编写样式

注意:在组件wxss中不应使用ID选择器、属性选择器和标签名选择器。

myHeader.wxss

/* 这里的样式只应用于这个自定义组件 */
.inner {
  color: red;
}

注册组件:

在组件的 js 文件中,需要使用 Component() 来注册组件,并提供组件的属性定义、内部数据和自定义方法

myHeader.js

Component({
  properties: {
    // 这里定义了innerText属性,属性值可以在组件使用时指定
    innerText: {
      // 期望要的数据是 string类型
      type: String,
      value: 'default value',
    }
  },
  data: {
    // 这里是一些组件内部数据
    someData: {}
  },
  methods: {
    // 这里是一个自定义方法
    customMethod: function(){}
  }
})

声明引入自定义组件

首先要在页面的 json 文件中进行引用声明。还要提供对应的组件名和组件路径:index.wxml

{
	// 引用声明
  "usingComponents": {
  	// 要使用的组件的名称     // 组件的路径
    "my-header":"/components/myHeader/myHeader"
  }
}

 页面中使用自定义组件

<view>
  <!-- 以下是对一个自定义组件的引用 -->
  <my-header inner-text="Some text">
    <view>用来替代slot的</view>
    </my-header>
</view>

其他属性

定义段与示例方法

Component构造器可用于定义组件,调用Component构造器时可以指定组件的属性、数据、方法等。

定义段类型是否必填描述
propertiesObject Map组件的对外属性,是属性名到属性设置的映射表,参见下文
dataObject组件的内部数据,和 properties 一同用于组件的模板渲染
observersObject组件数据字段监听器,用于监听 properties 和 data 的变化,参见 数据监听器
methodsObject组件的方法,包括事件响应函数和任意的自定义方法,关于事件响应函数的使用,参见 组件事件
createdFunction组件生命周期函数,在组件实例刚刚被创建时执行,注意此时不能调用 setData ,参见 组件生命周期
attachedFunction组件生命周期函数,在组件实例进入页面节点树时执行,参见 组件生命周期
readyFunction组件生命周期函数,在组件布局完成后执行,参见 组件生命周期
movedFunction组件生命周期函数,在组件实例被移动到节点树另一个位置时执行,参见 组件生命周期
detachedFunction组件生命周期函数,在组件实例被从页面节点树移除时执行,参见 组件生命周期

组件-自定义组件传参

  • 父组件通过属性的方式给子组件传递参数

  • 子组件通过事件的方式向父组件传递参数

过程

  • 父组件 把数据 {{tabs}} 传递到 子组件的 tabItems 属性中
  • 父组件 监听 onMyTab 事件

  • 子组件 触发 bindmytap 中的 mytap 事件

    1. 自定义组件触发事件时,需要使用 triggerEvent 方法,指定事件名detail对象

  • 父 -> 子 动态传值 this.selectComponent("#tabs");

父组件代码

// page.wxml 

<tabs tabItems="{{tabs}}" bindmytap="onMyTab" >
  内容-这里可以放插槽
</tabs>

// page.js
  data: {
    tabs:[
      {name:"体验问题"},
      {name:"商品、商家投诉"}
    ]
  },
  onMyTab(e){
    console.log(e.detail);
  },

子组件代码

// com.wxml
<view class="tabs">
  <view class="tab_title"  >
    <block  wx:for="{{tabItems}}" wx:key="{{item}}">
      <view bindtap="handleItemActive" data-index="{{index}}">{{item.name}}</view>
    </block>
  </view>
  <view class="tab_content">
    <slot></slot>
  </view>
</view>

// com.js
Component({
  properties: {
    tabItems:{
      type:Array,
      value:[]
    }
  },
  /**
   * 组件的初始数据
   */
  data: {
  },

  /**
   * 组件的方法列表
   */
  methods: {
    handleItemActive(e){
      this.triggerEvent('mytap','haha');
    }
  }
})

小程序生命周期

分为应用生命周期页面生命周期

关于小程序前后台的定义和小程序的运行机制,请参考运行机制章节。

应用生命周期

属性类型默认值必填说明
onLaunchfunction监听小程序初始化。
onShowfunction监听小程序启动或切前台。
onHidefunction监听小程序切后台。
onErrorfunction错误监听函数。
onPageNotFoundfunction页面不存在监听函数。

页面生命周期

属性类型说明
dataObject页面的初始数据
onLoadfunction生命周期回调—监听页面加载
onShowfunction生命周期回调—监听页面显示
onReadyfunction生命周期回调—监听页面初次渲染完成
onHidefunction生命周期回调—监听页面隐藏
onUnloadfunction生命周期回调—监听页面卸载
onPullDownRefreshfunction监听用户下拉动作
onReachBottomfunction页面上拉触底事件的处理函数
onShareAppMessagefunction用户点击右上角转发
onPageScrollfunction页面滚动触发事件的处理函数
onResizefunction页面尺寸改变时触发,详见 响应显示区域变化
onTabItemTapfunction当前是 tab 页时,点击 tab 时触发

页面生命周期图解

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值