第四章 页面组件的总结

4.1组件的定义及属性

  1. 组件的定义:组件是由 WXML 结构、样式表和 JavaScript 代码组成的封装单元,可以实现特定的功能或者展示特定的内容。

  2. 属性:属性是组件的特性,用于控制组件的外观和行为。

  3. 常见属性class和style:用于设置组件的样式,class可以引用全局样式表中定义的样式,style用于设置内联样式。data-xxx:自定义数据属性,可以在组件上添加自定义的数据,用于在事件处理或样式控制中使用。id:为组件指定唯一的标识符,方便 JavaScript 操作和样式控制。bind/ catch事件:用于绑定组件的事件处理函数

4.2容器视图组件 

容器视图组件用于承载和布局其他组件或内容,是构建页面结构的基础概。

常用的容器视图组件及其属性:

  1. view(视图容器)

    • view 是小程序中最常用的容器组件之一,用于承载其他组件或内容,并控制它们的布局和样式。
    • 常见属性包括 class、style、data、id,以及事件绑定相关的 bind/ catch 等。
  2. scroll-view(可滚动视图区域)

    • scroll-view 是一个可滚动的区域,可用于显示超出容器尺寸的内容。
    • 属性包括 scroll-x(横向滚动)、scroll-y(纵向滚动)、scroll-top(滚动到顶部位置)、scroll-left(滚动到左边位置)等。
  3. swiper(滑块视图容器)

    • swiper 是一个可以左右滑动切换的视图容器。
    • 属性包括 indicator-dots(是否显示指示点)、autoplay(是否自动切换)、interval(自动切换时间间隔)等。

view组件示例 

.xml 

<view style="text-align: center;">默认flex布局</view>
<view style="display: flex;">
  <view style="border: 1px solid red;flex-grow: 1;">1</view>
  <view style="border: 1px solid red;flex-grow: 1;">1</view>
  <view style="border: 1px solid red;flex-grow: 1;">1</view>
</view>
<view style="text-align: center;">上下混合布局</view>
  <view style="display: flex;flex-direction: column;">
  <view style="border: 1px solid red;">1</view>
    <view style="display: flex;">
    <view style="border: 1px solid red;flex-grow: 1;">2</view>
    <view style="border: 1px solid red;flex-grow: 1;">3</view>
    </view>
  </view>
  <view style="text-align: center;">左右混合布局</view>
  <view style="display: flex;">
    <view style="border: 1px solid red;flex-grow: 1;">1</view>
    <view style="display: flex;flex-direction: column;flex-grow: 1;">
    <view style="border: 1px solid red;flex-grow: 1;">2</view>
    <view style="border: 1px solid red;flex-grow: 1;">3</view>
    </view>
    </view>
效果图 

scroll-view示例 

.xml

<swiper indicator-dots='true' autoplay='true' interval='5000' duration ='1000'>
  <swiper-item>
    <image src="../image/电源.png" style="width: 100%;"></image>
  </swiper-item>
  <swiper-item>
    <image src="../image/耳机.png" style="width: 100%;"></image>
  </swiper-item>
  <swiper-item>
    <image src="../image/风扇.png" style="width: 100%;"></image>
  </swiper-item>
</swiper>
效果图 

swiper示例 

<swiper autoplay interval="2000" duration="500" style="height: 200rpx;">
  <swiper-item>
    <view style="height: 200rpx; background-color: #ff6666;">Slide 1</view>
  </swiper-item>
  <swiper-item>
    <view style="height: 200rpx; background-color: #66ccff;">Slide 2</view>
  </swiper-item>
  <swiper-item>
    <view style="height: 200rpx; background-color: #99ff99;">Slide 3</view>
  </swiper-item>
</swiper>
效果图 

4.3基础内容组件 

icon

.xml

<view>icon类型:
  <block wx:for="{{iconType}}">
    <icon type="{{item}}"/>{{item}}
  </block>
</view>
<view>icon大小:
  <block wx:for="{{iconSize}}">
    <icon type="success" size="{{item}}"/>{{item}}
  </block>
</view>
<view>icon颜色:
  <block wx:for="{{iconColor}}">
    <icon type="success" size="30" color="{{item}}"/>{{item}}
  </block>
</view>

.js

Page({
  data:{
    iconType:["success","success_no_circle","info","warn","waiting","cancel","download","search","clear"],
    iconSize:[10,20,30,40],
    iconColor:['#f00','#0f0','#00f']
  }
})

效果图 

text

示例代码如下

