微信小程序(组件--视图组件)

【前言】

什么是组件?
  • 组件就是我们写HTML的一些基本标签,比如div、span、p、ul、li等。在大多数HTML里面的标签,很多都是要自己写上一些效果的,但是在小程序里面,很多标签都带有自己的效果,可以实现一些简单的JS逻辑。
  • 微信小程序里有很多很有意思的组件,这些组件给我们开发小程序提供了很大的便利

简介

  • 一个小程序页面可以分解成多个部分组成,组件就是小程序页面的基本组成单元。为了让开发者可以快速进行开发,小程序的宿主环境提供了一系列基础组件。
  • 组件是在WXML模板文件声明中使用的,WXML的语法和HTML语法相似,小程序使用标签名来引用一个组件,通常包含开始标签和结束标签,该标签的属性用来描述该组件。

组件类型

小程序按照应用场景将组件分为以下几个常用类型

  1. 视图容器组件—view、swiper
  2. 基础内容组件—icon
  3. 表单组件
  4. 导航组件
  5. 媒体组件
  6. 地图组件
  7. 画布组件

tabBar页面

首先新建视图文件夹,编写测试视图容器组件代码,文件结构:
微信小程序(组件--视图组件)_第1张图片
为了方便查看调试代码,接下来新建个组件相关的tabBar,用来测试相关组件效果
微信小程序(组件--视图组件)_第2张图片

<view class="list-area">
  <block wx:for="{{list}}" wx:key="name">
    <view class="list-item" bindtap="{{item.tap}}">
      <text>{{item.name}}</text>
      <view class="list-item-btn">
        <image src="/static/tabs/right.png"></image>
      </view>
    </view>
  </block>
</view>
.list-item{
  width: 100%;
  height: 100rpx;
  border-bottom: 2rpx solid rgba(0, 0, 0, 0.1);
  display: flex;
  justify-content: space-between;
  align-items: center;
  box-sizing: border-box;
  padding: 0 20rpx;
  color: #666;
}
.list-item-btn image{
  display: block;
  width: 40rpx;
  height: 40rpx;
}
  data: {
    list:[
      { name: '视图容器组件', tap: 'viewFn' },
      { name: '基础内容组件', tap: 'basicFn' },
      { name: '表单组件', tap: 'formFn' },
      { name: '导航组件', tap: 'navigateFn' },
      { name: '媒体组件', tap: 'mediaFn' },
      { name: '地图组件', tap: 'mapFn' },
      { name: '画布组件', tap: 'canvasFn' }
    ]
  },

视图容器组件

视图容器组件

  1. view视图容器
  2. swiper滑块视图容器组件和swiper-item滑块组件
  3. movable-area可移动区域组件与movable-view可移动视图组件
  4. scroll-view可滚动视图区域
(1)view视图容器

View组件:是小程序里面的基本组件,它相当于HTML里面的div标签,它拥有几个很棒的属性,可以用来简化我们的小程序开发。
参数

  1. hover-class 这个属性后面接string,string是一个类名,在这个组件被点击的时候,加上string这个类,相当于PC端的鼠标移动上去的效果
  2. hover-stop-propagation 布尔类型值,用于阻止hover-class的冒泡行为
  3. hover-start-time 点击view之后,string延迟多少毫秒出现
  4. hover-stay-time 手指松开后string保留时间,单位毫秒
属性 类型 默认值 是否必填 作用
hover-class string none 指定按下去的样式类。当 hover-class=“none” 时,没有点击态效果
hover-stop-propagation boolean false 指定是否阻止本节点的祖先节点出现点击态
hover-start-time number 50 按住后多久出现点击态,单位毫秒
hover-stay-time number 600 手指松开后点击态保留时间,单位毫秒
(2)滑块视图容器swiper和滑块swiper-item组件
  • swiper大图滚动组件;很多时候在banner那里,要加上大图滚动的效果,这个组件可以很轻易的帮助我们完成这个工作。
  • 滑块视图容器swiper中只可放置swiper-item组件,否则会导致未定义的行为。swiper是大图滚动的最外层标签,swiper-item里面是每一个滚动项。

