微信小程序开发尚学堂 介绍 项目结构 组件 喧嚷 事件 模板

news2024/12/24 0:09:01

一、微信小程序介绍

1. 微信小程序介绍

微信小程序,简称小程序,是一种不需要下载安装即可使用的应用,它实现了应用”触手可及”的梦想,用户扫一扫或搜一下即可打开应用。

说明:

  • 小程序是需要下载的,小程序的占用大小很小,感觉不到下载

  • 目前大小限制2M (最终开发的小程序打包压缩后的大小),如果超过2M,就得做分包上传.之后再合并

  • 进入小程序后继续网络请求数据

2. 小程序特点

微信小程序的特点:

  • 免安装

  • 接近原生(IOS,Android )的app操作基于微信开发。使用wx提供的api开发

  • 必须在微信里面使用

3. 小程序的优缺点

  • ==方便快捷,即用即走==

  • ==速度快、不占内存==

  • 安全稳定、保密性强

  • 功能丰富,场景丰富

  • ==开发成本低、维护简便==

  • ==开发周期比较短==

  • 体验好

4.小程序开发需求

  • 不注册可以开发小程序(不能发布)

  • 注册小程序

  • 企业注册(公司内部人员注册好了,给一个APPID)

  • 个人注册

5. 微信小程序的注册

微信公众平台:https://mp.weixin.qq.com/

6. 开发工具

  • 开发工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

二、开发微信小程序


1. 项目目录结构介绍

1.1 pages目录

pages目录下放的就是小程序中的各个页面。 在pages中创建页面的时候,会出现4个文件:

  • xxx.js:页面相关的js代码可以写在这里

  • xxx.wxml:这个就是页面文件,相当于我们之前的HTML,所以页面结构内容写在这里

  • xxx.wxss:页面的样式内容,相当于之前的css,所以页面相关的样式可以写在这里

  • xxx.json:页面有关的配置,比如页面导航栏的背景色、内容等等

比如:

1.2 app.js文件

app.js文件是整个项目的一个总体配置。里面包含了项目运行生命周期的回调函数

1.3 app.json文件

app.json文件是整个项目的配置文件。里面配置了页面,窗口的设置等等。小程序根目录下的 app.json 文件用来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。

1.4 app.wxss文件

  • app.wxss 文件是微信小程序项目的全局样式表,它可以应用到所有的wxml文件中。

  • 微信小程序中使用 rpx 作为长度单位。1rpx = 1/750 屏幕宽度。也就是屏幕宽度等于 750rpx。

  • px 也可以使用,表示的是设备独立像素

  • 建议使用长度单位 rpx。它自动做了适配。

1.5 project.config.json文件

project.config.json文件是==小程序项目的配置文件(如开发工具的外观配置,)==,一般不需要修改,我们目前就改一个地方:

"checkSiteMap":false

这的作用是控制台不要有一些没用的警告

Sitemap:搜索功能文件,指定哪些页面可以被搜索,可被配置。是搜索小程序时,指定哪些页面允许被搜索到。

2.app.json

解决Comments are not permitted in JSON.

错误显示:
解决方法:

点击底部工具栏的 JSON

弹出的窗口中输入 json with Comments ,找到检索项后点击

小程序根目录下的 app.json 文件用来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。

app.json 文件用来对微信小程序进行全局配置。文件内容为一个 JSON 对象,有以下属性:

https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html

window(设置小程序的状态栏、导航条、标题、窗口背景色)

tabBar(tab栏)