<block wx:for="{{x}}" wx:for-item="x">
<view class="aa">
<block wx:for="{{25-x}}" wx:for-item="x">
<text decode="{{true}}" space="{{true}}">&nbsp;</text></block>
<block wx:for="{{y}}" wx:for-item="y">
<block wx:if="{{y<=2*x-1}}">
<text>*</text></block></block></view></block>
<block wx:for="{{x}}" wx:for-item="x">
<view class="aa">
<block wx:for="{{19+x}}" wx:for-item="x">
<text decode="{{true}}" space="{{true}}">&nbsp;</text></block>
<block wx:for="{{y}}" wx:for-item="y">
<block wx:if="{{y<=11-2*x}}">
<text>*</text></block></block></view></block>
Page({
  data:{
    x:[1,2,3,4,5],
    y:[1,2,3,4,5,6,7,8,9]
  }
})

 效果图

progress 

显示进度状态

示例代码

<view>显示百分比</view>
<progress percent="80" show-info="80"></progress>
<view>改变宽度</view>
<progress percent="50" stroke-width="2"></progress>
<view>自动显示进度条</view>
<progress percent="80" active></progress>
效果图 

4.4表单组件 

表单组件用于收集用户输入的数据,常用于用户登录、注册、提交信息等场景。以下是一些常用的微信小程序表单组件:

  1. input(输入框)

    • 用于接收用户的单行文本输入。
    • 可以设置类型(text、number、password 等)、占位符、最大长度、默认值等属性。
  2. textarea(文本域)

    • 用于接收用户的多行文本输入。
    • 可以设置占位符、最大长度、默认值等属性。
  3. checkbox(复选框)

    • 用于让用户选择一个或多个选项。
    • 可以设置选项列表,以及选中状态和默认值等属性。
  4. radio(单选框)

    • 用于让用户从多个选项中选择一个选项。
    • 可以设置选项列表,以及选中状态和默认值等属性。
  5. switch(开关)

    • 用于表示两种状态之间的切换。
    • 可以设置默认值、开关样式等属性。
  6. slider(滑动选择器)

    • 用于在一个固定的区间内选择一个值。
    • 可以设置最小值、最大值、步长、默认值等属性。
  7. picker(选择器)

    • 用于从预设的列表中选择一个或多个值。
    • 可以设置选项列表、默认值、多列选择等属性。
  8. form(表单)

    • 用于包裹表单中的各个组件,用于提交表单数据。
    • 可以设置提交事件、重置事件等属性。

分门别类 

4.4.1        button组件

示例代码

.xml

<button type="default">typedefault</button>
<button type="primary">typeprimary</button>
<button type="warn">typewarn</button>
<button type="default" bindtap='buttonSize' size="{{size}}">改变size</button>
<button type="default" bindtap='buttonPlain' plain="{{plain}}">改变plain</button>
<button type="default" bindtap='buttonLoading' loading="{{loading}}">改变loading显示</button>

.js 

Page({
  data:{
    size:'default',
    plain:'false',
    loading:'false'
  },
  buttonSize:function(){
    if(this.data.size=="default")
    this.setData({size:'mini'})
    else
    this.setData({size:'default'})
  },
buttonLoading:function(){
  this.setData({loading:!this.data.loading})
}
})
效果图 

4.4.2        radio单选框  

示例代码

.xml

<view>选择你喜爱的城市:</view>
<radio-group bindchange="citychange">
     <radio value="西安">西安</radio>
     <radio value="北京">北京</radio>
     <radio value="上海">上海</radio>
     <radio value="广州">广州</radio>
     <radio value="深圳">深圳</radio>
</radio-group>
<view>你的选择:{{city}}</view>
<view>选择你喜爱的计算机语音:</view>
<radio-group class="radio-group" bindchange="radiochange">
      <label class="radio" wx:for="{{radios}}">
          <radio value="{{item.value}}" checked="{{item.checked}}"/>{{item.name}}
      </label>
</radio-group>
<view>你的选择:{{lang}}</view>

.js 

Page({
  data:{
    radios:[
      {name:'java',value:'JAVA'},
      {name:'python',value:'Python',checked:'true'},
      {name:'php',value:'PHP'},
      {name:'swif',value:'Swif'},
    ],
    city:"",
    lang:""
  },
  citychange:function(e){
    this.setData({city:e.detail.value});
  },
  radiochange:function(event){
    this.setData({lang:event.detail.value});
    console.log(event.detail.value)
  }
})
效果图 

 

4.4.3        checkbox复选框

示例代码

.xml

<view>选择你想去的城市:</view>
<checkbox-group bindchange="cityChange">
<label wx:for="{{citys}}">
<checkbox value="{{item.value}}" checked="{{item.checked}}">{{item.value}}
</checkbox>
</label>
</checkbox-group>
<view>你的选择是:{{city}}</view>

.js 

Page({
    city:"",
    data:{
      citys:[
        {name:'km',value:'昆明'},
        {name:'sy',value:'三亚'},
        {name:'zh',value:'珠海',checked:'true'},
        {name:'dl',value:'大连'}]
  },
  cityChange:function(e){
    console.log(e.detail.value);
    var city=e.detail.value;
    this.setData({city:city})
  }
})
效果图 

4.4.4        switch组件

示例代码

.xml

<view>
   <switch bindchange="swl">{{var1}}</switch>
</view>
<view>
   <switch checked bindchange="swl">{{var2}}</switch>
</view>
<view>
   <switch type="checkbox" bindchange="sw3">{{var3}}</switch>
</view>

.js 

Page({
  data:{
    var1:'关',
    var2:'开',
    var3:'已选'
  },
  sw1:function(e){
    this.setData({var1:e.detail.value? '开':'关'})
  },
  sw2:function(e){
    this.setData({var2:e.detail.value? '开':'关'})
  },
  sw3:function(e){
    this.setData({var3:e.detail.value? '已选':'关'})
  }
})
效果图 

4.4.5        slider滑动选择器

示例代码

.xml

<view>默认min=0 max=100 step=1</view>
<slider></slider>
<view>显示当前值</view>
<slider show-value></slider>
<view>设置min=20 max=200 step=10</view>
<slider min='0' max='200' step="10" show-value></slider>
<view>背景条红色,已选定颜色绿色</view>
<slider color="#f00" selected-color="#0f0"></slider>
<view>滑动改变icon的大小</view>
<slider show-value bindchange='sliderchange'></slider>
<icon type="success" size="{{size}}"></icon>

.js

Page({
  data:{
    size:'20'
  },
  sliderchange:function(e){
    this.setData({size:e.detail.value})
  }
})
效果图 

4.4.6        picker滚动选择器

.xml

<view>---range为数组---</view>
<picker range="{{array}}" value="{{index1}}" bindchange="arrayChange">
      当前选择:{{array[index1]}}
</picker>
<view>---range为数组对象---</view>
<picker 
bindchange="objArrayChange" value="{{index2}}" range-key="name" range="{{objArray}}">
      当前选择:{{objArray[index2].name}}
</picker>

.js

Page({
  data:{
    array:['Java','Python','C','C#'],
    objArray:[
      {id:0,name:'Java'},
      {id:1,name:'Python'},
      {id:2,name:'C'},
      {id:3,name:'C#'},
    ],
    index1:0,
    index2:0
  },
  arrayChange:function(e){
    console.log('picker值变为',e.detail.value)
    var index=0;
    this.setData({
      index1:e.detail.value
    })
  },
  objArrayChange:function(e){
    console.log('picker值变为',e.detail.value)
    var index=0;
    this.setData({
      index2:e.detail.value
    })
  }
})
效果图 

4.4.7        picker-view

.xml

<view>当前日期:{{year}}年{{year}}月{{day}}日</view>
<picker-view indicator-style="height:50px;" style="width: 100%;height: 300px;" value="{{value}}" bindchange="bindChange">
    <picker-view-column>
      <view wx:for="{{years}}" style="line-height: 50px;">{{item}}年</view>
    </picker-view-column>
    <picker-view-column>
    <view wx:for="{{months}}" style="line-height: 50px;">{{item}}月</view>
    </picker-view-column>
    <picker-view-column>
    <view wx:for="{{days}}" style="line-height: 50px;">{{item}}日</view>
    </picker-view-column>
</picker-view>

.js

const date=new Date()
const years=[]
const months=[]
const days=[]
for(let i=1900;i<=2050;i++){
  years.push(i)
}
for(let i=1;i<=12;i++){
  months.push(i)
}
for(let i=1;i<=31;i++){
  days.push(i)
}
Page({
  data:{
    years:years,
    months:months,
    days:days,
    year:date.getFullYear(),
    months:date.getMonth()+1,
    day:date.getDate(),
    value:[118,0,0],
  },
  bindChange:function(e){
    const val=e.detail.value
    console.log(val);
    this.setData({
      year:this.data.years[val[0]],
      month:this.data.months[val[1]],
      day:this.data.days[val[2]]
    })
  }
})
效果图 

4.4.8        from

.xml

<form bindsubmit="forSubnit" bindreset="forReset">
<view>姓名:
    <input type="text" name="xm"/>
 </view>
 <view>性别:
    <radio-group name="xb">
    <label>
    <radio value="男" checked/>男</label>
    <label>
    <radio value="女"/>女</label>
    </radio-group>
 </view>
 <view>爱好:
    <checkbox-group name="hobby">
    <label wx:for="{{hobbies}}">
       <checkbox value="{{item.value}}"
       checked="{{item.checked}}">{{item.value}}</checkbox>
    </label>
    </checkbox-group>
 </view>
 <button form-type="submit">提交</button>
 <button form-type="reset">重置</button>
</form>

.js

Page({
  hobby:"",
  data:{
    hobbies:[
      {name:'jsj',value:'计算机',checked:'true'},
      {name:'music',value:'听音乐'},
      {name:'game',value:'玩游戏'},
      {name:'swim',value:'游泳',checked:'true'}
    ]
  },
  formSubmit:function(e){
    console.log('form发生了submit事件,携带数据为:',e.detail.value)
  },
  formReset:function(){
    console.log('form发生了reset事件')
  }
})
效果图 

综合示例 

<!-- input 输入框 -->
<input placeholder="请输入用户名" bindinput="inputChange" />

<!-- textarea 文本域 -->
<textarea placeholder="请输入内容" bindinput="textareaChange"></textarea>

<!-- checkbox 复选框 -->
<checkbox-group bindchange="checkboxChange">
  <label wx:for="{{checkboxItems}}" wx:for-item="item" wx:key="{{item.value}}">
    <checkbox value="{{item.value}}" checked="{{item.checked}}">{{item.name}}</checkbox>
  </label>
</checkbox-group>

<!-- radio 单选框 -->
<radio-group bindchange="radioChange">
  <label wx:for="{{radioItems}}" wx:for-item="item" wx:key="{{item.value}}">
    <radio value="{{item.value}}" checked="{{item.checked}}">{{item.name}}</radio>
  </label>
</radio-group>

<!-- switch 开关 -->
<switch checked="{{switchChecked}}" bindchange="switchChange"></switch>

<!-- slider 滑动选择器 -->
<slider value="{{sliderValue}}" min="0" max="100" bindchange="sliderChange"></slider>

<!-- picker 选择器 -->
<picker mode="selector" range="{{pickerRange}}" value="{{pickerIndex}}" bindchange="pickerChange">
  <view>当前选择:{{pickerRange[pickerIndex]}}</view>
</picker>

<!-- form 表单 -->
<form bindsubmit="formSubmit" bindreset="formReset">
  <button formType="submit">提交</button>
  <button formType="reset">重置</button>
</form>
Page({
  data: {
    inputVal: '', 
    textareaVal: '', 
    checkboxItems: [ 
      { name: '选项1', value: 'value1', checked: false },
      { name: '选项2', value: 'value2', checked: true },
      { name: '选项3', value: 'value3', checked: false }
    ],
    radioItems: [ // radio 单选框的选项列表
      { name: '选项1', value: 'value1', checked: false },
      { name: '选项2', value: 'value2', checked: true },
      { name: '选项3', value: 'value3', checked: false }
    ],
    switchChecked: false, 
    sliderValue: 50, // slider 滑动选择器的值
    pickerRange: ['选项1', '选项2', '选项3'], // picker 选择器的选项列表
    pickerIndex: 0 
  },
  inputChange: function (e) {
    this.setData({
      inputVal: e.detail.value
    });
  },
  textareaChange: function (e) {
    this.setData({
      textareaVal: e.detail.value
    });
  },
  checkboxChange: function (e) {
    const items = this.data.checkboxItems;
    const values = e.detail.value;
    for (let i = 0, lenI = items.length; i < lenI; ++i) {
      items[i].checked = values.indexOf(items[i].value) !== -1;
    }
    this.setData({
      checkboxItems: items
    });
  },
  radioChange: function (e) {
    const items = this.data.radioItems;
    for (let i = 0, lenI = items.length; i < lenI; ++i) {
      items[i].checked = items[i].value === e.detail.value;
    }
    this.setData({
      radioItems: items
    });
  },
  switchChange: function (e) {
    this.setData({
      switchChecked: e.detail.value
    });
  },
  sliderChange: function (e) {
    this.setData({
      sliderValue: e.detail.value
    });
  },
  pickerChange: function (e) {
    this.setData({
      pickerIndex: e.detail.value
    });
  },
  formSubmit: function (e) {
    console.log('提交:', e.detail.value);
  },
  formReset: function () {
    console.log('重置');
  }
});

 效果图

4.5多媒体组件 

