微信小程序——组件定义及属性(view组件)

小程序定义了各种各样的组件,它们在WXML中起着各不同的作用。与HTML元素一样,一个组件是指从组件开始标签到结束标签的所有代码,由于组件可能会被转译为不同端对应的代码,所以在页面创建过程中,不能使用小程序组件标签以外的标签。

组件定义及属性

1)组件是视图层的基本组成单元

2)组件自带一些功能与微信风格的样式

3)一个组件通常包括开始标签和结束标签,属性用来修饰这个组件,内容在两个标签之内

按类型可以将组件划分为七大类:视图容器、基础内容、表单、导航、多媒体、地图、画布

一个完整的组件结构如下:

<tagname property="value">contents</tagname>
 
 

组件可以通过属性进行配置,属性只能用在开始标签或单个自闭合标签上,不能用于结束标签。一个组件可以对应多个属性,属性具有名称和值两部分,组件的属性名称都是小写,以连字符“-”连接。组件属性分为所有组件都有的共同属性和组件自定义的特殊属性。

1.组件的共同属性

  • id:组件的唯一表示,保持整个页面唯一。
  • class:组件里的样式类,在对应的WXSS中定义的样式类。
  • style:组件的内联样式,可以动态设置的内联样式。使用方式同HTML标签style属性。
  • hidden:组件是否显示,所有组件默认显示。
  • data-*:自定义属性,组件上触发事件时,会发送给事件处理函数。事件处理函数可以通过datascl获取。
  • bind*/catch*:组件的事件,绑定逻辑层相关事件处理函数。bind为冒泡事件,catch为非冒泡事件。

除上述属性以外几乎所有组件都有自定义属性,可以对该组件的功能或样式进行修饰,具体参考各个组件的定义。

2.组件的属性类型

每个属性都有其对应的类型,使用时应给属性值传入对应的类型值,属性按类型可分为:

 

  • Boolean:布尔值,组件写上该属性,不管该属性等于什么,其值都为true,只有组件上没有写该属性时,属性值才为false。如果属性值为变量,变量的值会被转换为Boolean类型。
  • Number:数字。
  • String:字符串。
  • Array:数组。
  • Object:对象。
  • EventHandler:事件处理函数名。
  • Any:任意属性。

视图容器

 

有过前端经验的同学都了解,在前端项目中我们常使用DIV+CSS进行页面布局,其中<div/>没有任何语义和功能,仅作为容器元素存在,在小程序中,有一套类似<div/>的容器组件,那就是<view/>、<scroll-view/>和<swiper/>。在HTML中大部分标签内部能嵌套任何标签,如<div/>、<span/>、<section/>、<p/>等,但是在小程序中,大部分组件都有它自己特殊的功能和意义,标签都有特定的用法,内部也只能嵌套指定的组件,而容器组件内部能嵌套任何标签,容器组件是构建布局的基础组件。本小节主要介绍视图类容器。

View组件

<view/>是一个块级容器组件,没有特殊功能,主要用于布局展示,是布局中最基本的UI组件,任何一种复杂的布局都可以通过嵌套<view/>组件,设置相关WXSS实现。<view/>支持常用的CSS布局属性,如display、float、position甚至Flex布局等,熟悉DIV+CSS的人应该很容易上手

<view/>具备一套关于点击行为的属性:

  • hover:是否启动点击态,默认值为false
  • hover-class:指定按下去的样式,当hover-class="none"时,没有点击态效果,默认值为none
  • hover-start-time:按住多久出现点击态,单位毫秒,默认值为50
  • hover-stay-time:手指松开后点击态保留时间,单位毫秒,默认值为400

1)水平3栏布局

示例代码如下:


 
 
  1. <view style="display:flex;">
  2. <view style='background-color:red;flex-grow:1;height:180rpx;'> </view>
  3. <view style='background-color:blue;flex-grow:1;height:180rpx;'> </view>
  4. <view style='background-color:green;flex-grow:1;height:180rpx;'> </view>
  5. </view>

执行结果如下:

