最近接手别人项目,项目中引用了vux这个插件,这个插件怎么说,还就正如他本身所描述的,差很少的一个插件。javascript
但愿达到的目的是,弹出的内容根据父组件的条目得出,且可进行复选,最后将选中的结果传回给父组件。html
如图所示的目标效果:vue
因为,vux并无这个现成的组件,因此,参照他的,作了一个自定义子组件(popup-checkbox)java
父组件,father.vue数组
template中:less
<popup-checkbox title="其余" :data="pickerData.Other" v-model="picker.Other"></popup-checkbox>
script中:ide
第一步,要引入组件,若是能够将子组件进行局部引入或者全局引入,我这里图快捷,就作的局部引用flex
第二部,局部引用子组件进行注册ui
import PopupCheckbox from '../eplugs/popupcbx' export default { components: { PopupCheckbox,//自定义的一个弹出选择框 } data(){ pickerData{ other:[] }
pickerData.other为一个数组Array,是父组件中,经过获取接口,最后拿到的一个值,将这个值,传给子组件。this
picker.Other 为一个字符串String,为绑定子组件传过来的值,并将子组件传过来的值,及时赋给 picker.Other。
====
子组件,popupcbx.vue
script 中,经过,props,接收父组件传过来的数据:
props:{ title:String, data:Array, }
点击肯定按钮,将string类型的数据,传给父组件
点击肯定按钮@click = “yes”,将选择好的值传给父组件。
this.$emit("input",strOther);
methods:{ yes:function(){ // 将this.otherNeeds转为字符串 let strOther = this.otherNeeds.toString(); // console.log(strOther); // console.log(this.otherNeeds); this.$emit("input",strOther); }
附:子组件代码 popupcbx.vue代码:
1 <template> 2 <div class="popbox" > 3 <!-- 指引区 --> 4 <div @click="showpopup" class="popleader"> 5 <span>{{title}}</span> 6 <div class="popvalbox"><span v-for="item in otherNeeds" :key="item.index">{{item}},</span></div> 7 <span class="arrowright"></span> 8 </div> 9 <div v-show="show" class="popcnt"> 10 <!-- 按钮 --> 11 <div class="popbottons"> 12 <button @click="cancle" class="cancle">取消</button> 13 <button @click="yes" class="yes">肯定</button> 14 </div> 15 <!-- 列表 --> 16 <ul class="poplistbox"> 17 <li v-for="(item,index) in data" :key="index"> 18 <div v-for="(content,idx) in item" :key="idx" > 19 <div v-if="content.value!=''" class="listcnt" > 20 <label :for="idx">{{content.name}}</label> 21 <input type="checkbox" v-model="otherNeeds" :id="idx" :value="content.value"> 22 <i class="weui-icon-success-no-circle"></i> 23 </div> 24 </div> 25 </li> 26 </ul> 27 <!-- mask --> 28 <div class="mask" @click="cancle" @touchmove.prevent @scroll.prevent></div> 29 </div> 30 </div> 31 </template> 32 33 <script> 34 import { CheckIcon } from 'vux' 35 export default { 36 name:"popup-checkbox", 37 props:{ 38 title:String, 39 data:Array, 40 // checkedata:String, 41 }, 42 model:{ 43 // prop:'checkedata', 44 }, 45 data() { 46 return { 47 otherNeeds:[], 48 show:false 49 } 50 }, 51 methods:{ 52 yes:function(){ 53 // 将this.otherNeeds转为字符串 54 let strOther = this.otherNeeds.toString(); 55 // console.log(strOther); 56 // console.log(this.otherNeeds); 57 this.$emit("input",strOther); 58 this.show = false; 59 }, 60 cancle:function(){ 61 this.show = false; 62 }, 63 showpopup:function(){ 64 this.show = !this.show; 65 } 66 }, 67 components:{ 68 CheckIcon 69 } 70 } 71 </script> 72 73 <style lang="less" scoped> 74 .popbox{ 75 position: relative; 76 .popleader{ 77 display: flex; 78 width: 100%; 79 height: 0.9rem; 80 align-items: center; 81 .popvalbox{ 82 flex-grow: 1; 83 text-align: right; 84 font-size: 15px; 85 color: #999; 86 } 87 .arrowright{ 88 display: inline-block; 89 width: 8px; 90 height: 8px; 91 border-top: 2px solid #fff; 92 border-right: 2px solid #fff; 93 transform: rotate(45deg); 94 border-radius: 2px; 95 margin-right: 1px; 96 } 97 } 98 .popcnt{ 99 background: #fff; 100 width: 100%; 101 position: fixed; 102 bottom: 0; 103 left: 0; 104 z-index: 1001; 105 .popbottons{ 106 background: rgba(254, 254, 254, 0.9); 107 height: 0.8rem; 108 display: flex; 109 justify-content:space-between; 110 align-items: center; 111 button{ 112 border: none; 113 font-size: 0.4rem; 114 background: transparent; 115 margin: 0 0.2rem; 116 } 117 .cancle{ 118 color: #666; 119 } 120 .yes{ 121 color: #09BB07; 122 } 123 } 124 .poplistbox{ 125 z-index: 1002; 126 height: 4.8rem; 127 background: #fff; 128 display: flex; 129 align-items: center; 130 overflow-y: scroll; 131 li{ 132 background: #fff; 133 width: 100%; 134 .listcnt{ 135 height: 0.8rem; 136 line-height: 0.8rem; 137 color: #666; 138 border-top: 1px solid #ddd; 139 position: relative; 140 } 141 &>div:last-child{ 142 border-bottom: 1px solid #ddd; 143 } 144 } 145 } 146 .mask{ 147 display: block; 148 position: fixed; 149 top: 0; 150 left: 0; 151 width: 100%; 152 height: 100%; 153 background: rgba(0, 0, 0, 0.5); 154 transition: opacity 400ms; 155 z-index: -1; 156 } 157 } 158 } 159 160 i{ 161 display: none; 162 position: absolute; 163 right: 0; 164 top: 7px; 165 } 166 label{ 167 display: inline-block; 168 width: 100%; 169 text-align: center; 170 } 171 input{ 172 display: none; 173 } 174 175 input[type=checkbox]:checked + i{ 176 display:inline-block; 177 } 178 </style>