|  | @@ -0,0 +1,198 @@
 | 
	
		
			
				|  |  | +<template>
 | 
	
		
			
				|  |  | +  <div class="select-cell">
 | 
	
		
			
				|  |  | +    <van-cell
 | 
	
		
			
				|  |  | +      v-if="disabled"
 | 
	
		
			
				|  |  | +      :required="required"
 | 
	
		
			
				|  |  | +      :border="border"
 | 
	
		
			
				|  |  | +      :title="title"
 | 
	
		
			
				|  |  | +      :value="isRow?label:null"
 | 
	
		
			
				|  |  | +      :label="!isRow?label:null" />
 | 
	
		
			
				|  |  | +    <van-cell
 | 
	
		
			
				|  |  | +      v-else
 | 
	
		
			
				|  |  | +      :required="required"
 | 
	
		
			
				|  |  | +      :title="title"
 | 
	
		
			
				|  |  | +      :border="border"
 | 
	
		
			
				|  |  | +      :value="isRow?label:null"
 | 
	
		
			
				|  |  | +      :label="!isRow?label:null"
 | 
	
		
			
				|  |  | +      is-link
 | 
	
		
			
				|  |  | +      @click="clickItem"/>
 | 
	
		
			
				|  |  | +    <!-- :label="!isRow?label:null" -->
 | 
	
		
			
				|  |  | +    <van-popup v-model="showPicker" round lazy-render position="bottom" :close-on-popstate="true" get-container="#app">
 | 
	
		
			
				|  |  | +      <van-search  v-model="searchKey" placeholder="请输入搜索关键词" @input="onSearch" @clear="resetColumns" />
 | 
	
		
			
				|  |  | +      <van-picker
 | 
	
		
			
				|  |  | +        v-bind="$attrs"
 | 
	
		
			
				|  |  | +        show-toolbar
 | 
	
		
			
				|  |  | +        :value-key="prop.label"
 | 
	
		
			
				|  |  | +        v-model="selected"
 | 
	
		
			
				|  |  | +        :columns="columnsData"
 | 
	
		
			
				|  |  | +        @confirm="pickerConfirm"
 | 
	
		
			
				|  |  | +        confirm-button-text="确定"
 | 
	
		
			
				|  |  | +        @cancel="cancelPicker"
 | 
	
		
			
				|  |  | +      />
 | 
	
		
			
				|  |  | +    </van-popup>
 | 
	
		
			
				|  |  | +  </div>
 | 
	
		
			
				|  |  | +</template>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<script>
 | 
	
		
			
				|  |  | +import {getDict} from "@/api/toConsult";
 | 
	
		
			
				|  |  | +export default {
 | 
	
		
			
				|  |  | +  props:{
 | 
	
		
			
				|  |  | +    //禁用
 | 
	
		
			
				|  |  | +    disabled:{
 | 
	
		
			
				|  |  | +      type: [Boolean,String],
 | 
	
		
			
				|  |  | +      default: false,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //双向绑定的数据
 | 
	
		
			
				|  |  | +    value:{
 | 
	
		
			
				|  |  | +      type: [String,Number],
 | 
	
		
			
				|  |  | +      default: null,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    required:{
 | 
	
		
			
				|  |  | +      type: [Boolean,String],
 | 
	
		
			
				|  |  | +      default: false,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    border:{
 | 
	
		
			
				|  |  | +      type: [Boolean,String],
 | 
	
		
			
				|  |  | +      default: false,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //标题
 | 
	
		
			
				|  |  | +    title:{
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: null,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //父组件给的列表数据
 | 
	
		
			
				|  |  | +    dataList:{
 | 
	
		
			
				|  |  | +      type: Array,
 | 
	
		
			
				|  |  | +      default: ()=>[],
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //是否显示全部选项
 | 
	
		
			
				|  |  | +    isAll:{
 | 
	
		
			
				|  |  | +      type: Boolean,
 | 
	
		
			
				|  |  | +      default: false,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //单行显示或者多行显示
 | 
	
		
			
				|  |  | +    isRow:{
 | 
	
		
			
				|  |  | +      type: Boolean,
 | 
	
		
			
				|  |  | +      default: false,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //自定义字段
 | 
	
		
			
				|  |  | +    prop:{
 | 
	
		
			
				|  |  | +      type: Object,
 | 
	
		
			
				|  |  | +      default: ()=>(
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          label:'dictLabel',
 | 
	
		
			
				|  |  | +          value:'dictValue'
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      ) ,
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  data(){
 | 
	
		
			
				|  |  | +    return{
 | 
	
		
			
				|  |  | +      showPicker:false,
 | 
	
		
			
				|  |  | +      label:'无',
 | 
	
		
			
				|  |  | +      searchKey:null,
 | 
	
		
			
				|  |  | +      keyName:this.prop.label,
 | 
	
		
			
				|  |  | +      columnsData:[],
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  computed:{
 | 
	
		
			
				|  |  | +    columns(){
 | 
	
		
			
				|  |  | +      if(this.isAll){
 | 
	
		
			
				|  |  | +        let obj = {};
 | 
	
		
			
				|  |  | +        obj[this.prop.label] = '全部';
 | 
	
		
			
				|  |  | +        obj[this.prop.value] = null;
 | 
	
		
			
				|  |  | +        this.columnsData = [obj,...this.dataList];
 | 
	
		
			
				|  |  | +        return [obj,...this.dataList];
 | 
	
		
			
				|  |  | +      }else{
 | 
	
		
			
				|  |  | +        console.log(this.dataList);
 | 
	
		
			
				|  |  | +        this.columnsData = this.dataList;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      return this.dataList;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    selected(){
 | 
	
		
			
				|  |  | +      if(!this.value) {
 | 
	
		
			
				|  |  | +        if(this.isAll){
 | 
	
		
			
				|  |  | +          this.label = '全部';
 | 
	
		
			
				|  |  | +          return null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        this.label = '无';
 | 
	
		
			
				|  |  | +        return null;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      let val;
 | 
	
		
			
				|  |  | +      this.columns.forEach(v=> {
 | 
	
		
			
				|  |  | +        if (v[this.prop.value] === this.value) {
 | 
	
		
			
				|  |  | +          val = v;
 | 
	
		
			
				|  |  | +          this.label = v[this.prop.label];
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      return val;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  methods:{
 | 
	
		
			
				|  |  | +    resetColumns() {
 | 
	
		
			
				|  |  | +      this.searchKey = "";
 | 
	
		
			
				|  |  | +      this.columnsData = this.columns;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    onSearch() {
 | 
	
		
			
				|  |  | +      if (!this.searchKey.length) {
 | 
	
		
			
				|  |  | +        this.columnsData = this.columns;
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      let newArr = [];
 | 
	
		
			
				|  |  | +      if (this.columnsData.length) {
 | 
	
		
			
				|  |  | +        newArr = this.columnsData.filter((item) => {
 | 
	
		
			
				|  |  | +          return item[this.keyName].includes(this.searchKey);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.columnsData = newArr;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    cancelPicker(){
 | 
	
		
			
				|  |  | +      this.showPicker = false;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    pickerConfirm(val){
 | 
	
		
			
				|  |  | +      if(!val) return;
 | 
	
		
			
				|  |  | +      this.label = val[this.prop.label];
 | 
	
		
			
				|  |  | +      this.showPicker = false;
 | 
	
		
			
				|  |  | +      this.$emit('change',val[this.prop.value]);
 | 
	
		
			
				|  |  | +      this.$emit('itemInfo',val)
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    clickItem(){
 | 
	
		
			
				|  |  | +      this.showPicker = true;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  model:{
 | 
	
		
			
				|  |  | +    prop: 'value',
 | 
	
		
			
				|  |  | +    event: 'change',
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +</script>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<style lang="scss" scoped>
 | 
	
		
			
				|  |  | +.select-cell{
 | 
	
		
			
				|  |  | +  position: relative;
 | 
	
		
			
				|  |  | +  box-sizing: border-box;
 | 
	
		
			
				|  |  | +  width: 100%;
 | 
	
		
			
				|  |  | +  overflow: hidden;
 | 
	
		
			
				|  |  | +  color: #323233;
 | 
	
		
			
				|  |  | +  background-color: #fff;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +.select-cell::after{
 | 
	
		
			
				|  |  | +  position: absolute;
 | 
	
		
			
				|  |  | +  box-sizing: border-box;
 | 
	
		
			
				|  |  | +  content: ' ';
 | 
	
		
			
				|  |  | +  pointer-events: none;
 | 
	
		
			
				|  |  | +  right: 30px;
 | 
	
		
			
				|  |  | +  bottom: 0;
 | 
	
		
			
				|  |  | +  left: 30px;
 | 
	
		
			
				|  |  | +  border-bottom: 1px solid #ebedf0;
 | 
	
		
			
				|  |  | +  -webkit-transform: scaleY(.5);
 | 
	
		
			
				|  |  | +  transform: scaleY(.5);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +.van-cell__label{
 | 
	
		
			
				|  |  | +  margin: 0;
 | 
	
		
			
				|  |  | +  white-space: nowrap;
 | 
	
		
			
				|  |  | +  text-overflow: ellipsis;
 | 
	
		
			
				|  |  | +  overflow: hidden;
 | 
	
		
			
				|  |  | +  width: 260px;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +</style>
 |