当前位置:   article > 正文

微信小程序框架(三)-全面详解(学习总结---从入门到深化)_微信小程序longpress

微信小程序longpress

目录

事件系统

 什么是事件

 事件的使用方式

Event对象

 事件分类

 冒泡事件(bind)

非冒泡事件(catch)

 事件类型

 事件类型列表

 事件携带参数

currentTarget 携带参数 

 mark 携带参数

 条件渲染

 wx:if

wx:else

wx:elif

hidden

wx:if vs hidden 区别

 列表渲染

 基本使用

复杂数据

 列表渲染_key属性

 wx:key

列表渲染_应用

模板

定义模板

 使用模板

 模板应用

 增加列表模板

页面应用模板


事件系统

 什么是事件

 事件的使用方式

在组件中绑定一个事件处理函数

  1. <button type="primary" bindtap="tapName">Click me! </button>
  2. <view bindtap="tapName"> Click me! </view>
  1. // pages/event/event.js
  2. Page({
  3. tapName(){
  4. console.log("点击");
  5. }
  6. })

Event对象

在小程序中,也具有事件对象 event

  1. Page({
  2. tapName(e){
  3. console.log(e);
  4. }
  5. })

属性类型说明
typeString事件类型
timeStampInteger事件生成时的时间戳
targetObject触发事件的组件的一些属性值集合
currentTargetObject当前组件的一些属性值集合
markObject事件标记数据
detailObject事件标记数据
touchesArray触摸事件,当前停留在屏幕中的触摸点信息的数组
changedTouchesArray触摸事件,当前变化的触摸点信息的数组

1. 在微信小程序中, event 对象的属性 currentTarget 作用是:当前组件的一些属性值集合

 事件分类

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

 冒泡事件(bind)

当一个组件上的事件被触发后,该事件会向父节点传递

  1. <view bindtap="bindParentHandle">
  2. <button type="primary" bindtap="bindChildHandle">冒泡事件</button>
  3. </view>
  1. // pages/event/event.js
  2. Page({
  3. bindParentHandle(){
  4. console.log("父级事件");
  5. },
  6. bindChildHandle(){
  7. console.log("子级事件");
  8. }
  9. })

非冒泡事件(catch)

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

  1. <view catchtap="catchParentHandle">
  2. <button type="primary" catchtap="catchChildHandle">非冒泡事件</button>
  3. </view>
  1. // pages/event/event.js
  2. Page({
  3. catchParentHandle(){
  4. console.log("非冒泡父级事件");
  5. },
  6. catchChildHandle(){
  7. console.log("非冒泡子级事件");
  8. }
  9. })

1. 在微信小程序中,下列那个是冒泡事件:bind

 事件类型

在微信小程序中,事件有很多中类型, 通过 bindcatch 与下面的类 型组合产生不同类型的事件

 事件类型列表

  1. <button type="primary" bindtouchstart="bindtouchStartHandle">touchstart bind</button>
  2. <button type="primary" catchtouchstart="catchtouchStartHandle">touchstart catch</button>
  3. <button type="primary" bindlongpress="bindlongpressHandle">longpress bind</button>
  4. <button type="primary" catchlongpress="catchlongpressHandle">longpress catch</button>
  1. // pages/event/event.js
  2. Page({
  3. bindtouchStartHandle(){
  4. console.log("bind与touchStart组合");
  5. },
  6. catchtouchStartHandle(){
  7. console.log("catch与touchStart组合");
  8. },
  9. bindlongpressHandle(){
  10. console.log("bind与longpress组合");
  11. },
  12. catchlongpressHandle(){
  13. console.log("catch与longpress组合");
  14. }
  15. })

1. 在微信小程序中,下列那个是手指移动事件:touchmove

 事件携带参数

 事件在触发的过程中,我们可以携带参数

currentTarget 携带参数 

在组件节点中可以附加一些自定义数据。这样,在事件中可以获取 这些自定义的节点数据,用于事件的逻辑处理。

<view data-id="1001" bindtap="bindViewTap">携带参数 </view>
  1. // pages/event/event.js
  2. Page({
  3. bindViewTap(e){
  4. console.log(e.currentTarget.dataset.id);
  5. }
  6. })

温馨提示

wxml 中添加数据的时候,必须在自定义属性前添加 data-*

 mark 携带参数

可以使用 mark 来识别具体触发事件的 target 节点。此外, mark 还可以用于承载一些自定义数据(类似于 dataset )。

当事件触发时,事件冒泡路径上所有的 mark 会被合并,并返回给事件回调函数。(即使事件不是冒泡事件,也会 mark 。)

  1. <view mark:parentMark="父级" bindtap="bindMarkTap">
  2. <button type="primary" mark:childMark="子级" bindtap="bindButtonTap">按钮</button>
  3. </view>
  1. // pages/event/event.js
  2. Page({
  3. bindMarkTap(e){
  4. console.log(e.mark);
  5. },
  6. bindButtonTap(e){
  7. console.log(e.mark);
  8. }
  9. })