注意:swiper-item仅可放置在swiper组件中,宽高自动设置为100%
微信小程序(组件--视图组件)_第3张图片
微信小程序(组件--视图组件)_第4张图片

①swiper滑块容器组件默认样式

swiper{
  display: block;
  height: 150px;
}

②swiper-item默认宽高100%
③image图片默认样式

image{
  width: 320px;
  height: 240px;
  display: inline-block;
  overflow: hidden;
}

接下来调整下样式

swiper{
  width: 100%;
  height: 400rpx;
}
swiper swiper-item{
  width: 100%;
  height: 360rpx;
}
swiper swiper-item image{
  width: 100%;
  height: 100%;
  display: block;
}
(2)滑块视图容器swiper—参数
属性 类型 默认值 是否必填 作用
indicator-dots boolean false 是否显示面板指示点
indicator-color color rgba(0, 0, 0, .3) 指示点颜色
indicator-active-color color #000000 当前选中的指示点颜色

滑块swiper-item组件一般都是通过循环得出,所以这里做下调整

<swiper indicator-dots="{{dotsStatus}}" 
indicator-color="{{dotsColor}}" 
indicator-active-color="{{dotsActiveColor}}" 
class="banner-area">
  <block wx:for="{{bannerList}}" wx:key="imgSrc">
    <swiper-item class="banner-area">
      <image src="{{item.imgSrc}}"></image>
    </swiper-item>
  </block>
</swiper>
  /**
   * 页面的初始数据
   */
  data: {
    bannerList:[
      { imgSrc: 'https://up.enterdesk.com/edpic/a0/6c/56/a06c563866a72c23c6d5e65dbf9f0ecc.jpg' },
      { imgSrc: 'https://desk-fd.zol-img.com.cn/t_s960x600c5/g5/M00/00/0A/ChMkJlZqeICIbp_iAAWDtBLmwSoAAGByAFxWdUABYPM819.jpg' },
      { imgSrc: 'https://desk-fd.zol-img.com.cn/t_s960x600c5/g5/M00/00/0A/ChMkJ1ZqeHmIEPu6AAc_ov0pLUsAAGBxwHyDMUABz-6707.jpg' }
    ],
    dotsStatus:true,/**开启指示点 */
    dotsColor:'rgba(0,0,0,0.2)',/**指示点颜色 */
    dotsActiveColor: '#000000'/**激活点颜色 */
  },

微信小程序(组件--视图组件)_第5张图片
自动切换与方向

属性 类型 默认值 是否必填 作用
autoplay boolean false 是否自动切换
interval number 5000 自动切换时间间隔
duration number 500 滑动动画时长
circular boolean false 是否采用衔接滑动
vertical boolean false 滑动方向是否为纵向
current number 0 当前所在滑块的 index()
(2)滑块视图容器swiper和滑块swiper-item组件

自动切换与方向:接下来依次测试下

<swiper indicator-dots="{{dotsStatus}}" 
indicator-color="{{dotsColor}}" 
indicator-active-color="{{dotsActiveColor}}" 
class="banner-area" 
autoplay="{{autoplayValue}}" 
interval="{{intervalValue}}" 
duration="{{durationValue}}" 
circular="{{circularValue}}" 
vertical="{{verticalValue}}" 
current="{{currentValue}}">
  <block wx:for="{{bannerList}}" wx:key="imgSrc">
    <swiper-item class="banner-area">
      <image src="{{item.imgSrc}}"></image>
    </swiper-item>
  </block>
</swiper>
  data: {
    bannerList:[
      { imgSrc: 'https://up.enterdesk.com/edpic/a0/6c/56/a06c563866a72c23c6d5e65dbf9f0ecc.jpg' },
      { imgSrc: 'https://desk-fd.zol-img.com.cn/t_s960x600c5/g5/M00/00/0A/ChMkJlZqeICIbp_iAAWDtBLmwSoAAGByAFxWdUABYPM819.jpg' },
      { imgSrc: 'https://desk-fd.zol-img.com.cn/t_s960x600c5/g5/M00/00/0A/ChMkJ1ZqeHmIEPu6AAc_ov0pLUsAAGBxwHyDMUABz-6707.jpg' }
    ],
    dotsStatus:true,/**开启指示点 */
    dotsColor:'rgba(0,0,0,0.2)',/**指示点颜色 */
    dotsActiveColor: '#000000',/**激活点颜色 */
    autoplayValue:true,/**开启自动播放 */
    intervalValue: '3000',/**自动切换时间间隔 */
    durationValue: '600',/**滑动动画时长 */
    circularValue: true,/**是否采用衔接滑动 */
    verticalValue: false,/**滑动方向是否为纵向 */
    currentValue: '0'/**当前所在滑块的index */
  },

微信小程序(组件--视图组件)_第6张图片

注意:
current为当前所在滑块的 index,取值不能超过滑块组件索引,如果超过,控制台会显示警告
在这里插入图片描述

布局样式
属性 类型 默认值 是否必填 作用
previous-margin string “0px” 前边距,可用于露出前一项的一小部分,接受 px 和 rpx 值
next-margin string “0px” 后边距,可用于露出后一项的一小部分,接受 px 和 rpx 值
display-multiple-items number 1 同时显示的滑块数量
bindchange function current 改变时会触发 change 事件

布局样式

previous-margin string “0px” 前边距,可用于露出前一项的一小部分,接受 px 和 rpx 值
next-margin string “0px” 后边距,可用于露出后一项的一小部分,接受 px 和 rpx 值
<swiper previous-margin="{{previousMargin}}" next-margin="{{nextMargin}}">
	<!-- 轮播内容 -->
</swiper>
data{
	previousMargin:'60rpx',/**前边距 */
    nextMargin:'60rpx'/**后边距 */
},

微信小程序(组件--视图组件)_第7张图片
布局样式—切换触发函数

bindchange function current 改变时会触发 change 事件
bindchange="changeSwiper"
/**切换触发 */
changeSwiper(event){
  console.log(event.detail);
},

bindchange函数返回值
微信小程序(组件--视图组件)_第8张图片

current:当前滑块组件索引;
source:切换的原因/操作

(2)注意:滑块swiper-item组件属性

仅可放置在swiper组件中,宽高自动设置为100%

属性 类型 默认值 是否必填 作用
item-id string 该 swiper-item 的标识符

微信小程序(组件--视图组件)_第9张图片
设置完item-id即滑块组件swiper-item 的标识符后,bindchange事件触发时,便可获取该滑块组件标识符currentItemId
微信小程序(组件--视图组件)_第10张图片

(2)滑块视图容器swiper和滑块swiper-item组件

change事件 source 返回值

从 1.4.0 开始,change事件增加 source字段,表示导致变更的原因,可能值如下:

  1. autoplay 自动播放导致swiper变化
  2. touch 用户划动引起swiper变化
  3. 其它原因将用空字符串表示

微信小程序swiper实现滑动放大缩小效果
微信小程序(组件--视图组件)_第11张图片
篇幅问题,详情参见下节小编文章

滑块视图容器swiper属性

属性 类型 默认值 是否必填 作用
easing-function string “default” 指定 swiper 切换缓动动画类型

easing-function 的合法值

  1. default默认缓动函数;②linear线性动画;③easeInCubic缓入动画
  2. easeOutCubic缓出动画;⑤easeInOutCubic缓入缓出动画
属性 类型 默认值 是否必填 作用
bindtransition function swiper-item 的位置发生改变时会触发 transition 事件,event.detail = {dx: dx, dy: dy}
bindanimationfinish function 动画结束时会触发 animationfinish 事件,event.detail 同上

bindtransition
微信小程序(组件--视图组件)_第12张图片

/**swiper-item的位置发生改变时会触发transition事件 */
bindtransitionFn(event){
  console.log(event.detail);
},

bindtransition属性设置完毕后,此时滑动轮播图,会触发该事件
微信小程序(组件--视图组件)_第13张图片
bindanimationfinish

bindanimationfinish="bindanimationfinishFn"
/**动画结束时触发 */
bindanimationfinishFn(option){
  console.log(option)
},

此时,banner切换完毕时触发该事件
微信小程序(组件--视图组件)_第14张图片

小结:
类似于swiper-item和swiper关系。movable-view移动视图必须在 movable-area 移动区域组件中,并且必须是直接子节点,否则不能移动

(3)可移动视图区域movable-area与可移动视图movable-view

movable-view为可移动视图,在页面中可以拖拽滑动。

<view>scroll-view可移动视图区域</view>
<movable-area class="moveArea">
  <movable-view direction="all" class="moveViewl"></movable-view>
</movable-area>
/* 可移动容器 */
.moveArea{
  width: 100%;
  height: 300rpx;
  background-color: rgba(0, 0, 0, 0.1);
}
/* 可移动区域 */
.moveArea .moveViewl{
  width: 50rpx;
  height: 50rpx;
  background-color: rgba(0, 0, 0, 0.3);
}

微信小程序(组件--视图组件)_第15张图片

注意:类似于swiper-item和swiper关系。movable-view移动视图必须在 movable-area 移动区域组件中,并且必须是直接子节点,否则不能移动

movable-view参数

属性 类型 默认值 是否必填 作用
direction string none movable-view的移动方向,属性值有all、vertical、horizontal、none
inertia boolean false movable-view是否带有惯性
out-of-bounds boolean false 超过可移动区域后,movable-view是否还可以移动
friction number 2 摩擦系数,用于控制惯性滑动的动画,值越大摩擦力越大,滑动越快停止;必须大于0,否则会被设置成默认值
disabled boolean false 是否禁用
scale boolean false 是否支持双指缩放,默认缩放手势生效区域是在movable-view内
scale-min number 0.5 定义缩放倍数最小值
scale-max number 10 定义缩放倍数最大值
scale-value number 1 定义缩放倍数,取值范围为 0.5 - 10

direction
direction为可移动方向:all所有方向、vertical竖直方向、horizontal水平方向、none不移动
inertia
inertia惯性设置为true时,松开手指后,移动视图movable-view仍然会滑行一段距离。
out-of-bounds
out-of-bounds(极限/限制范围)设为true时,超出仍可移动
friction
friction摩擦系数越大(高速路),惯性滑动距离越短;friction摩擦系数越小(滑冰场),惯性滑动距离越远;
disabled
官方文档:disabled为true时禁用移动视图
问题:disabled="false"时,与设置为true一样。
注意:与hover-stop-propagation属性类似,只要添加了该属性,不管设置为true还是false,都会禁用生效。
scale
问题:movable-view设置scale为true后,发现无法缩放
原因:可移动视图movable-view太小,缩放手势生效区域小,重设视图大小即可

/* 可移动区域 */
.moveArea .moveViewl{
  width: 200rpx;
  height: 200rpx;
  background-color: rgba(0, 0, 0, 0.3);
}

微信小程序(组件--视图组件)_第16张图片
movable-area参数只有一个

属性 类型 默认值 是否必填 作用
scale-area Boolean false 当里面的movable-view设置为支持双指缩放时,设置此值可将缩放手势生效区域修改为整个movable-area

给可移动视图区域movable-area设置scale-area为true时,此时便将缩放手势生效区域修改为整个movable-area

(3)可移动视图区域movable-area与视图movable-view

movable-view参数

属性 类型 默认值 是否必填 作用
scale-min number 0.5 定义缩放倍数最小值
scale-max number 10 定义缩放倍数最大值
scale-value number 1 定义缩放倍数,取值范围为 0.5 - 10
  • scale-min缩小临界值为0.5,即宽高最多缩小一半
  • scale-max方法临界值为10,即宽高最多放大10倍
  • scale-value定义初始渲染时的缩放倍数,默认为wxss样式定义大小
属性 类型 默认值 是否必填 作用
x number 定义x轴方向的偏移,如果x的值不在可移动范围内,会自动移动到可移动范围;改变x的值会触发动画
y number 定义y轴方向的偏移,如果y的值不在可移动范围内,会自动移动到可移动范围;改变y的值会触发动画
damping number 20 阻尼系数,用于控制x或y改变时的动画和过界回弹的动画,值越大移动越快
  x="{{xValue}}"
  y="{{yValue}}"