多媒体组件用于展示和播放各种类型的多媒体内容,包括图片、音频和视频。

  1. src(图片路径)

    • 图片文件的路径,可以是本地路径或者远程路径。
  2. mode(图片裁剪、缩放的模式)

    • 可以设置为 scaleToFillaspectFitaspectFillwidthFixtopbottomcenterleftrighttop lefttop rightbottom leftbottom right
    • 默认值为 scaleToFill,表示缩放图片以填充容器。
  3. lazy-load(图片懒加载)

    • 是否开启图片懒加载,默认值为 false
    • 设置为 true 表示开启图片懒加载,图片进入可视区域才会加载。
  4. show-menu-by-longpress(长按识别小程序码或者识别图中的文字)

    • 是否开启长按图片识别小程序码或者识别图中的文字,默认值为 false
    • 设置为 true 表示开启,用户长按图片会弹出菜单。
  5. binderror(图片加载失败时触发的事件)

    • 图片加载失败时触发的事件,可以用于处理加载失败的情况。

audio组件

示例代码

.xml

<audio src="{{src}}" action="{{action}}" poster="{{poster}}" name="{{name}}" author="{{author}}" loop controls></audio>
<button type="primary" bindtap='play'>播放</button>
<button type="primary" bindtap='pause'>暂停</button>
<button type="primary" bindtap='playRate'>设置速率</button>
<button type="primary" bindtap='currentTime'>设置当前时间(秒)</button>

.js 

Page({
  data:{
   poster:'',
   name:'此时此刻',
   author:'许巍',
   src:'',
  },
  play:function(){
    this.setData({
      action:{
        method:'play'
      }
    })
  },
  pause:function(){
    this.setData({
      action:{
        method:'psuse'
      }
    })
  },
  playRate:function(){
    this.setData({
      action:{
        method:'setPlaybackRate',
        data:10
      }
    })
    console.log('当前速率:'+this.data.action.data)
  },
  currentTime:function(e){
    this.setData({
      action:{
        method:'setCurrentTime',
        data:120
      }
    })
  }
})
效果图 

video组件 

示例代码

.xml

<video src="{{src}}" controls></video>
<view class="btn-area">
<button bindtap="bindButtonTap">获取视频</button>
</view>

.js 

Page({
  data:{
    src:"",
  },
  bindButtonTap:function(){
    var that = this
    wx.chooseVideo({
sourceType:['album','camera'],
maxDuration:60,
camera:['front','back'],
success:function(res){
  that.setData({
    src:res.tempFilePath
  })
}

    })
  }
  
})
效果图 

 

camra组件

示例代码

.xml

<camera device-position="back" flash="off" binderror="error" style="width: 100%;height: 350px;"></camera>
<button type="primary" bindtap="takePhoto">拍照</button>
<view>预览</view>
<image mode="widthFix" src="{{src}}"></image>




.js 

Page({
  takePhoto(){
    const ctx = wx.createCameraContext()
    ctx.takePhoto({
      quality:'high',
      success:(res)=>{
        this.setData({
          src:res.tempImagePath
        })
      }
    })
  },
  error(e){
    console.log(e.detail)
  }
})

效果图 

  

 

 

 

4.6 其他组件 

除了前面介绍的组件以外,map组件和canvas组件比较常用

4.6.1 map 

map组件用于在页面显示地图或路径

示例代码

.xml

<map id="map"
longitude="108.9200"
latitude="34.1550"
scale="14"
controls="{{controls}}"
bindcontroltap="controltap"
markers="{{markers}}"
bindmarkertap="markertap"
polyline="{{polyline}}"
bindregionchange="regionchange"
show-location
style="width: 100%;height: 300px;"></map>

.js 

Page({
  data:{
    markers:[{
      iconPath:"../image/电源.png",
      id:0,
      longitude:"108.9290",
      latitude:"34.1480",
      width:50,
      height:50
    }],
    polyline:[{
      points:[
        {
        longitude:"108.9200",
        latitude:"34.1400",
      },{
        longitude:"108.9200",
        latitude:"34.1500"
      },{
        longitude:"108.9200",
        latitude:"34.1700"
      } ],
      color:"#00ff00",
      width:2,
      dottedLine:true
    }],
    controls:[{
      id:1,
      iconPath:'../image/耳机.png',
      position:{
        left:0,
        top:300,
        width:30,
        height:30
      },
      clickable:true
    }]
  },
  regionchange(e){
    console.log(e.type)
  },
  markertap(e){
    console.log(e.markerId)
  },
  controltap(e){
    console.log(e.controlId)
  }
})
效果图 

canvas组件 

示例代码

.js

Page({
  onReady: function () {
    const ctx = wx.createCanvasContext('myCanvas', this)
    ctx.setFillStyle('green')
    ctx.fillRect(10, 10, 200, 100)
    ctx.draw()
  }
})
效果图

  • 32
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值