1. 在微信小程序中,事件的 event 对象中,读取事件冒泡路径上所有的参数方案:mark

 条件渲染

 

 wx:if

在小程序中,使用 wx:if="" 来判断是否需要渲染该代码块

<view wx:if="{{ flag }}">我是孙悟空</view>
  1. Page({
  2. data: {
  3. flag:true
  4. }
  5. })

wx:else

wx:if 匹配的同时还有 wx:else

  1. <view wx:if="{{ flag }}">我是孙悟空</view>
  2. <view wx:else="{{ flag }}">我是六耳猕猴</view>
  1. Page({
  2. data: {
  3. flag:false
  4. }
  5. })

wx:elif

如同在 javascript 中,单纯的 if...else 是不够用的,所以引入了 elif

  1. <view wx:if="{{length === 1}}"> 1 </view>
  2. <view wx:elif="{{length === 2}}"> 2 </view>
  3. <view wx:else>未知</view>
  1. Page({
  2. data: {
  3. length:1
  4. }
  5. })

hidden

hidden wx:if 类似,同样可以来判断是否需要渲染该代码块

<view hidden="{{ hidden }}">果子熟了</view>
  1. Page({
  2. data: {
  3. hidden:false
  4. }
  5. })

wx:if vs hidden 区别

因为 wx:if 之中的模板也可能包含数据绑定,所以当 wx:if 的条件值切 换时,框架有一个局部渲染的过程,因为它会确保条件块在切换时 销毁或重新渲染。

同时 wx:if 也是惰性的,如果在初始渲染条件为 false ,框架什么也不 做,在条件第一次变成真的时候才开始局部渲染。

相比之下, hidden 就简单的多,组件始终会被渲染,只是简单的基 于CSS控制显示与隐藏。

一般来说, wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消 耗。因此,如果需要频繁切换的情景下,用 hidden 更好,如果在运 行时条件不大可能改变则 wx:if 较好

 列表渲染

 在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项 的数据重复渲染该组件

 基本使用

默认数组的当前项的下标变量名默认为 index ,数组当前项的变量名 默认为 item

  1. <view>
  2. <view wx:for="{{ users }}">{{ item }} </view>
  3. </view>

  1. Page({
  2. data: {
  3. users:["xiaotong","sxt"]
  4. }
  5. })

使用 wx:for-item 可以指定数组当前元素的变量名

使用 wx:for-index 可以指定数组当前下标的变量名

  1. <view>
  2. <view
  3. wx:for="{{ users }}"
  4. wx:for-item="user"
  5. wx:for-index="ids"
  6. >
  7. {{ user }}-{{ ids }}
  8. </view>
  9. </view>
  1. Page({
  2. data: {
  3. users:["xiaotong","sxt"]
  4. }
  5. })

复杂数据

网络请求拿到的数据是 json 格式,相对比要复杂一些

  1. <view>
  2. <block wx:for="{{ result }}" wx:for-item="item">
  3. <view>{{ item.name }}</view>
  4. <image src="{{ item.pic }}"></image>
  5. <view>{{ item.description }}</view>
  6. <view>{{ item.price }}</view>
  7. <view>{{ item.city }}</view>
  8. </block>
  9. </view>
  1. Page({
  2. data: {
  3. result: [{
  4. "id": 1,
  5. "name": "美食-甜豆干",
  6. "pic": "http://iwenwiki.com:3002/images/goods/1.jpg",
  7. "description": "津津卤汁豆腐干苏州特产豆干零食素食老字号食品豆制品小吃90g*10",
  8. "price": "39.90",
  9. "type": 0,
  10. "buynum": "435",
  11. "city": "北京"
  12. },
  13. {
  14. "id": 2,
  15. "name": "好欢螺螺蛳粉300g*6袋",
  16. "pic": "http://iwenwiki.com:3002/images/goods/2.jpg",
  17. "description": "好欢螺螺蛳粉300g*6袋柳州特产螺狮粉美食螺丝粉煮水方便面酸辣粉",
  18. "price": "69.99",
  19. "type": 0,
  20. "buynum": "3333",
  21. "city": "北京"
  22. }
  23. ]
  24. }
  25. })

1. 在微信小程序中, wx:for-item 属性的作用是:

    使用 wx:for-item 可以指定数组当前元素的变量名

 列表渲染_key属性

 wx:key

如果列表中项目的位置会动态改变或者有新的项目添加到列表中, 并且希望列表中的项目保持自己的特征和状态,需要使用 wx:key 来 指定列表中项目的唯一的标识符

