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

news2024/12/28 18:27:55

目录

事件系统

 什么是事件

 事件的使用方式

Event对象

 事件分类

 冒泡事件(bind)

非冒泡事件(catch)

 事件类型

 事件类型列表

 事件携带参数

currentTarget 携带参数 

 mark 携带参数

 条件渲染

 wx:if

wx:else

wx:elif

hidden

wx:if vs hidden 区别

 列表渲染

 基本使用

复杂数据

 列表渲染_key属性

 wx:key

列表渲染_应用

模板

定义模板

 使用模板

 模板应用

 增加列表模板

页面应用模板


事件系统

 什么是事件

 事件的使用方式

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

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

Event对象

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

Page({
    tapName(e){
        console.log(e);
   }
})

 

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

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

 事件分类

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

 冒泡事件(bind)

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

<view bindtap="bindParentHandle">
    <button type="primary" bindtap="bindChildHandle">冒泡事件</button>
</view>
// pages/event/event.js
Page({
    bindParentHandle(){
        console.log("父级事件");
   },
    bindChildHandle(){
        console.log("子级事件");
   }
})

非冒泡事件(catch)

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

<view catchtap="catchParentHandle">
    <button type="primary" catchtap="catchChildHandle">非冒泡事件</button>
</view>
// pages/event/event.js
Page({
    catchParentHandle(){
        console.log("非冒泡父级事件");
   },
    catchChildHandle(){
        console.log("非冒泡子级事件");
   }
})

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

 事件类型

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

 事件类型列表

<button type="primary" bindtouchstart="bindtouchStartHandle">touchstart bind</button>
<button type="primary" catchtouchstart="catchtouchStartHandle">touchstart catch</button>
<button type="primary" bindlongpress="bindlongpressHandle">longpress bind</button>
<button type="primary" catchlongpress="catchlongpressHandle">longpress catch</button>
// pages/event/event.js
Page({
    bindtouchStartHandle(){
        console.log("bind与touchStart组合");
   },
    catchtouchStartHandle(){
        console.log("catch与touchStart组合");
   },
    bindlongpressHandle(){
        console.log("bind与longpress组合");
   },
    catchlongpressHandle(){
        console.log("catch与longpress组合");
   }
})

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

 事件携带参数

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

currentTarget 携带参数 

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

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

温馨提示

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

 mark 携带参数

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

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

<view mark:parentMark="父级" bindtap="bindMarkTap">
   <button type="primary" mark:childMark="子级" bindtap="bindButtonTap">按钮</button>
</view>
// pages/event/event.js
Page({
    bindMarkTap(e){
        console.log(e.mark);
   },
    bindButtonTap(e){
        console.log(e.mark);
   }
})

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

 条件渲染

 

 wx:if

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

<view wx:if="{{ flag }}">我是孙悟空</view>
Page({
    data: {
        flag:true
   }
})

wx:else

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

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

wx:elif

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

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

hidden

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

<view hidden="{{ hidden }}">果子熟了</view>
Page({
    data: {
        hidden:false
   }
})

wx:if vs hidden 区别

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

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

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

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

 列表渲染

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

 基本使用

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

<view>
    <view wx:for="{{ users }}">{{ item }} </view>
</view>

 

Page({
    data: {
        users:["xiaotong","sxt"]
   }
})

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

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

<view>
    <view
        wx:for="{{ users }}"
        wx:for-item="user"
        wx:for-index="ids"
        >
       {{ user }}-{{ ids }}
    </view>
</view>
Page({
    data: {
        users:["xiaotong","sxt"]
   }
})

复杂数据

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

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

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

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

 列表渲染_key属性

 wx:key

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

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

 

<view wx:for="{{ news }}" wx:for-item="item" wx:key="id">
    <view>{{ item.name }}</view>
</view>
Page({
    data: {
        news:[
           {
                "id": 1,
                "name": "美食-甜豆干"
           },
           {
                "id": 2,
                "name": "好欢螺螺蛳粉300g*6袋"
           }
       ]
   }
})

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

<button type="primary" bindtap="clickHandle"> 增加数据</button>
<view wx:for="{{ news }}" wx:for-item="item" wx:key="id">
    <view>{{ item.name }}</view>
