• uniapp下拉框组件


    之前写过一个小程序的,引入单个下拉框是没有问题的,但是一个页面引入多个下拉框组件的话就会有bug,比如可以同时展开多个下拉框的问题,在此修复了。如果大家有什么好的办法可以告诉我一下嘛~

    小程序选择框_WeiflR10的博客-CSDN博客_小程序选择框

    子组件

    1. <template>
    2. <view style="position: relative;">
    3. <!-- 选中之后的数据展示 -->
    4. <view class="inputPlaceholder" v-if='inputVal' @click="changejiantou(num,allnum)">
    5. <input :placeholder="placeholderText" disabled v-model="inputVal"></input>
    6. <view class="jiantou1" v-if="evaluateCondition(`${'isjiantou' + this.num}`)"><i class="iconfont icon-jiantou1"></i></view>
    7. <view class="jiantou1" v-else><i class="iconfont icon-jiantou"></i></view>
    8. </view>
    9. <!-- 未选择时的Placeholder展示 -->
    10. <view class="inputPlaceholder" v-else @click="changejiantou(num,allnum)">
    11. <input :placeholder="placeholderText" disabled v-model="inputVal"></input>
    12. <view class="jiantou1" v-if="evaluateCondition(`${'isjiantou' + this.num}`)"><i class="iconfont icon-jiantou1"></i></view>
    13. <view class="jiantou1" v-else><i class="iconfont icon-jiantou"></i></view>
    14. </view>
    15. <!-- 下拉展开后的可选择内容 -->
    16. <view class="content" v-if="!evaluateCondition(`${'isjiantou' + this.num}`)">
    17. <view v-if="selectcontent.length==0" class="nodata">暂无数据</view>
    18. <view v-else :class="item.id==valueid ? 'active':'noactive'" v-for="(item,index) in selectcontent" @click="changecontent(item)">
    19. {{item.name}}
    20. </view>
    21. </view>
    22. </view>
    23. </template>
    24. <script>
    25. import {mapState} from 'vuex'
    26. export default{
    27. //selectcontent:下拉框的数据内容 num:本页面的第几个下拉框 allnum:本页面总共有多少个下拉框 placeholderText:placeholder显示的文字
    28. props:['selectcontent','num','allnum','placeholderText'],
    29. data() {
    30. return{
    31. inputVal:undefined, //选中的值,name
    32. valueid:'' //选中的值,id
    33. }
    34. },
    35. computed:{
    36. // 箭头切换 false是展开,true是关闭
    37. ...mapState({
    38. isjiantou0:state=>state.isjiantou0,
    39. isjiantou1:state=>state.isjiantou1,
    40. isjiantou2:state=>state.isjiantou2,
    41. isjiantou3:state=>state.isjiantou3,
    42. isjiantou4:state=>state.isjiantou4,
    43. isjiantou5:state=>state.isjiantou5,
    44. isjiantou6:state=>state.isjiantou6
    45. })
    46. },
    47. mounted(){
    48. for(var i=0;i<this.allnum;i++){
    49. this.$store.dispatch(`${'getjiantou' + i}`,true)
    50. }
    51. },
    52. methods: {
    53. // 箭头切换 false是展开,true是关闭
    54. evaluateCondition(condition) { //condition:就是属性名isjiantou0,isjiantou1...
    55. return this[condition] //返回truefalse
    56. },
    57. // 下拉框收起和下拉
    58. changejiantou(num,allnum){
    59. // 箭头切换 false是展开,true是关闭 将值存进vuex,改变时通知到所有相关组件
    60. if(this.$store.state[`${'isjiantou' + num}`]){
    61. this.$store.dispatch(`${'getjiantou' + num}`,false)
    62. }else{
    63. this.$store.dispatch(`${'getjiantou' + num}`,true)
    64. }
    65. for(var i=0;i<allnum;i++){
    66. if(i!=num){
    67. this.$store.dispatch(`${'getjiantou' + i}`,true)
    68. }
    69. }
    70. },
    71. // 选择数据后回显
    72. changecontent(e){
    73. this.$store.dispatch(`${'getjiantou' + this.num}`,true)
    74. //重复选同一个选择框,是不会触发事件的
    75. if(e.name!=this.inputVal){
    76. this.inputVal=e.name,
    77. this.valueid=e.id,
    78. this.$emit("change",e.id) //change事件,可以在父组件中调用
    79. }
    80. },
    81. }
    82. }
    83. </script>
    84. <style>
    85. .inputPlaceholder{
    86. min-width: 360rpx;
    87. width: calc(100% - 60rpx);
    88. height: 45rpx;
    89. border: 1px solid #DEDEDE;
    90. padding: 8rpx 40rpx 8rpx 20rpx;
    91. margin-left: 16rpx;
    92. border-radius: 10rpx;
    93. position: relative;
    94. overflow:hidden;
    95. text-overflow: ellipsis;
    96. white-space:nowrap;
    97. }
    98. .jiantou1{
    99. position: absolute;
    100. right: 10rpx;
    101. top: 8rpx;
    102. color: #CBCBCB;
    103. }
    104. .content{
    105. min-width: 384rpx;
    106. width: calc(100% - 40rpx);
    107. max-height: 240rpx;
    108. position: absolute;
    109. top: 62rpx;
    110. left: 16rpx;
    111. background: #FFFFFF;
    112. box-shadow: 0px 0px 10px 1px rgba(209, 209, 209, 0.35);
    113. border-radius: 20rpx;
    114. padding: 20rpx;
    115. overflow-x: hidden;
    116. overflow-y: scroll;
    117. z-index: 10000;
    118. }
    119. .noactive{
    120. padding: 10rpx 0;
    121. }
    122. .active{
    123. padding: 10rpx 0;
    124. color: #56D88A;
    125. }
    126. .nodata{
    127. color: #999;
    128. text-align: center;
    129. }
    130. </style>

    父组件

    1. <template>
    2. <view>
    3. <view class="input-row">
    4. <view class="input-title">类别</view>
    5. <ys-select :selectcontent='driverTypeOptions' placeholderText='请选择类别' num='0' :allnum='allnum'></ys-select>
    6. </view>
    7. <view class="input-row">
    8. <view class="input-title">人员</view>
    9. <ys-select :selectcontent='driverOptions' placeholderText='请选择人员' num='1' :allnum='allnum'></ys-select>
    10. </view>
    11. <view class="input-row">
    12. <view class="input-title">属性</view>
    13. <ys-select :selectcontent='carTypeOptions' placeholderText='请选择属性' num='2' :allnum='allnum'></ys-select>
    14. </view>
    15. <view class="input-row">
    16. <view class="input-title">车辆</view>
    17. <ys-select :selectcontent='carOptions' placeholderText='请选择车辆' num='3' :allnum='allnum'></ys-select>
    18. </view>
    19. <view class="input-row">
    20. <view style="padding-right: 20rpx;">运输人员</view>
    21. <ys-select :selectcontent='escortOptions' placeholderText='请选择运输人员' num='4' :allnum='allnum'></ys-select>
    22. </view>
    23. <view class="input-row">
    24. <view class="input-title">地点</view>
    25. <ys-select :selectcontent='recycleOptions' placeholderText='请选择地点' num='5' :allnum='allnum'></ys-select>
    26. </view>
    27. <view class="input-row">
    28. <view class="input-title">商户</view>
    29. <ys-select :selectcontent='merchantsOptions' placeholderText='请选择商户' num='6' :allnum='allnum'></ys-select>
    30. </view>
    31. </view>
    32. </template>
    33. <script>
    34. import ysselect from './ys-select.vue'
    35. export default {
    36. components:{
    37. 'ys-select':ysselect
    38. },
    39. data() {
    40. return {
    41. driverTypeOptions:[
    42. {id:1,name:'1'},
    43. {id:2,name:'2'}
    44. ],
    45. driverOptions:[],
    46. carTypeOptions:[
    47. {id:1,name:'1'},
    48. {id:2,name:'2'}
    49. ],
    50. carOptions:[],
    51. escortOptions:[],
    52. recycleOptions:[],
    53. merchantsOptions:[],
    54. DriverTypeVal:'',
    55. allnum:6, //选择框的个数
    56. };
    57. }
    58. };
    59. </script>
    60. <style>
    61. .input-row{
    62. position: relative;
    63. display: flex;
    64. align-items: center;
    65. padding: 0 0 30rpx 24rpx;
    66. }
    67. .input-title{
    68. padding-right: 20rpx;
    69. }
    70. .input-title::before{
    71. content: '*';
    72. font-size: 40rpx;
    73. color: red;
    74. position: absolute;
    75. left: 0;
    76. top: 14rpx;
    77. }
    78. </style>

    store.js

    1. import Vue from 'vue'
    2. import Vuex from 'vuex'
    3. Vue.use(Vuex)
    4. const store = new Vuex.Store({
    5. state: {
    6. isjiantou0:true,
    7. isjiantou1:true,
    8. isjiantou2:true,
    9. isjiantou3:true,
    10. isjiantou4:true,
    11. isjiantou5:true,
    12. isjiantou6:true,
    13. },
    14. mutations: {
    15. getjiantou0(state,n){
    16. state.isjiantou0=n
    17. },
    18. getjiantou1(state,n){
    19. state.isjiantou1=n
    20. },
    21. getjiantou2(state,n){
    22. state.isjiantou2=n
    23. },
    24. getjiantou3(state,n){
    25. state.isjiantou3=n
    26. },
    27. getjiantou4(state,n){
    28. state.isjiantou4=n
    29. },
    30. getjiantou5(state,n){
    31. state.isjiantou5=n
    32. },
    33. getjiantou6(state,n){
    34. state.isjiantou6=n
    35. }
    36. },
    37. actions: {
    38. getjiantou0(context,args){
    39. context.commit('getjiantou0',args);
    40. },
    41. getjiantou1(context,args){
    42. context.commit('getjiantou1',args);
    43. },
    44. getjiantou2(context,args){
    45. context.commit('getjiantou2',args);
    46. },
    47. getjiantou3(context,args){
    48. context.commit('getjiantou3',args);
    49. },
    50. getjiantou4(context,args){
    51. context.commit('getjiantou4',args);
    52. },
    53. getjiantou5(context,args){
    54. context.commit('getjiantou5',args);
    55. },
    56. getjiantou6(context,args){
    57. context.commit('getjiantou6',args);
    58. },
    59. }
    60. })
    61. export default store

    注:模板字符串

    如果想在js中输出this.isjiantou0  this.isjiantou1  this.isjiantou2 ...,可以使用模板字符串

    1. //`${'jiantou' + i}`
    2. //this[`${'jiantou' + i}`] 这个就相当于this.isjiantou0 所以输出的时候直接是值
    3. for(var i=0;i<6;i++){
    4. console.log(`${'jiantou' + i}`) //isjiantou0
    5. console.log(this[`${'jiantou' + i}`]) //true / false
    6. }

  • 相关阅读:
    Linux服务器防御最全教程
    编程架构演化史:远古时代,从打孔卡(Punched Card)开始
    2023届双非硕士四个月秋招历程总结
    倒计时4天!解锁《2023 .NET Conf China》 云原生分会场精彩议程
    华为数通方向HCIP-DataCom H12-821题库(单选题:341-360)
    实力认证|万应工场荣膺2022中国低代码平台行业应用卓越奖!
    2020年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
    C语言实现双向循环链表
    MySQL操作库
    Phaser帧动画没有效果
  • 原文地址:https://blog.csdn.net/WeiflR10/article/details/126948566