天天看点

小程序----小程序框架学习(二)视图层

程序框架:包括逻辑层、视图层和flex模型。逻辑层由javascript编写,视图层由WXML和WXSS配合组件组成,flex布局确保页面适应不同屏幕尺寸时在恰当的位置。本篇主要介绍视图层。

逻辑层介绍见https://blog.csdn.net/maidu_xbd/article/details/102491766

flex布局介绍见https://blog.csdn.net/maidu_xbd/article/details/102566583

1.WXML(WeiXin Markup Language)微信标记语言

WXML是框架设计的一套标签语言,结合基础组件+自定义组件;可以构建出页面的结构。

  • (1)数据绑定:简单绑定 ,组合属性绑定,控制属性绑定,运算绑定,组合绑定,依次如下。
<view>{{msg}}</view>
<view id='{{id}}'></view>
<view wx:if='{{age>=18}}'>成年人</view>   //控制属性绑定
<view wx:if='{{true}}'>为true显示</view>  //控制属性绑定
<view>{{a+b}}</view>
<view wx:for='{{[1,2,array]}}'>{{item}}</view>
           
  • (2)列表渲染---【wx:for】

【buding.wxml】

<view wx:for='{{student}}' wx:key='student{{index}}'>
  <view>学生{{index+1}}:{{item}}</view>
</view>
           

【buding.js】

Page({
  /**
   * 页面的初始数据
   */
  data: {   
    student:['小李','Tom','Sarry']
  }
})
           
  • (3)条件渲染---【wx:if="{{condition}}"】

【buding.wxml】

<view wx:if="{{age<18}}">青少年</view>
<view wx:elif="{{age>=18 && age<35}}">青壮年</view>
<view wx:elif="{{age>=35 && age<55}}">中年</view>
<view wx:else>老年</view>
           

【buding.js】

Page({
  /**
   * 页面的初始数据
   */
  data: {   
    age:36
  }
})
           

wx:if与hidden:均可以控制组件的显示与隐藏,区别在于wx:if是惰性的,如果初始渲染条件为false,框架什么也不做,在条件第一次变成true时才开始局部渲染,具有更高的切换消耗。而hidden无论条件为true或false,初始就会被渲染,具有更高的初始消耗。因此,如果需要频繁的切换组件,用hidden更好;如果在运行时条件很少发生改变,则使用wx:if更好。

  • (4)模板--【<template>】

is属性用于指定正确的模板名称才能成功引用,引用<template>标签必须带有is属性

<template name="myTemp">
  <view wx:for="{{student}}" wx:key="student{{index}}">
  <view>学生{{index+1}}:{{item}}</view>
</view>
</template>

<template is="myTemp" data="{{student}}"></template>
           
  • (5)事件:事件是视图层到逻辑层的通信方式,特点有①可以将用户的行为反馈到逻辑层进行处理;②可以绑定在组件上,当触发事件就会执行对应的事件处理函数;③对象可以携带额外信息,例如id,dataset,touches。

       ---事件使用---

//buding.wxml
<button id="myBtn" bindtap="myTap">按钮</button>
           
//buding.js
Page({
   myTap:function(e){
        console.log(e)
  }
})
           

控制台输出如下

小程序----小程序框架学习(二)视图层

     ---事件分类---

事件分为冒泡事件和非冒泡事件。

冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递,由内向外传递。

非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。

                     WXML中支持的冒泡事件

类型 触发条件
touchstart 手指触摸动作开始
touchmove 手指触摸后移动
touchcancel 手指触摸动作被打断,如来电提醒,弹窗
touchend 手指触摸动作结束
tap 手指触摸后马上离开
longpress 手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发
longtap 手指触摸后,超过350ms再离开(推荐使用longpress事件代替)
transitionend 会在 WXSS transition 或 wx.createAnimation 动画结束后触发
animationstart 会在一个 WXSS animation 动画开始时触发
animationiteration 会在一个 WXSS animation 一次迭代结束时触发
animationend 会在一个 WXSS animation 动画完成时触发

      ---事件绑定和冒泡---

事件绑定的写法同组件的属性,都是以 key=value 的形式。

  • 1)key 以bind或catch开头,然后跟事件的类型,如bindtap、catchtouchstart。自基础库版本 1.5.0 起,bind和catch后可以紧跟一个冒号,其含义不变,如bind:tap、catch:touchstart。
  • 2)value 是一个字符串,需要在对应的 Page 中定义同名的函数,不然当触发事件的时候会报错。

bind事件和catch事件的区别:bind事件绑定不会阻止冒泡事件向上冒泡;catch事件绑定可以阻止冒泡事件向上冒泡。

【wxml】

<view>事件冒泡-bind事件绑定不会阻止冒泡事件向上冒泡</view>
<view class="outBox" bindtap="onOutBoxClick">
  <view class="innerBox" bindtap="onInnerBoxClick">
  </view>
</view>
           

【wxss】

.outBox{
  margin:0 auto;
  width: 200px;
  height: 200px;
  background: rgb(110, 110, 201);
  padding:50px;
  box-sizing: border-box;
}
.innerBox{
  width: 100px;
  height: 100px;
  background: rgb(113, 201, 110);
}
           

【js】

Page({
  onInnerBoxClick:function(e){
    console.log("内层盒子被点击了")
  },
  onOutBoxClick:function(e){
    console.log("外层盒子被点击了")
  }
})
           
小程序----小程序框架学习(二)视图层

当把【<view class="innerBox" bindtap="onInnerBoxClick">】替换为【<view class="innerBox" catchtap="onInnerBoxClick">】,则点击内层盒子,控制台只输出“内层盒子被点击了”,因为catch事件绑定可以阻止冒泡事件向上冒泡。

     ---事件的捕获阶段---

自基础库版本 1.5.0 起,触摸类事件支持捕获阶段。可以在组件的冒泡事件被触发前进行事件的捕获。捕获阶段事件的顺序与冒泡阶段完全相反,由外向内进行捕获。采用

capture-bind

capture-catch

进行捕获,

capture-catch会

中断捕获和取消冒泡。捕获的优先级大于冒泡。

示例

<view id="A" bindtap="tap1" capture-bind:tap="tap2">
  view A
  <view id="B" bindtap="tap3" capture-bind:tap="tap4">
    view B
  </view>
</view>
           

如果如果单击【view A】先后调用tap2,tap1

如果单击【view B】先后调用tap2,tap4,tap3,tap1,如下

小程序----小程序框架学习(二)视图层

 如果把图中28行的“capture-bind”替换为“capture-catch”,则只会触发tap2,捕获被中断,冒泡被取消。

    ---事件对象---

 事件对象分为基础事件(BaseEvent)、自定义事件(CustomEvent)、触摸事件(TouchEvent)

   基础事件(BaseEvent)对象属性列表

属性 类型 说明
type String  事件类型
timeStamp     Integer 事件生成时的时间戳
target      Object 触发事件的组件的一些属性值集合
currentTarget  Object 当前组件的一些属性值集合

  自定义事件(CustomEvent)对象属性列表:

属性 类型 说明
detail Object 额外的信息

 触摸事件(TouchEvent)对象属性列表:

属性 类型 说明
touches Array 触摸事件,当前停留在屏幕中的触摸点信息的数组
changedTouches  Array 触摸事件,当前变化的触摸点信息的数组
  •     (6)引用

包括【import】和【include】两种方式

<import src="temp.wxml" />
<template is="temp01" data="{{text:'hello'}}"></template>
           

注意:<import>有作用域的概念,即只会引用目标文件自己定义的template,不会引用目标文件中用<import>引用的第三方模板。这样做的目的是为了避免多个页面彼此互相连接引用陷入逻辑错误。

使用<include>将目标文件除了<template>以外的代码引入,相当于复制代码作用。

<include src="header.wxml" />
<view>正文</view>
<include src="footer.wxml" />
           

<import>更适合统一样式但内容需动态变化的情况;<include>更适合无需改动目标文件的情况。    

2.WXSS(WeiXin Style Sheets)微信样式表

wxss类似于css,用来描述页面结构对应的样式。它具有css大部分特性,对css进行了扩充和修改,主要有尺寸单位、样式导入等扩充和修改。

  • (1)尺寸单位:

rpx(responsive pixel),可以根据屏幕宽度自适应,规定屏幕宽为750rpx。一般以iphone6屏幕做为视觉设计标准。

rpx 与 px单位换算如下:

设备 rpx换算px (屏幕宽度/750) px换算rpx (750/屏幕宽度)
iPhone5 1rpx = 0.42px 1px = 2.34rpx
iPhone6 1rpx = 0.5px 1px = 2rpx
iPhone6s 1rpx = 0.552px 1px = 1.81rpx
  • (2)样式导入:

【@import "../../templates/common.wxss"】

  • (3)常用属性
样式属性 说明
background-color 背景色
color 前景色
font-size 字体大小
border 边框
width 宽度
height 高度
  • (4)内联样式

style 和class

【<view style="color:red;background-color:#ccc">测试1</view>】

【<view style="color:{{color}}">测试2</view>】

【<view class="style1">测试3</view>】

  • (5)选择器
选择器 示例 说明
.class .style1 选择所有拥有class=”style1”属性的组件
#id #test 选择所有拥有id=”test”属性的组件
element view 选择所有view组件
element,element view,text 选择所有view组件和test组件
::after view::after 在view组件后插入内容
::before view:before 在view组件前插入内容
  • (6)全局样式与局部样式

在app.wxss中的样式为全局样式,作用于每个页面。在每个页面的wxss文件中定义的样式为局部样式,只作用于对应的页面,并会覆盖app.wxss中的相同的选择器。

3.组件

组件是wxml页面上的基本单位,例如按钮,图片等,具体