1.父組件
<mia-form-item label="美食"> <mia-select v-model="food" :data="options" placeholder="請選擇美食"> <mia-option label="區域一" value="shanghai"></mia-option> <mia-option label="區域二" value="beijing"></mia-option> </mia-select> </mia-form-item>
2.select組件(slot盛放option的代碼)
<template> <div class="mia-select"> <div class="mia-input" @click="unfoldDrop"> <input type="text" class="mia-input-inner" :placeholder="placeholder" v-model="anser.label" readonly> <i class="iconfont mia-drop-btn" :class="{unfold:unfold}">{{canOpenDrop ? '' : ''}}</i> <div class="mia-select-dropList" v-show="unfold"> <mia-scroll height="274px"> <ul> <slot></slot> </ul> </mia-scroll> </div> </div> <!-- msg:{{msg}} --> </div> </template>
3.option組件
<template> <li @click="chooseSelect">{{label}}</li> </template>
4.問題來了:option組件通過$emit只能跟父組件傳值,但是父組件里並沒有定義事件進行接受,那么我們如何將option的值傳給select呢?
解決:
我們知道option父組件為select,可通過遍歷其子集加事件綁定接受數據:
1)在select里添加(不知如何找子集的可以打印this.$children進行查看):
getSelect(msg){ console.log('接收',msg); var obj={...msg}; this.anser=obj; this.$emit("input",obj.value); } }, mounted(){ this.$children[0].$children.forEach(child => child.$on('chooseValue',this.getSelect)) },
2.在option里頭添加
chooseSelect(){ var label=this.label,value=this.value; console.log('發射'); this.$emit("chooseValue",{label,value}); }