微信小程序自定义select组件

Select组件

wxss文件

.select-box {
  position: relative;
  /* width: 100%; */
  /* font-size: 30rpx; */
}

.select-current {
  width: 730rpx;
  height: 45rpx;
  background-color: white;
  margin-left: 10rpx;
  position: relative;
  padding: 0rpx 10rpx;
  /* line-height: 40rpx; */
  /* border: 1rpx solid #ddd; */
  border-radius: 10rpx;
  box-sizing: border-box;
}

.select-current::after {
  position: absolute;
  display: block;
  right: 16rpx;
  top: 18rpx;
  content: '';
  width: 0;
  height: 0;
  border: 10rpx solid transparent;
  border-top: 10rpx solid #999;
}

.current-name {
  display: block;
  width: 85%;
  height: 100%;
  word-wrap: normal;
  overflow: hidden;
}

.option-list {
  width: 730rpx;
  margin-left: 10rpx;
  position: absolute;
  left: 0;
  top: 45rpx;
  padding: 5rpx 10rpx;
  box-sizing: border-box;
  z-index: 2;
  box-shadow: 0rpx 0rpx 1rpx 1rpx rgba(0, 0, 0, 0.2) inset;
  background-color: #fff;
}

.option {
  display: block;
  width: 100%;
  line-height: 40rpx;
  border-bottom: 1rpx solid #eee;
}

.option:last-child {
  border-bottom: none;
  padding-bottom: 0;
}

wxml文件

<view class="select-box">
  <view class="select-current" catchtap="openClose">
    <text class="current-name">{{current.name}}</text>
  </view>
  <view class="option-list" wx:if="{{isShow}}" catchtap="optionTap">
    <text class="option"
    data-id="{{defaultOption.id}}"
    data-name="{{defaultOption.name}}">{{defaultOption.name}}
    </text>
    <text class="option"
    wx:for="{{result}}"
    wx:key="id"
    data-id="{{item.id}}"
    data-name="{{item.name}}">{{item.name}}
    </text>
  </view>
</view>

json文件

{
  "component": true,
  "usingComponents": {}
}

js文件 :数据可以在这定义也可以去用的页面的js文件里定义

Component({
  properties: {
    options: {
      type: Array,
      value: []
    },
    defaultOption: {
      type: Object,
      value: {
        // id: '000',
        // name: '请选择业务类型'
      }
    },
    // properties中的 key 和 text 是为了做属性名转换
    key: {
      type: String,
      value: 'id'
    },
    text: {
      type: String,
      value: 'name'
    }
    },
  data: {
    result: [],
    isShow: false,
    current: {}
  },
  methods: {
    optionTap(e) {
      let dataset = e.target.dataset
      this.setData({
        current: dataset,
        isShow: false
      });
    
      // 调用父组件方法,并传参
      this.triggerEvent("change", { ...dataset })
    },
    openClose() {
      this.setData({
      isShow: !this.data.isShow
      })
    },
    
    // 此方法供父组件调用
    close() {
      this.setData({
      isShow: false
      })
    }
  },
  lifetimes: {
    attached() {
      // 属性名称转换, 如果不是 { id: '', name:'' } 格式,则转为 { id: '', name:'' } 格式
      let result = []
      if (this.data.key !== 'id' || this.data.text !== 'name') {    
      for (let item of this.data.options) {
        let { [this.data.key]: id, [this.data.text]: name } = item
        result.push({ id, name })
      }
      }
      this.setData({
        current: Object.assign({}, this.data.defaultOption),
        result: result
      })
    }
    }
 })

使用页面

// pages/home/home.js
Page({
  data: {
    defaultOptionBusiness:{
      id:'0',
      name:'请选择'
    },
    optionsBusiness:[
      {
        city_id: '1',
        city_name: '111'
      }, 
      {
        city_id: '2',
        city_name: '2222'
      }
    ],
  },

})

wxml

    <!-- 自定义选择select组件 -->
    <select 
      class="fontColor" 
      defaultOption="{{defaultOptionBusiness}}" 
      options="{{optionsBusiness}}" 
      key="city_id" 
      text="city_name" 
      bind:change="change"
    ></select>

json文件

{
  "usingComponents": {
    "select": "../../components/Select/Select"
  },
}

参考文章找不到了

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序中的scroll-view组件是用来实现滚动视图的,但默认情况下并不支持循环滚动。如果需要实现循环滚动,我们可以通过一些自定义的方式来实现。 实现循环滚动的基本思路是在scroll-view组件外面放置一个容器,并在容器中复制一份完整的内容,并且在容器的开始和结束处分别添加一份内容的副本。通过设置容器的宽度为原始内容的宽度加上一份内容的副本的宽度,来实现循环滚动的效果。 具体实现的步骤如下: 1. 在scroll-view组件外部添加一个容器,例如使用view组件包裹scroll-view组件。 2. 获取原始内容的宽度,可以使用小程序的API来获取元素的宽度,如wx.createSelectorQuery().select('#id').boundingClientRect() 3. 复制一份完整的内容,并在容器的开始和结束处分别添加一份内容的副本。 4. 设置容器的宽度为原始内容的宽度加上一份内容的副本的宽度。 5. 在scroll-view组件的bindscroll事件中,通过监听滚动的偏移量,当滚动偏移量超过容器的宽度时,将scroll-view的滚动到对应的位置,并且将滚动偏移量重置为0,实现循环滚动的效果。 需要注意的是,滚动的速度要快于内容的切换,否则会出现内容错乱的情况。同时,由于scroll-view组件在滚动到边缘时会有一定的滚动回弹效果,所以在滚动到容器的开始和结束处时会有一小段回弹效果,可以根据具体的需求进行调整和优化。 总结起来,通过在scroll-view组件外部添加一个容器,在容器中复制一份完整的内容并设置容器的宽度,以及通过监听滚动事件来实现滚动偏移量的调整,就可以实现微信小程序中scroll-view的循环滚动效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值