2)左右混合布局

示例代码如下:


 
 
  1. <view style='display:flex;height:400rpx;'>
  2. <view style='background-color:red;width:250rpx;color:#fff;'>1 </view>
  3. <view style='flex-grow:1;display:flex;flex-direction:column;'>
  4. <view style='flex-grow:1;background-color:blue;color:#fff;'>2 </view>
  5. <view style='flex-grow:1;background-color:green;color:#fff'>3 </view>
  6. </view>
  7. </view>

执行结果如下:

3)上下混合布局

示例代码如下:


 
 
  1. <view style="display:flex;flex-direction:column;height:400rpx;">
  2. <view style='background-color:red;height:150rpx;color:#fff;'>1 </view>
  3. <view style='flex-grow:1;display:flex;'>
  4. <view style="flex-grow:1;background-color:blue;color:#fff;">2 </view>
  5. <view style='flex-grow:1;background-color:green;color:#fff'>3 </view>
  6. </view>
  7. </view>

执行结果为:

通过上面案例可以发现,任何复杂的布局都是通过不断嵌套<view/>实现的,在小程序中使用<view/>就像我们在HTML使用<div/>一样边界,通过<view/>我们可以构建我们想要的任何页面。

Scroll-view组件

在布局过程中,我们需要一些容器具备可滑动的能力,尽管我们可以通过给<view/>设置overflow:scroll属性来实现,但由于小程序实现原理中没有DOM概念,我们没法直接监听<view/>滚动、触顶、触底等事件,这时便需要使用<scroll-view/>。<scroll-view/>在<view/>基础上增加了滚动相关属性,通过设置这些属性,我们能响应滚动相关事件。<scroll-view/>属性如下:

  • scroll-x:允许横向滚动,默认为false
  • scroll-y:允许纵向滚动,默认为false
  • upper-threshold:距顶部/左边多远时(单位px),触发scrolltoupper事件,默认值为50
  • lower-threshold:距底部/右边多远时(单位px),触发scrolltolower事件,默认值为50
  • scroll-top:设置竖向滚动条位置
  • scroll-left:设置横向滚动条位置
  • scroll-into-view:值应为某子元素id,滚动到该元素时,元素顶部对齐滚动区域顶部
  • bindscrolltoupper:滚动到顶部/左边,会触发scrolltoupper事件
  • bindscrolltolower:滚动到底部/右边,会触发scrolltolower事件
  • bindscroll:滚动时触发,event.detail = {scrollLeft,scrollTop,scrollHeight,scrollWidth,deltaX,deltaY}

目前,有些组件不能在<scroll-view/>中使用:<textarea/>、<video/>、<map/>、<convas/>

