、 框架的视图层由 WXML 与 WXSS 编写,由组件来进行展示。 将逻辑层的数据反映成视图,同时将视图层的事件发送给逻辑层。 WXML(WeiXin Markup language) 用于描述页面的结构。 WXS(WeiXin Script) 是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构。 WXSS(WeiXin Style Sheet) 用于描述页面的样式。 组件(Component)是视图的基本组成单元。
WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构
<!-- 关键词绑定 都加双花括号 --> <view hidden="{{ false }}"> 显示 </view> <!-- 运算 算数运算 字符串运算 三元运算 路径运算 --> <view>{{num+num1}}</view> <!-- 82466 --> <view>{{8+num2+num1}}</view> <view>{{score>=60?'及格':'不及格'}}</view> <view>{{arr[2]}}</view> <view>{{info.name}}====={{info.age}}</view> <view>{{goods[2].price}}====={{goods[2].goodsname}}</view>
<!-- 可以给item和index 起别名 wx:for-item wx:for-index --> <view wx:for="{{arr}}" wx:for-item="value" wx:for-index="idx" wx:key="*this"> {{idx}}----{{value}}--{{item}} </view> <!-- 嵌套实现九九乘法表 --> <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 如果列表是静态的,不用处理没有任何影响 如果列表是动态的,必须处理 处理两种方法: wx:key= "*this" *this 当item是唯一的字符串或者数字时 wx:key="唯一的属性" --> <view wx:for="{{goods}}" wx:key="id"> {{item.price}}==={{item.goodsname}} </view> <!-- block 相当于容器,不会解析出任何元素。就是一个包装元素 类似于vue里template --> <block wx:for="{{[1,2,3,4]}}"> <view>{{index}}</view> <view>{{item}}</view> </block> <block wx:if="{{true}}"> <view> 一个个列表 </view> </block> <block wx:else> <view>暂无数据</view> </block>
<!-- 条件渲染 双分支 wx:if wx:else 多分枝 wx:if wx:elif wx:elif wx:else --> <view wx:if="{{score>=60}}"> 及格 </view> <view wx:else> 不及格 </view> <view wx:if="{{score>=80&&score<=100}}">优秀</view> <view wx:elif="{{score>=70&&score<80}}">良好</view> <view wx:elif="{{score>=60&&score<70}}">及格</view> <view wx:else>不及格</view> hidden 和 wx:if的对比 <!-- 类似于 vue v-if v-show 一般来说,wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用 hidden 更好,如果在运行时条件不大可能改变则 wx:if 较好。 --> <view hidden="{{true}}">显示hidden</view> <view wx:if="{{false}}">显示if</view>
WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用 可以提高代码的复用性 下边代码是在同一个页面里定义和使用的模板 <!-- 1、如何定义 name --> <template name="mytem"> <view> 我是自定义模板--{{name}}--{{age}} </view> </template> <!-- 2、使用模板 is --> <template is="mytem"></template> <!-- 3、模板的传参 data --> <template is="mytem" data="{{...userinfo}}"></template>
新建外部的header模板 import 只能引入template之内的内容 <import src="/template/header.wxml"></import> <template is="header" data="{{menu}}"></template> include 引入除了template和wxs之外的内容 <include src="/template/header.wxml"></include>
与 CSS 相比,WXSS 扩展的特性有: 尺寸单位 rpx 样式导入 @import "路径"; 尺寸单位:rpx 响应的px单位,自己能够适应各种设备,所有设备的宽度都是750rpx 完全适应各种尺寸的手机 iphone 6基准机型 元素在设备上的大小(50rpx)/设备的尺寸大小(750rpx) = 元素在设计稿的宽度(50px)/设计稿的宽度(750px) 始终记住一句话,把设备调整成iphone6 然后量的多大px 就写多少rpx @import "/template/header.wxss"; 注意:在模板里导入样式时,在调用处的wxss文件里引入
静态的样式统一写到 class 中。style 接收动态的样式 _changecolor(){ // 随机改变颜色,每隔100毫秒随机改变颜色 // 单词 rgb(0-255) 16进制 let that = this setInterval(function(){ let r = Math.floor(Math.random() * 255) let g = Math.floor(Math.random() * 255) let b = Math.floor(Math.random() * 255) that.setData({ // color:"rgb("+r+","+g+","+b+")" color:`rgb(${r},${g},${b})` }) },100) },
全局样式:app.wxss 局部样式:页面.wxss
代码案例:
1、去阿里巴巴图标库里找到图标,下载代码 2、里边的iconfont.css内容复制到wxss文件里(全局,页面) 3、把复制来的css代码,修改路径,如下图 4、给text标签,应用类名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MpOaoLTy-1620906383435)(img/day02-1.png)]
事件是视图层到逻辑层的通讯方式。 事件可以将用户的行为反馈到逻辑层进行处理。 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。 事件对象可以携带额外信息,如 id, dataset, touches。
bind* eg:bindtap bindlongpress ... catch* eg: catchtap catchlongpress ... 编写事件函数时,使用 key value 形式或者 函数简写形式 _keyValue:function(){ console.log("_keyValue",this) setInterval(()=>{ this.data.num++ this.setData({ num:this.data.num }) },1000) }, _jianxie(){ console.log("_jianxie",this) }, // this underfind _jiantou:()=>{ console.log("_jiantou",this) }
<!--传参 id=“” data-*=“” * 自己取的参数名 --> <button bindtap="_chuancan" id="10" data-title="你好" data-name="admin" data-cateid="9">传参</button> 接参: _chuancan(e){ console.log(e.currentTarget) console.log(e.target) }
冒泡事件 bind绑定是冒泡事件 非冒泡事件 catch绑定的是非冒泡事件
target:触发事件的源组件, (是谁触发了这个事件) currentTarget:事件绑定的当前组件, (事件作用到了哪个组件身上)
总结:
WXML的冒泡事件列表:
类型 | 触发条件 | 最低版本 |
---|---|---|
touchstart | 手指触摸动作开始 | |
touchmove | 手指触摸后移动 | |
touchcancel | 手指触摸动作被打断,如来电提醒,弹窗 | |
touchend | 手指触摸动作结束 | |
tap | 手指触摸后马上离开 | |
longpress | 手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发 | 1.5.0 |
longtap | 手指触摸后,超过350ms再离开(推荐使用longpress事件代替) | |
transitionend | 会在 WXSS transition 或 wx.createAnimation 动画结束后触发 | |
animationstart | 会在一个 WXSS animation 动画开始时触发 | |
animationiteration | 会在一个 WXSS animation 一次迭代结束时触发 | |
animationend | 会在一个 WXSS animation 动画完成时触发 | |
touchforcechange | 在支持 3D Touch 的 iPhone 设备,重按时会触发 |
除上表之外的其他组件自定义事件如无特殊声明都是非冒泡事件,如 form 的submit事件,input 的input
bind和catch的区别?
bind 允许事件冒泡
catch 阻止事件冒泡
currentTarget和target有啥区别?
target:触发事件的源组件, (是谁触发了这个事件)
currentTarget:事件绑定的当前组件,(事件作用到了哪个组件身上)
获取参数,直接从currtentTarget获取最保险
WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构
只能通过commonjs暴露,并且不能简写 module.exports={ msg:msg, fn:fn }
<wxs module="mywxs1"> var msg = "我是自定义内容" function fn(h){ return "我是自定义函数"+h } module.exports={ msg:msg, fn:fn } </wxs> <view>{{mywxs1.msg}}</view> <view>{{mywxs1.fn("hello")}}</view> <wxs module="mywxs2"> function fn2(price){ return price.toFixed(2) } module.exports={ fn2:fn2 } </wxs> <view>{{mywxs2.fn2(price)}}</view>
1、新建好外部的.wxs文件(js代码) 2、把文件导入 <wxs src="/common/common.wxs" module="mywxs3"></wxs> <view>{{mywxs3.fn2(price)}}</view>
<wxs module="mywxs4"> function fn4(msg){ return msg.split("").reverse().join("") } module.exports={ fn4:fn4 } </wxs> <view>{{mywxs4.fn4(msg)}}</view>
<!-- swiper sweiper-item 关系是嵌套关系,类似于 ul li --> <swiper indicator-dots indicator-color="#f00" indicator-active-color="#ff0" autoplay interval="1000" duration="500" circular > <swiper-item wx:for="{{banners}}"> <image src="/img/{{item}}"></image> </swiper-item> </swiper> <!-- 自己封装焦点 --> wxml: <view class="father"> <swiper autoplay interval="1000" duration="500" circular bindchange="_change" > <swiper-item wx:for="{{banners}}"> <image src="/img/{{item}}"></image> </swiper-item> </swiper> <!-- 切换到哪一张,拿到哪一张的索引,赋值给activeIndex --> <view class="foucs"> <text wx:for="{{banners}}" class="{{index==activeIndex?'active':''}}"></text> </view> </view> js: _change(e){ console.log(e.detail.current) this.setData({ activeIndex:e.detail.current }) }
<!-- 水平滚动 1、给view转成内联块,给父元素设置强制不换行 2、给scroll-view添加 scroll-x属性即可 --> <scroll-view class="container" scroll-x> <view class="red"></view> <view class="green"></view> <view class="blue"></view> </scroll-view> <!-- 垂直滚动 1、设置父元素的高小于子元素高的和 2、给scroll-view设置属性 scroll-y即可 --> <scroll-view class="container" scroll-y> <view class="red"></view> <view class="green"></view> <view class="blue"></view> </scroll-view>
小程序中的部分组件是由客户端创建的原生组件,这些组件有: camera canvas input(仅在focus时表现为原生组件) live-player live-pusher map textarea video 原生组件具有最高的层级
<map scale="{{scale}}"> <cover-view bindtap="_scale">+</cover-view> </map>
<map> <cover-image src="/img/one.png" bindtap="_clickimg" class="img"></cover-image> </map>
camera
canvas
input(仅在focus时表现为原生组件)
live-player
live-pusher
map
textarea
video
原生组件具有最高的层级
## 4.cover-view覆盖在原生组件之上的文本视图 ```html <map scale="{{scale}}"> <cover-view bindtap="_scale">+</cover-view> </map>
<map> <cover-image src="/img/one.png" bindtap="_clickimg" class="img"></cover-image> </map>