</view>
Page({
    data: {
        news:[
           {
                "id": 1,
                "name": "美食-甜豆干"
           },
           {
                "id": 2,
                "name": "好欢螺螺蛳粉300g*6袋"
           }
       ]
   },
    clickHandle(){
        this.setData({
            news:this.data.news.concat({
                "id":"3",
                "name": "对夹"
           })
       })
   }
})

列表渲染_应用

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

 

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

模板

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

<template name="customTemplate">
    <view class="text">{{ test }}</view>
</template>

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

定义模板

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

 使用模板

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

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

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

.text{
    color: red;
}

引入模板样式到页面

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

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

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

 模板应用

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

 增加列表模板

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

页面应用模板

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++用unordered_map查表代替if else/switch case多判断语句

一、引言 在C中我们写判断逻辑一般会用if else或switch case语句&#xff0c;比如以下例子&#xff1a; #include <iostream>using namespace std;class CTest { public:enum class ConditionType{TYPE1 0,TYPE2,TYPE3,};CTest() default;~CTest() default;void exe…

双倍NB!阿里一线架构师花7天肝出的这份620页“MyBatis源码解析绝密文档” 太震撼了!

前言 都知道MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Jav…

非零基础自学计算机操作系统 第1章 操作系统概述 1.1 操作系统的概念

非零基础自学计算机操作系统 文章目录非零基础自学计算机操作系统第1章 操作系统概述1.1 操作系统的概念1.1.1 操作系统的地位1.1.2 操作系统的作用1.1.3 操作系统的定义第1章 操作系统概述 1.1 操作系统的概念 关于什么是操作系统&#xff0c;目前尚无统一的定义。这里只能从…

基于Java的JSP电动车维修管理系统

随着我国电动车数量的不断增加&#xff0c;如果能够在电动车出现故障的时候及时的解决这些故障问题&#xff0c;并且能够让电动车的维修人员更好的对维修信息进行管理是本系统主要研究的问题&#xff61; 本项目利用软件工程原理&#xff0c;采用面向对象的编程方法&#xff0c…

会话技术

会话技术 今日目标 理解什么是会话跟踪技术 掌握Cookie的使用 掌握Session的使用 完善用户登录注册案例的功能 1&#xff0c;会话跟踪技术的概述 对于会话跟踪这四个词&#xff0c;我们需要拆开来进行解释&#xff0c;首先要理解什么是会话&#xff0c;然后再去理解什么是…

二叉树的构造(如何唯一确定一棵二叉树?附证明)

二叉树的构造(如何唯一确定一棵二叉树?附证明) 一些直观的认识 ▪ 同一棵二叉树具有唯一先序序列、中序序列和后序序列。 ▪ 不同的二叉树可能具有相同的先序序列、中序序列和后序序列。 通过上面两个例子的验证&#xff1a; ▪ 仅有一个先序序列&#xff08;或中序序列、后…

C++类和对象--封装

目录 1.封装 1.1封装的意义一--将属性和行为作为一个整体 1.1.1成员属性&#xff0c;成员变量&#xff0c;成员函数&#xff0c;成员方法 1.2封装的意义二--将属性和行为加以控制&#xff0c;公共权限&#xff0c;保护权限&#xff0c;私有权限 1.3struct和class区别 1.4成员…

物联网-异步控制多个设备

物联网-异步控制设备 背景 在这个万物互联的时代&#xff0c;物联网设备起到了关键性的作用&#xff0c;那我们怎么去联动一个个物联网设备。比如一个家庭&#xff0c;里面有很多的设备&#xff0c;比如洗衣机&#xff0c;加湿器、空调、除湿机、灯光等等这些智能设备。假如在…

攻击类型分布

执行摘要 从 1987 年 9 月 14 日&#xff0c;中国向世界发出第一封电子邮件到如今&#xff0c;中国的互联网 发展已过去整整 31 个年头。从消费互联、产业互联到万物互联&#xff0c;互联网正在加速改变我们的交流方式和交易方式&#xff0c;一次次 004.重塑了国家的经济形态和…

【Flutter 组件】001-关于 Widget 的一切