下面我们创建一个可滚动视图区,示例代码如下:


 
 
  1. <scroll-view class="scroll-container" upper-threshold="0"
  2. lower-threshold= "100" scroll-into-view= "{{toView}}"
  3. bindscroll= "scroll" bindscrolltolower= "scrollToLower"
  4. bindscrolltoupper= "scrollToUpper" scroll-y= "true"
  5. scroll-top= "{{scrollTop}}">
  6. <view id='item-1' class='scroll-item bg-red'>1 </view>
  7. <view id='item-2' class='scroll-item bg-blue'>2 </view>
  8. <view id='item-3' class='scroll-item bg-red'>3 </view>
  9. <view id='item-4' class='scroll-item bg-blue'>4 </view>
  10. <view id='item-5' class='scroll-item bg-red'>5 </view>
  11. <view id='item-6' class='scroll-item bg-blue'>6 </view>
  12. </scroll-view>
  13. <view class='act'>
  14. <button bindtap='scrollToTop'>点击滚动到顶部 </button>
  15. </view>

 
 
  1. .scroll-container{
  2. border:solid 1px;
  3. height: 2400rpx;
  4. }
  5. .scroll-container .scroll-item{
  6. height: 300rpx;
  7. width: 120%;
  8. }
  9. .bg-blue{ background-color: #87CEFA; height: 400rpx;}
  10. .bg-red{ background-color: #FF6347; height: 400rpx;}
  11. .act{ padding: 10px;}

 
 
  1. Page({
  2. data: {
  3. toView: 'item3' //第一次渲染时,<scroll-view>默认滚动到id值为"item-3""区域
  4. },
  5. scrollToUpper: function(){
  6. console.log( '触发到滚动顶部事件');
  7. },
  8. scrollToLower: function(){
  9. console.log( "触发滚动到底部事件");
  10. },
  11. //点击按钮时,滚动到顶部
  12. scroll: function(){
  13. console.log( '触发了滚动事件');
  14. },
  15. scrollToTop: function(){
  16. this.setData({
  17. scrollTop: '0'
  18. });
  19. }
  20. });

执行结果如下:

滑块视图组件

滑块视图容器在前端开发中是一个常见组件,利用它我们可以实现轮播图、滑动页面、图片预览效果等。一个完整的滑块视图组件由<swiper/>和<swiper-item/>连个标签组成,它们不能单独使用,一个<swiper/>中只能放置一个或多个<swiper-item>,放置其他节点会被删除,<swiper-item/>内部能放置任何组件,默认宽高自动设置为100%。<swiper-item/>组件作为容器没有任何特殊属性,<swiper/>组件属性如下:

  • indicator-dots:是否显示面板指示点,默认值为false
  • autoplay:是否自动切换,默认为false
  • current:当前所在页面的index,默认值为0
  • interval:自动切换时间间隔,默认值为5000
  • duration:滑动动画时长,默认值为1000
  • circular:是否采用衔接动画,默认值为false
  • bindchange:current改变时会触发change事件,event.detail={current:current};

1)基本轮播图

示例代码如下:


 
 
  1. <swiper class= "banner" indicator-dots= "true" autoplay= "{{autoplay}}"
  2. current= '0' interval= '2000' duration= '300' bindchange= 'change'>
  3. <block wx:for="{{sliderList}}">
  4. <swiper-item class="{{item.className}}">{{item.name}} </swiper-item>
  5. </block>
  6. </swiper>
  7. <view>
  8. <button bindtap='play'>暂停|播放</button>
  9. < /view>

 
 
  1. .banner{ height: 400px; background-color: #ddd;}
  2. .bg-blue{ background-color: #87CEFA;}
  3. .bg-red{ background-color: #FF6347;}
  4. .bg-green{ background-color: #43CD80;}

 
 
  1. Page({
  2. data:{
  3. autoplay: true,
  4. sliderList:[
  5. { className: 'bg-red', name: 'slider1' },
  6. { className: 'bg-blue', name: 'slider2' },
  7. { className: 'bg-green', name: 'slider3' }
  8. ]
  9. },
  10. play: function(){
  11. this.setData({
  12. autoplay:! this.data.autoplay
  13. });
  14. },
  15. change: function(){
  16. console.log( '执行了滚动');
  17. }
  18. });

执行结果如下:

2)自定义轮播图

<swiper/>默认组件中不能提供面板指示点的样式设置,而在轮播组件中,我们常常需要设置自定义面板指示点,这时可以通过bindchange事件来实现

示例代码如下:


 
 
  1. <swiper indicator-dots= "{{indicatorDots}}" autoplay= "{{autoplay}}" interval= "{{interval}}" duration= "{{duration}}">
  2. <block wx:for="{{image}}">
  3. <swiper-item>
  4. <image style='width:100%;height:100;' src='{{item}}'> </image>
  5. </swiper-item>
  6. </block>
  7. </swiper>

 
 
  1. Page({
  2. data:{
  3. image:[
  4. 'images/un1.jpg',
  5. 'images/un2.jpg',
  6. 'images/un3.jpg'
  7. ],
  8. indicatorDots: true, //是否显示面板指示点
  9. autoplay: true, //是否自动切换
  10. interval: 3000, //自动切换时间间隔
  11. duration: 1000, //滑动动画时长
  12. }
  13. });

执行结果如下: