微信小程序创建自定义select组件(内含组件与父页面的交互流程)

摘要:
当您没有时间这样做时,您可以发布自定义的选择组件以供参考,或做笔记以供将来使用。Select是用户定义的组件。请记住,它是用户定义的组件!select组件代码中的wxml如下所示{currentValue}˂!

微信小程序创建自定义select组件(内含组件与父页面的交互流程)第1张

 闲来无事将制作的select自定义组件制作贴出来,供大家借鉴,也可以为了以后的使用做个备注。

select是我自定义的组件,这个一定要记住,它是自定义组件!

以下书写select组件代码

其中的wxml如下

<view class="select_wrap"> 
  <!-- 左边文字 -->
  <view class="select_text">{{select_text}}</view>
  <!-- 右边下拉框组件 -->
  <view class="select_assembly">
    <!-- 一直显示的组件 -->
    <view class="main_assembly" bindtap="selectToggle">
      <view class="main_assembly_text">{{currentValue}}</view>
      <image src="../../icons/下拉.png" animation="{{animationData}}"></image>
    </view>
    <!-- 可选择项 -->
    <view class="item_assembly_list" hidden="{{isHiden}}">
        <view class="item_assembly"
        wx:for="{{tabs}}"
        wx:key="id"
        >
          <view class="item_assembly_text"
          data-index="{{index}}"
          bindtap="setText"
          >{{item.value}}</view>
        </view>
    </view>

  </view>
</view>

WXSS如下(布局推荐使用vscode中下载less自动生成wxss,下方看起来复杂,实际写起来没这么折腾去重复写类名)

.select_wrap {
  height: 80rpx;
  width: 100vw;
  display: flex;
  justify-content: center;
  align-items: center;
}
.select_wrap .select_text {
  border: 1rpx solid #F0F0F0;
  border-radius: 15rpx 0 0 15rpx;
  height: 80rpx;
  flex: 1;
  display: flex;
  justify-content: center;
  align-items: center;
}
.select_wrap .select_assembly {
  flex: 2;
  position: relative;
}
.select_wrap .select_assembly .main_assembly {
  border-radius: 0 15rpx 15rpx 0;
  border: 1rpx solid #F0F0F0;
  position: relative;
  height: 80rpx;
}
.select_wrap .select_assembly .main_assembly .main_assembly_text {
  padding-left: 5%;
  height: 80rpx;
  display: flex;
  justify-content: flex-start;
  align-items: center;
}
.select_wrap .select_assembly .main_assembly image {
  border: 1rpx solid #F5FFFA;
  position: absolute;
  top: 0;
  right: 5%;
  border-radius: 50%;
  width: 50rpx;
  height: 50rpx;
}
.select_wrap .select_assembly .item_assembly_list {
  position: absolute;
  left: 0;
  top: 80rpx;
  width: 100%;
}
.select_wrap .select_assembly .item_assembly_list .item_assembly {
  background-color: white;
  z-index: 99;
  border: 1rpx solid #F0F0F0;
  border-radius: 15rpx;
  height: 80rpx;
}
.select_wrap .select_assembly .item_assembly_list .item_assembly .item_assembly_text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  padding-left: 5%;
  height: 80rpx;
  display: flex;
  justify-content: flex-start;
  align-items: center;
}

其中js(我留除了一个可设置前方含义的select_text)

// components/select/select.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    select_text:{
      type:String,
      value:"选择项:"
    },
    tabs:{
      type:Array,
      value: [{
        id:0,
        value: "足球"
      },
      {
        id: 1,
        value: "篮球"
      }]
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    animationData: {},
    //是否图标向下(就是隐藏)
    isHiden: true,
    currentValue:"请选择",
    animationData1:{}
  },
  
  /**
   * 组件的方法列表
   */
  methods: {

    //点击动画
    selectToggle() {
      // console.log(this.data.isHiden);
      let tempIsHidden = !this.data.isHiden;
      //创建动画
      var animation = wx.createAnimation({
        timingFunction: "ease"
      });
      // console.log(animation);
      //设置全局,因为下方要使用当前的对象
      this.animation = animation;
      if (tempIsHidden) {
        animation.rotate(0).step({ duration: 500 });
        this.setData({
          animationData: animation.export(),
          isHiden: tempIsHidden
        });
      }
      else {
        animation.rotate(-180).step({ duration: 500 });
        this.setData({
          animationData: animation.export(),
          isHiden: tempIsHidden
        })
      }
    },
    //点击文本设置文本
    setText(e){
      const {index} = e.currentTarget.dataset;
      const {tabs}=this.properties;
      this.animation.rotate(0).step({ duration: 500 });
      this.setData({
        currentValue: tabs[index].value,
        animationData: this.animation.export(),
        isHiden:true
      })
      //传递选择项(这里自定义事件)
      this.triggerEvent("transformValue", tabs[index].value);
    },

  }
})

 【.........自定义..........】

自定义事件定义完之后,在父页面使用该组件的时候绑定它,如

<select tabs="{{tabs}}" bind***="getComponentsValue"></select>

 ***需要在这里被替换上方自定义的transformValue

父页面的方法:

getComponentsValue(e){}//组件传递的value值通过e中获取,从而改变父页面的变量tabs,因为父页面的tabs变化,传递到子页面的值也发生变化,实现了联动

在index使用界面或者其他组件上,这样使用:

<select tabs="{{tabs}}"></select>

data中写(上方显示中我并没有写这个属性,因此下拉列表为默认的足球和篮球,如果这样写的话,就是下方的两个,如下所示)

tabs: [{
      id: 0,
      value: "红灯"
    },
    {
      id: 1,
      value: "砂蜜豆"
    }],

微信小程序创建自定义select组件(内含组件与父页面的交互流程)第2张

免责声明:文章转载自《微信小程序创建自定义select组件(内含组件与父页面的交互流程)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇为什么要用docker如何利用MATLAB并行计算缩短程序运行时间下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信小程序知识点总结--组件

一、部分常用组件 1、scroll-view可滚动视图区域:   <scroll-view>标签必须设置scroll-x/scroll-y属性,否则不能实现滚动效果 css设置:<scroll-view>标签可以设置white-space:nowrap,子元素设置display:inline-block(如子元素中有文字需要换行,则...

andoird软件开发之一个记录账号密码的APP--bmob后台

1.app功能:通过注册登录账户,拥有一个账户本,能够将平时自己容易的忘记的账户记录下来,并可以保持到云端,不需要担心数据丢失,只要登录账户,便可获取到自己的账户本。 2.实现的效果图,如下: 以下界面分别为注册界面、登录界面、提交账户内容界面、账户列表界面、长按删除账户信息、具体账户内容信息 3.实现的工程目录如下: 4.实现的具体过程: a.布局...

Vue和微信小程序区别

一、生命周期 先贴两张图: vue生命周期 小程序生命周期 相比之下,小程序的钩子函数要简单得多。 vue的钩子函数在跳转新页面时,钩子函数都会触发,但是小程序的钩子函数,页面不同的跳转方式,触发的钩子并不一样。 onLoad: 页面加载一个页面只会调用一次,可以在 onLoad 中获取打开当前页面所调用的 query 参数。 onShow: 页...

[Python自学] Flask框架 (3) (路由、CBV、自定义正则动态路由、请求处理流程、蓝图)

一、路由系统 1.浅析@app.route的源码 我们使用@app.route("/index")可以给视图函数加上路由映射。我们分析一下@app.route装饰器的实现源码: def route(self, rule, **options): def decorator(f): endpoint = options.pop("en...

微信小程序获取unionid与openid

获取unionid需要先在微信开放平台绑定小程序,否则无法获取 UnionID机制说明 unionid来区分用户的唯一性,在相同微信开放平台帐号下的移动应用、网站应用、小程序、公众号,用户的unionid是唯一的。也就是说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。 OpenID机制说明 OpenId是用来区分应用的唯一性,在相同...

从网络I/O模型到Netty,先深入了解下I/O多路复用

微信搜索【阿丸笔记】,关注Java/MySQL/中间件各系列原创实战笔记,干货满满。 本文是Netty系列第3篇 上一篇文章我们了解了Unix标准的5种网络I/O模型,知道了它们的核心区别与各自的优缺点。尤其是I/O多路复用模型,在高并发场景下,有着非常好的优势。而Netty也采用了I/O多路复用模型。 那Netty是如何实现I/O多路复用的呢? Nett...