当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件, 框架会确保他们被重新排序,而不是重新创建,以确保使组件保持 自身的状态,并且提高列表渲染时的效率

  1. <view wx:for="{{ news }}" wx:for-item="item" wx:key="id">
  2. <view>{{ item.name }}</view>
  3. </view>
  1. Page({
  2. data: {
  3. news:[
  4. {
  5. "id": 1,
  6. "name": "美食-甜豆干"
  7. },
  8. {
  9. "id": 2,
  10. "name": "好欢螺螺蛳粉300g*6袋"
  11. }
  12. ]
  13. }
  14. })

当我们想数组中添加新的数据,并且放在首位的时候,在渲染的时 候, key 就起到了作用

  1. <button type="primary" bindtap="clickHandle"> 增加数据</button>
  2. <view wx:for="{{ news }}" wx:for-item="item" wx:key="id">
  3. <view>{{ item.name }}</view>
  4. </view>
  1. Page({
  2. data: {
  3. news:[
  4. {
  5. "id": 1,
  6. "name": "美食-甜豆干"
  7. },
  8. {
  9. "id": 2,
  10. "name": "好欢螺螺蛳粉300g*6袋"
  11. }
  12. ]
  13. },
  14. clickHandle(){
  15. this.setData({
  16. news:this.data.news.concat({
  17. "id":"3",
  18. "name": "对夹"
  19. })
  20. })
  21. }
  22. })

列表渲染_应用

 列表渲染的应用场景,所有需要重复视图的地方都可以使用列表渲 染,例如: swiper

  1. <swiper
  2. indicator-dots
  3. indicator-color="#fff"
  4. indicator-active-color="#f00"
  5. autoplay
  6. >
  7. <block wx:for="{{ swiperData }}" wx:foritem="item" wx:for-index="index" wx:key="index">
  8. <swiper-item>
  9. <image mode="widthFix" style="width: 100%;" src="{{ item }}"></image>
  10. </swiper-item>
  11. </block>
  12. </swiper>
  1. Page({
  2. data: {
  3. swiperData:[
  4. "../../images/1.png",
  5. "../../images/2.jpg",
  6. "../../images/3.jpg"
  7. ]
  8. }
  9. })

模板

 WXML提供模板(template),可以在模板

  1. <template name="customTemplate">
  2. <view class="text">{{ test }}</view>
  3. </template>

中定义代码片段,然后 在不同的地方调用

定义模板

使用 name 属性,作为模板的名字。然后在<template/> 内定义代码片 段

 使用模板

使用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入

  1. <import src="./list/list.wxml" />
  2. <view>
  3. <view>引用模板</view>
  4. <template is="customTemplate" data="{{test }}"></template>
  5. <template is="customTemplate" data="{{test }}"></template>
  6. </view>
  1. Page({
  2. data: {
  3. test:"测试"
  4. }
  5. })

当然也需要引入样式,来丰富模板

  1. .text{
  2. color: red;
  3. }

引入模板样式到页面

@import "./list/list.wxss";

1. 在微信小程序中,模板引入到页面中是通过什么方式:

使用 import 属性,声明需要的使用的模板

 模板应用

 在微信小程序的项目中,同一个项目一般风格统一化,所以相同的页面效果也是常见的,此时模板的使用率就大大增多了。例如最常见的列表效果

 增加列表模板

  1. <template name="listTemplate" >
  2. <view class="list">
  3. <block wx:for="{{ foods }}" wx:for-item="item" wx:key="id">
  4. <view class="item">
  5. <image mode="widthFix" src="{{ item.pic }}"></image>
  6. <text>{{ item.name }}</text>
  7. </view>
  8. </block>
  9. </view>
  10. </template>
  1. .list{
  2. width: 100%;
  3. }
  4. .item{
  5. margin: 10px;
  6. }
  7. .list image{
  8. width: 100px;
  9. }

页面应用模板

  1. <import src="./lists/lists" />
  2. <template is="listTemplate" data="{{ foods }}"></template>
@import "./lists/lists.wxss";
  1. Page({
  2. data: {
  3. foods: [{
  4. "id": 1,
  5. "name": "美食-甜豆干",
  6. "pic": "http://iwenwiki.com:3002/images/goods/1.jpg"
  7. },
  8. {
  9. "id": 2,
  10. "name": "好欢螺螺蛳粉300g*6袋",
  11. "pic": "http://iwenwiki.com:3002/images/goods/2.jpg"
  12. },
  13. {
  14. "id": 3,
  15. "name": "良品铺子-肉松饼380gx2袋",
  16. "pic": "http://iwenwiki.com:3002/images/goods/3.webp"
  17. }
  18. ]
  19. }
  20. })

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/120529
推荐阅读
相关标签
  

闽ICP备14008679号