如果小程序是一个多 tab 应用(客户端窗口的底部或顶部有 tab 栏可以切换页面),可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页面。

 "color": "#333",
    "selectedColor": "#ff0000",//文字选中时的颜色
    "backgroundColor": "#f5f5f5",//背景色
    "borderStyle": "black",//边框的颜色
    "list": [{//导航栏选项卡

修改每个tab页面显示的导航标题。

4.2 具体实现

WXSS

https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxss.html

WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式,决定 WXML 的组件应该怎么显示。

为了适应广大的前端开发者,WXSS 具有 CSS 大部分特性。同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改

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

  • 尺寸单位

  • 样式导入

尺寸单位

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

尺寸单位:750的设计稿(物理像素)刚好等于750rpx,即,750px=750rpx

样式导入:从一个.wxss导入到另一个.wxss

@import 'wxss的相对路径';

CSS中 一样的设置(比如:字体),下面的设置覆盖上面的;

三、微信小程序组件

html:div、span、ul、li 、img

小程序:上面所有的标签都没有,称为组件。view+text+image

view 块元素,类似div

<view>块元素,可以嵌套view和其他元素</view>

5.1 介绍

微信小程序中的组件就相当于之前HTML中的标签。但是小程序中的组件除了包裹功能,还具有样式和js功能。

5.2 view组件

视图容器,view组件就相当于之前HTML中的div标签。

  • 在index.wxml中编写如下代码:

<view style="background-color: pink;"class="wrapper">我的第一个微信程序</view>
  • 在index.wxss中编写如下代码:

.wrapper{
    width: 100%;
    height: 100rpx;
    text-align: center;
    line-height: 100rpx;
    background-color: skyblue;
}
  • 效果:

5.3 text组件

文本组件,相当于HTML中的span标签。

<text>啦啦啦啦</text>

5.4 swiper组件

滑块视图容器。其中只可放置swiper-item组件,否则会导致未定义的行为。

也就是说swiper内部只能放swiper-item组件,而swiper-item组件中可以随便放其它组件及内容了

5.4.1默认效果
<swiper class="banner">
  <swiper-item>item1</swiper-item>
  <swiper-item>item2</swiper-item>
  <swiper-item>item3</swiper-item>
</swiper>
.banner{
    height: 80rpx;
    text-align: center;
    line-height: 80rpx;
}

可以看到swiper组件有轮播图的效果。而且它有默认的高度(150px)。

swiper组件有很多属性,大家可以参照参考文档去体验一下。地址:https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html

5.4.2swiper的属性

更多操作 属性

类型

默认值必填

说明

indicator-dots

boolean

false

是否显示面板指示点

indicator-color

color

rgba(0, 0, 0, .3)

指示点颜色

indicator-active-color

color

#000000

当前选中的指示点颜色

autoplay

boolean

false

是否自动切换

current

number

0

当前所在滑块的 index

interval

number

5000

自动切换时间间隔

duration

number

500

滑动动画时长

circular

boolean

false

是否采用衔接滑动

vertical

boolean

false

滑动方向是否为纵向

<swiperclass="banner" indicator-dots="true"autoplay="true"  interval="2000"circular="true">
  <swiper-item>item1</swiper-item>
  <swiper-item>item2</swiper-item>
  <swiper-item>item3</swiper-item>
</swiper>

5.5 scroll-view组件

可滚动视图区域。后面我们会用一下。它里面可以放置好多view组件。

横向滚动区域:需要设置:

  1. 一行显示,不换行,溢出隐藏

  1. 下面包含的组件要显示成行内块

<!-- 可滚动视图区域。 -->
<scroll-view class="navs"scroll-x="true"<!-- 允许横向滚动 -->>
  <text>滑块1</text>
  <text>滑块2</text>
  <text>滑块3</text>
  <text>滑块4</text>
  <text>滑块5</text>
  <text>滑块6</text>
  <text>滑块7</text>
</scroll-view>
/*wxss页面*/
.navs{
  height: 100rpx;
  line-height: 100rpx;
  background-color: #eee;
  /* 必须加 */
  white-space: nowrap;
}
.navstext{
  margin: 010px;
  display: inline-block;
}

5.6 icon组件

icon组件就是在页面可以显示一个图标。

type string 是 icon的类型,有效值:success, success_no_circle, info, warn, waiting, cancel, download, search, clear

<icontype="success"></icon>
<icontype="success"size="50"></icon>
<icontype="warn"></icon>

5.10 按钮button

<button size="default">按钮1</button>
<button size="mini">按钮2</button>
<button size="mini" type="primary">按钮3</button>
<button size="mini" type="primary" open-type="share">按钮4</button>

<input type="text" placeholder="没有边框,需要自己写样式" name="" id="" />

<!-- 图片:必须写大小,不写默认大小 -->
<image src="../../images/recommendSong.jpg"></image>

5.14 checkbox 多选框

属性说明

属性

类型

默认值

必填

说明

最低版本

value

string

checkbox标识,选中时触发checkbox-group的 change 事件,并携带 checkbox 的 value

1.0.0

disabled

boolean

false

是否禁用

1.0.0

checked

boolean

false

当前是否选中,可用来设置默认选中

1.0.0

color

string

#09BB07

checkbox的颜色,同 css 的color

1.0.0

示例代码

5.15 form

表单。将组件内的用户输入的switch input checkbox slider radio picker 提交。

当点击 form 表单中 form-type 为 submit 的 button 组件时,会将表单组件中的 value 值进行提交,需要在表单组件中加上 name 来作为 key。

5.16 input文本框

输入框。该组件是原生组件,使用时请注意相关限制

<!--文本框-->
<input placeholder="可输入文本框" type="text"     confirm-type="go"  focus="true" />

5.17 label

用来改进表单组件的可用性。

使用 for 属性找到对应的id,或者将控件放在该标签下,当点击时,就会触发对应的控件。 for优先级高于内部控件,内部有多个控件的时候默认触发第一个控件。 目前可以绑定的控件有:button, checkbox, radio, switch, input

属性说明

属性

类型

默认值

必填

说明

最低版本

for

string

绑定控件的 id

1.0.0

5.18 switch开关选择器

5.19 textarea 多行输入框

5.11 navigator 导航 (超链接)

<!-- 
  navigator组件相当于HTML的超链接标签。
    target属性:在哪个目标上发生跳转,默认self-当前小程序;
    url属性:当前小程序内的跳转链接
    open-type属性:指定跳转方式,默认是navigate
      navigate:保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。
      redirect:关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。
      switchTab:跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
      reLaunch:关闭所有页面,打开到应用内的某个页面
      navigateBack:关闭当前页面,返回上一页面或多级页面。
 -->
<navigator target="self" url="../about/about" open-type="switchTab">点我跳转</navigator>

跳转到页面,都不写后缀名

1、open-type='navigate' 跳转方式:

保留当前页面,跳转应用内的某个页面,但不跳转tabber页面 可以返回当前页

2、open-type="redirect"

关闭当前页面,跳转应用内的某个页面。但是不允许跳转到 tabbar 页面。 没返回,有返回首页

3、open-type="switchTab"

跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 应用于非tabBar跳转到tabBar

4、reLaunch 关闭所有页面,打开到应用内的某个页面 与2的区别是可跳tabBar

5、navigateBack 关闭当前页面,返回上一页面或多级页面。标签的话,就是返回上一页。用方法的话,可以指定返回多少级

6、exit 退出小程序,`target="miniProgram"`时生效 需要用真机去测

<!-- 导航 -->
<navigator url="../detail/detail">进入详情页</navigator>
<navigator url="../detail/detail" open-type="redirect">redirect 进入详情页</navigator>
<navigator url="../index/index" open-type="switchTab">跳转到首页</navigator>
<!-- 还可以调tabBar -->
<navigator url="../detail/detail" open-type="reLaunch">reLaunch 到详情页</navigator>
<navigator open-type="exit" target="miniProgram">退出小程序</navigator>

5.20 image 图片

<image src="../1.jpg" style="height: 300rpx,width: 100%;"></image>

5.12 audio组件 音频组件

<audiosrc=""controls="true"name="你好呀"author="张三"></audio>

5.13 map组件 地图组件

<!-- latitude:维度
     longitude:经度   -->
<map longitude="115" latitude="39"></map>

一、数据绑定

1.渲染层和逻辑层

1.1小程序的宿主环境

小程序依赖于微信客户端提供的环境--宿主环境,小程序借助这个宿注环境提供的功能,可以实现网页无法实现的功能。让小程序更接近原生的app体验。

原生的app:IOS、Android 开发

整个小程序的框架分为两部分:逻辑层(javascript) 和 视图层(界面层 渲染层)

逻辑层和渲染层分离

首先,我们来简单了解下小程序的运行环境。小程序的运行环境分成渲染层和逻辑层,其中 WXML 模板和 WXSS 样式工作在渲染层,JS 脚本工作在逻辑层

小程序的渲染层和逻辑层分别由2个线程管理:渲染层的界面使用了WebView 进行渲染;逻辑层采用JsCore线程运行JS脚本。一个小程序存在多个界面,所以渲染层存在多个WebView线程,这两个线程的通信会经由微信客户端(下文中也会采用Native来代指微信客户端)做中转,逻辑层发送网络请求也经由Native转发,小程序的通信模型下图所示。

2.逻辑层js文件

2.1 app.js 小程序全局逻辑

每个小程序都需要在 app.js 中调用 App 方法注册小程序实例,绑定生命周期回调函数、错误监听和页面不存在监听函数等。

App(object)注册小程序。接受一个 Object 参数,其指定小程序的生命周期回调等

App({})

App() 必须在 app.js 中调用,必须调用且只能调用一次。不然会出现无法预期的后果。

生命周期回调函数:小程序从创建到销毁的整个过程,小程序会自动创建一些函数,在每个阶段会自动触发,不需要调用

包含的内容:

1)生命周期函数 (自动创建的--使用的时候直接在函数里面写)

2)错误监听等函数

3)小程序的全局变量 globalData:{}

4)自定义函数

App({
  /**
   * 生命周期回调—监听小程序初始化
     小程序初始化完成时触发,全局只触发一次。 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
   */
  onLaunch: function () {  },
  /**
   * 当小程序启动,或从后台进入前台显示,会触发 onShow
   */
  onShow: function (options) {  },
​  /**
   * 当小程序从前台进入后台,会触发 onHide
   */
  onHide: function () { },
​  /**
   * 当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
   */
  onError: function (msg) {  },
  /*
    小程序的全局变量,可以实现页面共享数据
  */
  globalData: {
    userName:'admin',//账号
  }
})

整个小程序只有一个 App 实例,是全部页面共享的。开发者可以通过 getApp 方法获取到全局唯一的 App 实例,获取App上的数据或调用开发者注册在 App 上的函数。

// xxx.js
//引入app.js文件
constapp=getApp();
console.log(app); 

2.2 pages.js当前页面逻辑

对于小程序中的每个页面,都需要在页面对应的 js 文件中进行注册,指定页面的初始数据、生命周期回调、事件处理函数等

包含的内容:

1)data界面视图的数据内容

2)生命周期函数

3)事件处理函数,比如下拉触发函数

4)自定义函数

简单的页面可以使用 Page() 进行构造。

