赞
踩
自定义类似于下拉列表框的效果,当时考虑了几种组件,select, menu, popup,dialog, 自定义组件等。
优缺点:
1. 右边的箭头不能自定义;
2.下拉框的option也不能随便修改样式;除了能修改字体样式外,宽度高度等都不能自定义;
3.下拉框的起始位置跟随select的左边沿。当select位于左边有足够空间时,option显示也比较大,但当select位于右边比较靠边的位置时,option的宽度就自动变小,左右两边的下拉框宽度不一样。
优缺点:
1. popup的位置可以通过placement设置,,使弹出框显示在控件的上下左右等八个位置,正上方,正下方也可以设,但这是个气泡,会有箭头显示,虽然箭头可以设置它的位置,但不能隐藏。
2. popup里面的内容可以自定义,可任意设置内容和样式。
优缺点:
1. 点击目标元素弹出menu, 目标元素可以是按钮,也可以自定义,这个比较好,但是menu做出的下拉框类似于select的效果,因为里面的每一项也是用option来显示,也不能随便更改样式;
2.menu的定位,使用target属性可以使menu定位在目标元素附近,弹出菜单位置优先为目标元素右下角,当右边可视空间不足时会适当左移,当下方空间不足时会适当上移,不能自己调整位置。不一定会显示在正下方或正上方。
优缺点:
1. dialog里的内容可完全自定义;
2. dialog的定位,dialog定位比较灵活,但不能准确定位在目标元素的正下方或正上方。
同dialog,定位不准确;
1. 使用<div>+<select>制作的下拉框列表见:
效果如下:
2. 使用popup制作的下拉框
效果如下:
index.hml
- <div class="onOffLine_status" style="flex: 2;" id="selectIcon">
- <image src="/common/img/ic_right_expend_grey.webp" style="width: 50px; height: 50px;" onclick="changeCustomerValue"></image>
- <popup id="dialog1" target="selectIcon" placement="top" keepalive='true' clickable="false" onvisibilitychange="visibilitychange" style="width: 200px; height: {{massageStrengthArr1.length*100+'px'}}; background-color: #f5f5f5;">
- <div style="display: flex; flex-direction: column; justify-content: center;">
- <div for="{{massageStrengthArr1}}" tid="name" style="justify-content: center;">
- <text if="{{$idx==0}}" style="width: 180px; height: 100px;border-radius: 15px; background-color: {{$item.isSelect?'#4291dd':'#00000000'}};text-align: center;" onclick="menuClicked({{$idx}})">{{$item.name}}</text>
- <text else style="width: 100px; height: 100px;border-top: 1px solid #333333; border-radius: {{$item.isSelect?'15px':'0px'}}; background-color: {{$item.isSelect?'#4291dd':'#00000000'}};text-align: center;" onclick="menuClicked({{$idx}})">{{$item.name}}</text>
- </div>
- </div>
- </popup>
- </div>
index.js目标元素的点击事件:
- //点击目标元素时触发该方法
- changeCustomerValue(e) {
- this.isShow = !this.isShow;
- if (this.isShow) {
- this.$element('dialog1').show();
- } else {
- this.$element('dialog1').hide();
- }
- console.info('changeCustomerValue'+JSON.stringify(e));
- },
-
- ……
-
- //当气泡弹出和消失时会触发该回调函数
- visibilitychange(e) {
- console.info('visibilitychange===='+JSON.stringify(e));
- }
3. 使用自定义组件:
index.hml
- <!--引入自定义组件-->
- <element name="selectView" src="../../common/selectView/selectView.hml"></element>
- ……
- <!--使用自定义组件-->
- <div class="onOffLine_status" style="flex: 2;" id="selectIcon">
- <image src="/common/img/ic_right_expend_grey.webp" style="width: 50px; height: 50px;" onclick="changeCustomerValue"></image>
- <selectview onmenu-clicked='childClicked' strength-arr="{{massageStrengthArr1}}" massage-strength="{{massageStrength}}" is-show="{{isShow}}"></selectview>
- </div>
index.js 点击事件
- //点击目标元素时
- changeCustomerValue(e) {
- this.isShow = !this.isShow;
- if (this.isShow) {
- this.$element('dialog1').show();
- } else {
- this.$element('dialog1').hide();
- }
- console.info('changeCustomerValue'+JSON.stringify(e));
- },
-
- //点击下拉框里的选项时
- childClicked(e) {
- console.info('childClicked'+JSON.stringify(e));
- },
注: isShow决定自定义组件是否显示
自定义组件 :
selectView.hml
- <div style="position: fixed; width: 200px; height: 300px; align-content: center; border: 1px solid gray;" show="{{isShow}}">
- <!-- <div style="width: 100px;" onclick="menuClicked">-->
- <!-- <image src="/common/img/ic_right_expend_grey.webp" style="width: 30px; height: 30px;align-content: center;"></image>-->
- <!-- </div>-->
- <div id="menu_opts" style="background-color: #ffffff; position: relative; margin-top: 40px;display: flex; flex-direction: column;justify-content: center;">
- <div for="{{massageStrengthArr}}" tid="name" style="width: 100%;">
- <text style="width: 100px; height: 50px; background-color: {{$item.isSelect?'#4291dd':'#00000000'}};" onclick="menuClicked({{$idx}})">{{$item.name}}</text>
- </div>
- </div>
- </div>
selectView.js
- import router from '@system.router';
- import app from '@system.app';
-
- export default {
- props: [
- 'strengthArr',
- 'massageStrength',
- 'isShow',
- 'page'
- ],
- data: {
- massageStrengthArr: "",
- massageStrength: 1,
- isShow:false,
- isSelect: false
- },
- //onInit方法在主页面加载的时候就开始执行了。
- onInit() {
- this.massageStrengthArr = this.strengthArr;
- this.massageStrength = this.massageStrength;
- this.isShow = this.isShow;
- console.log('selectView'+this.massageStrengthArr)
- for (var index = 0; index < this.massageStrengthArr.length; index++) {
- const element = this.massageStrengthArr[index];
- if (element.value == this.massageStrength) {
- element.isSelect = true;
- }
- }
- //添加返回按钮事件的监听
- this.$watch('page','onBack');
- },
- //点击下拉框的某个选项时
- menuClicked(index) {
- // this.$element("menu_opts").show();
- this.isShow = true;
- console.log('11111111111112222=='+JSON.stringify(this.massageStrengthArr)+",===="+index);
- this.$emit('menuClicked','22');
- },
- }
1. 事件绑定:
自定义组件中绑定子组件事件使用(on|@)child1语法,子组件中使用驼峰命名法命名的事件,在父组件中绑定时需要使用短横线分隔命名形式,例如:@children-event表示绑定子组件的childrenEvent事件,如 @children-event="bindParentVmMethod"。以代码中的例子为例:子组件调用时的事件为onmenu-clicked='childClicked',在子组件中的定义则为:menuClicked, 调用:οnclick="menuClicked({{$idx}})"
2. 参数的传递:
在父组件中调用子组件传递的参数可以自定义一个属性,如果上面例子中要传递一个手法数据,自定义一个strength-arr属性,在子组件中接收这个参数,则用strengthArr,也是父组件中用短线连接的变量,在子组件中用驼峰命令法命名;
3. 事件的触发:
子组件中通过this.$emit('menuClicked', { params: '传递参数' })触发事件并进行传值,父组件执行childClicked方法并接收子组件传递的参数。
上面代码的例子中,this.$emit('menuClicked',index);子传递的参数为当前点击选项的位置, 在父组件的onmenu-clicked事件中,接收这个传参。接收的参数(点击了第5个选项 index为4):
childClicked{"timestamp":1627106022674,"detail":4,"type":"menuClicked"}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。