【Flutter 组件】001-关于 Widget 的一切 文章目录【Flutter 组件】001-关于 Widget 的一切一、概述1、Widget 基本概述2、Flutter Framework 里的 Widget架构图说明3、根 Widget二、Widget 类1、Widget 的功能2、Widget 类源码说明Widget 的标识符&#xff1a;KeyFlutter 中如…

【云原生 | Kubernetes 实战】10、K8s 控制器 Deployment 入门到企业实战应用(上)

目录 一、Deployment 控制器&#xff1a;概念、原理解读 1.1 Deployment 概述 1.2 Deployment 工作原理&#xff1a;如何管理 rs 和 Pod&#xff1f; 补充&#xff1a;什么叫做更新节奏和更新逻辑呢&#xff1f; 二、Deployment 资源清单文件编写技巧 三、Deployment 使…

Java线程 (使用Callable实现多线程),看完你发现多线程多么简单!

1.Thread 与 Runnable 的关系 2.Callable实现多线程 3.线程运行状态 1.Thread 与 Runnable 的关系 经过一系列的分析之后可以发现&#xff0c;在多线程的实现过程之中已经有了两种做法&#xff1a;Thread类、Runnable接口&#xff0c;如果从代码结构本身来讲&#xff0c;使…

电子学会2020年9月青少年软件编程(图形化)等级考试试卷(一级)答案解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;一级A卷&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 下面哪个积木能够调节左右声道的音…

疯狂加持,腾讯大佬的“百万级”JVM学习笔记,从思维图+核心+架构让你一步到位

前言 毫不夸张地说&#xff0c;JVM是现代软件工程最成功的案例之一。因为它自带GC&#xff0c;又有无数可以微调的参数&#xff0c;且运行极其稳定可靠&#xff0c;所以&#xff0c;许多厂商的核心业务系统&#xff0c;才敢放心地用Java编写&#xff0c;运行在JVM之上。 近几…

中英翻译《Thailand泰国》

Thailand 泰国 一、Pre-reading activity 阅前思考 1.Find Thailand in an atlas. 在地图册上找到泰国。 2.What are the names of the countries next to it? 与它相邻的国家都叫什么名字&#xff1f; 3.Is your country near Thailand? 你的国家靠近泰国吗&#xff1f; …

Java基于JSP的小区物业管理系统

经济的飞速发展,促使着城市化进程的加快,随之而来的则是人们生活水平日益提高,并促进住宅小区建设的飞速发展。大量住宅小区投入使用后,加大了管理者的工作难度,小区物业除了要对房屋本身进行修缮外,还需对场地、住户信息、附属设备、环卫绿化、收费情况、治安等方面进行专业化…

全国高校计算机能力挑战赛初赛试题全记录

今天搞了mini版蓝桥杯比赛&#xff0c;有时间的话&#xff0c;我们每天都会补充15道主观题。废话不多说&#xff0c;开整&#xff01;&#xff01;&#xff01; 2022.10.11 抽象&#xff1a;在C中&#xff0c;如果一个类并没有什么实际信息&#xff0c;那么就是一个抽象类 多态…

基于java+springboot+mybatis+vue+mysql的招生管理系统

项目介绍 招生管理系统采用java技术&#xff0c;基于springboot框架&#xff0c;vue技术&#xff0c;mysql数据库进行开发。本系统主要包括管理员和学生两个角色组成&#xff0c;主要包括以下功能&#xff1a; &#xff08;1&#xff09;前台&#xff1a;首页、专业信息、招生…

Online DDL和Cardinality

Online DDL和Cardinality前言Fast Index CreationOnline Schema ChangeOnline DDLCardinality什么是CardinalityCardinality是如何进行统计的前言 本文来聊聊关于Mysql索引管理方面的一些内容&#xff0c;首先我们先准备一张表: CREATE DATABASE IF NOT EXISTS test;USE test…

JVM,你是不是过分了?

以我的经验加上和同行们的交流&#xff0c;我认为学 JVM 最好的方法是&#xff1a; 在程序员不同的水平段&#xff0c;做精准的学习。 所谓的精准学习&#xff0c;就是学习对自己工作有巨大帮助的知识点。以工作内容带动学习&#xff0c;等到积累多了&#xff0c;再一举攻克所…