Page({
  /**
   * 页面的初始数据
   */
  data: {  },
  /**
   * 生命周期函数--监听页面加载
   * 页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取打开当前页面路径中的参数。
   */
  onLoad: function (options) {  },
  
   /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {},

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {  }
})

2.3 JS模块使用

ES6:

import ss from './' 导入

export default 导出

遵循commonjs 规范:

导出语法:

//1、直接暴露函数名字
module.exports=fun;

//2、直接暴露对象{属性名:函数}
module.exports={
    fun:fun,
    demo:demo    }

引入语法:

const obj=require('../')

3.数据绑定

WXML 中的动态数据均来自对应 Page 的 data。

3.1内容

数据绑定使用 Mustache 语法(双大括号)将变量包起来

<!--语法-->
<组件>{{变量}}</组件>
//wxml
//<view>数据绑定{{msg}}--{{num}}</view>
//<view>{{arr[0]}}</view>
//<view>书名:{{book.bookName}}  价格:{{book.price}}</view>
data: {
    msg:"hello 小程序",
    num:20,
    arr:[10,20,30],
    book:{
         bookName:'西游记',
         price:109
    }
},

3.2组件属性(需要在双引号之内)

<组件 class="{{}}" data-xx="{{}}"></组件>
//<view class="{{active}}">属性获取数据绑定</view>
//相当于 class="red"
data: {
    active:'red'    },

3.3三目运算

//<view class="{{flag?'red':'green'}}">是否加样式</view>
data: {
    flag:false,
},

4.列表渲染

4.1wx:for

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

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

【例子1】

<view wx:for="{{info}}">
  {{index}}:{{item}}
</view>
Page({
  data: {
    info: ['周一', '周二', '周三', '周四', '周五'],
  }
})

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

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

默认不修改,循环嵌套的时候必须修改。 (改名一般用于嵌套for循环

<view wx:for="{{objArr}}" wx:for-index="i" wx:for-item="itemName">
  {{i}}: {{itemName.message}}
</view>

4.2block 空标签wx:for

可以将 wx:for 用在<block/>标签上,以渲染一个包含多节点的结构块。block只起到包裹作用,不会被渲染,节省标签

<block wx:for="{{objArr}}">
  <view>{{item.title}}</view>
  <view>{{item.desc}}</view>
</block>

4.3wx:key

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

wx:key 的值以两种形式提供

  1. 字符串,代表在 for 循环的 array 中 item 的某个 property,该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变

  1. 保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字。

如不提供 wx:key,会报一个 warning, 如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。

<blockwx:for="{{objArr}}"wx:key="index">
  <view>{{item.title}}</view>
  <view>{{item.desc}}</view>
</block>

5. 条件渲染

5.1wx:if

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

<!--语法-->
<组件 wx:if="{{变量、表达式}}"></组件>

说明:

变量、表达式值为true时显示组件

变量、表达式值为false时隐藏组件

<view wx:if="{{!falg}}">去吗?配吗?战吗?站啊!</view>
	//也可以用 wx:elif 和 wx:else 来添加一个 else 块:
<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>
	//常用wx:if="{{}}"和wx:else来判断:
<view wx:if="{{flag}}">是否显示:wx:if</view>
<view wx:else>取反操作:wx:else</view>

5.2 block wx:if

因为 wx:if 是一个控制属性,需要将它添加到一个标签上。如果要一次性判断多个组件标签,可以使用一个 <block/> 标签将多个组件包装起来,并在上边使用 wx:if 控制属性。

<block wx:if="{{true}}">
  <view> view1 </view>
  <view> view2 </view>
</block>

注意: <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

5.3 hidden

表示是否隐藏该代码块。

<!--语法-->
<组件 hidden="{{变量、表达式}}"></组件>
<view hidden="{{3<2}}">易烊千玺</view>

5.4 wx:if vs hidden TF对他俩来说正好相反

wx:if:控制组件显示隐藏通过控制组件是否 添加和删除

hidden:控制组件显示隐藏是 通过控制wxss样式display属性

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

二、事件处理

1.事件

1.1 什么是事件

  • 事件是视图层到逻辑层的通讯方式。

  • 事件可以将用户的行为反馈到逻辑层进行处理。

  • 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。

  • 事件对象可以携带额外信息,如 id, dataset, touches。

1.2 事件分类

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

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

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

WXML的冒泡事件列表:

类型

触发条件

最低版本

touchstart

手指触摸动作开始

touchmove

手指触摸后移动

touchcancel

手指触摸动作被打断,如来电提醒,弹窗

touchend

手指触摸动作结束

tap

手指触摸后马上离开(点击),相当于click

注:除上表之外的其他组件自定义事件如无特殊声明都是非冒泡事件,如 form 的submit事件,input 的input事件,scroll-view 的scroll事件,

1.3 普通事件绑定

事件绑定的写法类似于组件的属性,语法如下:

冒泡事件:<组件bind事件名="函数名"></组件>

非冒泡事件:<组件catch事件名="函数名"></组件>

//js
函数名(){}
<view bindtap="demo">
  点我试试
  <view bindtap="child">试试就试试</view>
</view>
//ES6写法
demo(){
    console.log('儿子我是你爸爸');
},
child(){
    console.log('我有爸爸了');
},

如果用户点击这个 view ,则对应的函数会被调用。

1.4 绑定并阻止事件冒泡

除 bind 外,也可以用 catch 来绑定事件。与 bind 不同, catch 会阻止事件向上冒泡。

<view bindtap="demo">
  点我试试
  <view catchtap="child">试试就试试</view>
</view>

1.5 事件传参

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

在 WXML 中,这些自定义数据以 data- 开头,多个单词由连字符 - 连接。这种写法中,连字符写法会转换成驼峰写法,而大写字符会自动转成小写字符。如:

  • data-element-type ,最终会呈现为 event.currentTarget.dataset.elementType

连字符变小驼峰第二个单词首字母大写

  • data-elementType ,最终会呈现为 event.currentTarget.dataset.elementtype

小驼峰变全小写驼峰

<view 
bindtap="getParams" 
data-id="8090"   
data-user="{{user}}"
data-user-name="admin">
    事件传参
</view>
data: {
    user:'张三'
  },
  //参数的传递
  getParams(e){
    console.log(e);
    console.log(e.target.dataset.id);
  },

1.6setData方法

setData 函数用于将数据从逻辑层发送到视图层,同时改变对应的 this.data 的值。

注意:

  1. 直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致

  1. 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。

<button type="primary"bindtap="change">点击切换显示隐藏</button>
<view class="box"wx:if="{{flag}}"></view>
//视图同步修改  //非侵入式
this.setData({
    flag:!this.data.flag
});
//this.flag=!this.flag  //vue方式侵入式 内部修改

2.小案例

点击的当前元素添加背景颜色

<view wx:for="{{arr}}" class="{{index===num?'bg':''}}"  data-index="{{index}}"    bindtap="changeBg">
  {{item}}
</view>
data: {
    num: 0,
    arr: ['周六', '周日', '周五', '周四', '周三'],
  },
  //给点击的当前行添加背景颜色
  changeBg(e) {
    //点击当前行的时候获取index下标,赋值给data数据里面的num
    this.setData({
      num: e.target.dataset.index
    })
  },

三、模板使用

1.模板

WXML提供模板(template),可以在模板中定义代码片段(wxml、wxss),然后在不同的地方调用。

2.定义模板

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

1.创建模板文件(template)
2.定义模板
    <template name="模板名字">
        <!-- 真实的模板内容template不会渲染起包裹作用 -->
        ...
    </template>
3.引入模板
    wxml中引入:<import src="相对路径"></import>
    wxss中引入:@import "路径";
4.使用模板
    <template is="模板名称"></template>

3.使用模板

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

//例子
1.定义模板
<template name="list">
    <view class="item">
      <view class="left"></view>
      <view class="content"></view>
    </view>
</template>
2.wxml中引入模板
<import src="../../template/list/list"></import>
3.wxss中引入模板
@import "../../template/list/list.wxss";
4.使用模板
<template is="list"></template>

4.模板传递数据

<template is="模板名称" data={{数据变量}}></template>
//语法1
//定义模板
<template name="list">
  <view class="item">
    <view class="left">{{item.img}}</view>
    <view class="content">{{item.info}}</view>
  </view>
</template>

//导入模板
<import src="../../template/list/list"></import>

//使用模板
<view wx:for="{{arr}}" wx:key="index">
  <template is="list" data="{{item}}"></template>
</view>
//语法2
//定义模板
<template name="list">
  <view class="item">
    <view class="left">{{img}}</view>
    <view class="content">{{info}}</view>
  </view>
</template>

//导入模板
<import src="../../templatet/list"></import>

//使用模板
<view wx:for="{{arr}}" wx:key="index">
  <template is="list" data="{{...item}}"></template>
</view>

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

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

相关文章

概论_第6章_统计量及其抽样分布_知识结构

先看知识结构图数量统计的特点是 背记的内容多&#xff0c; 与前面概率论 背记和计算的多 有很大区别。本文从统计量的概念讲起, 一. 统计量定义&#xff1a; 设 ...... 为取自某总体的样本&#xff0c; 若样本函数TT(, ... ) 中不含有任何未知参数&#xff0c; 则称T 为统计…

力扣刷题记录——682. 棒球比赛、628. 三个数的最大乘积、693. 交替位二进制数

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——682. 棒球比赛、628. 三个数的最大乘积…

企业实施RPA需考虑的20条建议

如何提高效率又能降低成本&#xff0c;是企业发展所面临的重要挑战。在降本增效的路上&#xff0c;RPA&#xff08;机器人流程自动化&#xff09;以其特点与优势脱颖而出&#xff0c;迅速得到企业青睐。尽管如此&#xff0c;部署RPA也并非一蹴而就。仓促实施可能会给企业带来更…

实时时钟实现

重要知识点 setInterval是一个实现定时调用的函数&#xff0c;可按照指定的周期&#xff08;以毫秒计&#xff09;来调用函数或计算表达式var sNownew Date()&#xff0c;Date 对象会自动把当前日期和时间保存为其初始值。 参数形式有以下&#xff15;种&#xff1a; new Dat…

SpringBoot 接口幂等性实现的4种方案

目录 什么是幂等性 什么是接口幂等性 为什么需要实现幂等性 引入幂等性后对系统的影响 Restful API 接口的幂等性 如何实现幂等性 方案一&#xff1a;数据库唯一主键 方案二&#xff1a;数据库乐观锁 方案三&#xff1a;防重 Token 令牌 方案四、下游传递唯一序列号 实…

mysql连接查询

笛卡尔积现象&#xff1a; 注意&#xff1a; 效率更高的方法&#xff1a;

Pr 计时器动画

​哈喽&#xff0c;各位小伙伴&#xff01;今天我们来学习一下如何制作数字滚动的计时器动画&#xff1f; 新建序列 新建一个1920*1080的序列&#xff0c;选择一张图片作为背景&#xff08;背景图出自不良人第5季&#xff0c;距离第6季开播还有41天&#xff09; 新建文字图层…

5.算法通关面试 --- 递归and分治and贪心

50. Pow(x, n) https://leetcode.cn/problems/powx-n/

【C语言从0到1之文件操作】(原理 画图 举例 不信教不会你 不要放收藏夹落灰 学起来好嘛)

&#x1f57a;作者&#xff1a;迷茫的启明星 &#x1f383;专栏&#xff1a;《数据库》《C语言从0到1专栏》《数据结构》《C语言杂谈》&#x1f3c7;分享喜欢的一句话&#xff1a;心如花木&#xff0c;向阳而生前言在我们的学习中&#xff0c;文件操作是被我们忽略&#xff0c;…

ML 训练与测试数据不满足同分布 - 如何检测?如何解决?

&#x1f604; 同分布问题是数据挖掘中的常见问题&#xff0c;也是ML中的一个重要假设。解决训练与测试数据不满足同分布问题&#xff0c;有助于提高模型的泛化性、稳定性&#xff01; 文章目录一、定义&#xff1a;训练与测试数据不满足同分布定义&#xff1a;❓疑问&#xff…

仿牛客论坛项目

源代码:https://gitee.com/qiuyusy/community 1. Spring 在测试类中使用Spring环境 RunWith(SpringRunner.class) 让Spring先运行ContextConfiguration 导入配置文件implements ApplicationContextAware 后实现方法 获得 applicationContext RunWith(SpringRunner.class) S…

关于JVM

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 内存区域的划分 程序计数器&#xff08;线程私有&#xff09; Java虚拟机栈 (线程私有) 本地方法栈 堆&#xff08;线程共享&#xff09; 方法…

Leetcode:77. 组合、216. 组合总和 III(C++)

目录​​​​​​​ 77. 组合&#xff1a; 问题描述&#xff1a; 实现代码与解析&#xff1a; 递归&#xff08;回溯&#xff09;&#xff1a; 原理思路&#xff1a; 剪枝优化版&#xff1a; 原理思路&#xff1a; 216. 组合总和 III&#xff1a; 问题描述&#xff1a…

[C/C++]指针,指针数组,数组指针,函数指针

文章目录指针内存空间的访问方式指针变量的声明指针的赋值指针运算用指针处理数组元素指针数组用指针作为函数的参数指针型函数指向函数的指针指针 指针是C从C中继承过来的重要数据类型。通过指针技术可以描述各种复杂的数据结构&#xff0c;可以更加灵活的处理字符串&#xf…

Linux下dmi信息分析工具dmidecode原理

dmidecode命令主要是通过DMI获取主机的硬件信息&#xff0c;其输出的信息包括BIOS、系统、主板、处理器、内存、缓存等等。它是通过SMBIOS&#xff08;System Management BIOS)来获取信息的。SMBIOS是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。 什么是DM…

QA特辑 | 以万变钳制黑灰产之变的验证码产品设计逻辑的答案,都在这里

1月12 日下午&#xff0c;就验证码的攻防对抗问题&#xff0c;顶象反欺诈专家大卫从验证码的破解手段讲起&#xff0c;从防御角度深度剖析如何应对黑灰产的攻击以及验证码在产品能力设计层面应该考虑哪些问题。 直播也吸引了众多关注验证码的观众前来围观&#xff0c;针对验证…

vue3性能优化

文章目录1. Lighthouse1.1 性能参数2. rollup-plugin-visualizer&#xff08;打包代码块分析&#xff09;3. vite配置优化4. PWA离线缓存技术5. 其他优化1. Lighthouse 谷歌浏览器自带的 DevTools 也可以全局安装Lighthouse # 安装 yarn global add lighthouse# 使用 lighth…

Android app集成微信支付

Android app集成微信支付 鉴于微信支付的文档入口不太容易找到、以及文档中有些逻辑不通或者容易产生歧义或者缺失一些信息的情况&#xff0c;记录下此次接入的流程和需要关注的一些点。 使用的是app支付-> APP支付产品介绍 首先阅读介绍等&#xff0c;了解一些基础的概念…

c++数据结构-图(详解附算法代码,一看就懂)

图&#xff08;Graph&#xff09;是一种复杂的非线性结构&#xff0c;它可以描述数据间的关系&#xff0c;被广泛使用。图 G 由两个集合 V 和 E 组成&#xff0c;记为 。V是顶点的有穷非空集合&#xff0c;E是边的集合。通常&#xff0c;也将 G 的顶点集和边集表示为 V(G) 和 E…

尚医通-登录注册搭建-JWT(二十八)

目录&#xff1a; &#xff08;1&#xff09;前台用户系统-登录注册-需求分析 &#xff08;2&#xff09;前台用户系统-登录注册-搭建环境 &#xff08;3&#xff09;前台用户系统-手机登录-基本实现 &#xff08;4&#xff09;前台用户系统-手机登录-整合JWT &#xff08;…