<button bindtap="moveAreaFn">点击移动到(30rpx,30rpx)</button>
data: {
    xValue:0,
    yValue:0
  },
moveAreaFn(){
  this.setData({
    xValue:30,
    yValue:30
  })
},

微信小程序(组件--视图组件)_第17张图片

damping number 20 阻尼系数,用于控制x或y改变时的动画和过界回弹的动画,值越大移动越快

微信小程序(组件--视图组件)_第18张图片

属性 类型 默认值 是否必填 作用
bindchange function 拖动过程中触发的事件
bindscale function 拖动过程中触发的事件

bindchange参数source

作用
touch 拖动
touch-out-of-bounds 超出移动范围
out-of-bounds 超出移动范围后的回弹
friction 惯性
空字符串 setData

bindchange 返回的 source 表示产生移动的原因
movable-view参数

bindscale function 缩放过程中触发的事件
bindscale="bindscaleFn"
bindscaleFn(option){
  console.log(option)
},

微信小程序(组件--视图组件)_第19张图片

x:x轴方向偏移
y:y轴方向偏移
scale:倍数

小结:
①movable-view 必须设置width和height属性,不设置默认为10px
②movable-view 默认为绝对定位,top和left属性为0px

(4)可滚动视图区域scroll-view

scroll-view为滚动视图,分为水平滚动和垂直滚动。

属性 类型 默认值 是否必填 作用
scroll-x boolean false 允许横向滚动
scroll-y boolean false 允许横向滚动

注意:滚动视图垂直滚动时,一定要设置高度,否则的话scroll-view不会
生效。滚动视图常用的地方一般都是Item项比较多的界面

scroll-y boolean false 允许横向滚动
<view>可滚动视图区域scroll-view</view>
<scroll-view scroll-y="true" class="scrollY">
<view>区域1</view>
<view>区域2</view>
<view>区域3</view>
</scroll-view>
/* 可滚动视图区域 */
.scrollY{
  width: 100%;
  height: 400rpx;
}
.scrollY view{
  width: 200rpx;
  height: 200rpx;
}
.scrollY view:nth-of-type(1){
  background-color: red;
}
.scrollY view:nth-of-type(2){
  background-color: blue;
}
.scrollY view:nth-of-type(3){
  background-color: orange;
}

微信小程序(组件--视图组件)_第20张图片
注意:scroll-view设置垂直滚动时,必须设置高度

scroll-x boolean false 允许横向滚动
<scroll-view scroll-x="true" class="scrollX">
  <view>区域1</view>
  <view>区域2</view>
  <view>区域3</view>
  <view>区域4</view>
  <view>区域5</view>
  <view>区域6</view>
</scroll-view>
.scrollX{
  width: 100%;
  height: 200rpx;
  white-space: nowrap;/**元素不换行 */
}
.scrollX view{
  display: inline-block;/**子元素设置为行内块级 */
  width: 200rpx;
  height: 200rpx;
}
.scrollX view:nth-of-type(2n){
  background-color: #ff5857;
}
.scrollX view:nth-of-type(2n+1){
  background-color: yellowgreen;
}

微信小程序(组件--视图组件)_第21张图片

注意:横向滚动①white-space:nowrap;②display:inline-block;

属性 类型 默认值 是否必填 作用
scroll-top number 设置竖向滚动条位置
scroll-left number 设置竖向滚动条位置

注意

  1. scroll-top仅仅用于设置竖向滚动条位置,scroll-left仅仅用于设置横向滚动条位置
  2. 若要使用下拉刷新,开发中使用页面的滚动,而不是 scroll-view

应用:可滚动导航、全屏滚动

视图容器组件课堂小结
  1. view视图容器
  2. swiper滑块视图容器组件和swiper-item滑块组件
  3. movable-area可移动区域组件与movable-view可移动视图组件
  4. scroll-view可滚动视图区域

你可能感兴趣的:(微信小程序)