我们使用iview封装一个select组件
这里写图片描述
封装的是每一个select下拉框

  <div class='iselect'>
    <!-- 非多选的情况 -->
    <i-select
     v-if='!ismultiple'
     v-model='selecteddata'
     :placeholder='placeholdertext'
     filterable
     clearable
     @on-change='getSelectedData'
    >
      <i-option
       v-for ='item in list'
       :value='item.value'
       :key='item.id'
      >{{item.label}}
      </i-option>
    </i-select>
    <!-- 多选的情况 -->
    <i-select
     v-if='ismultiple'
     v-model='selecteddata'
     :placeholder='placeholdertext'
     filterable
     multiple
     @on-change='getSelectedData'
    >
      <i-option
       v-for ='item in list'
       :value='item.value'
       :key='item.id'
      >{{item.label}}
      </i-option>
    </i-select>
  </div>
</template>

<script>
export default {
  name: 'SelectBox',
  props: {
    placeholder: {
      type: String,
      required: false,
      default: 'Select'
    },
    multiple: {
      type: Boolean,
      required: false,
      default: false
    },
    optionlist: Array
  },
  watch: {
    optionlist (val) {
      this.list = val
    }
  },
  data () {
    return {
      placeholdertext: this.placeholder,
      list: [],
      ismultiple: this.multiple,
      selecteddata: []
    }
  },
  methods: {
    getSelectedData (value) {
      this.selecteddata = value
      this.$emit('getSelectedData', this.selecteddata)
    }
  }
}
</script>

iview 中的select比较丑,修改样式忽略,很多修改插件不成功是可能是scoped作用域的问题
使用iview select 的原因在于,它有搜索功能,多选可以叉调功能,基本可以满足下拉菜单的功能

<i-select
     :model.sync='selecteddata'
     :placeholder='placeholdertext'
     filterable multiple
     @on-change='getselecteddata'
    >

:model.sync='selecteddata' 为选中的option,当为单选的时候是字符串或Number,多选时为数组,需要在data中初始化
placeholder 我们根据外界传过来的值显示,默认可以设置为’Select’

  props: {
    placeholder: {
      type: String,
      required: false,
      default: 'Select'
    }
  }

filterable multiple :可搜索,可多选
@on-change=’getselecteddata’: 这个是得到选中的数据!注意必须写为on-change才生效,得到的是数据中value的值,如果想要得到label的值,需要在select 添加label-in-value 得到的是数组对象
我们封装的select组件可以根据用户传入判断是单选还是多选,加一个判断参数,默认是单选的。
异步数据传输子组件监听一下来自父组件数据的变化。
我们得到这个数据需要往父组件中传递,父组件得到参数往后台传递

  methods: {
    getselecteddata (value) {
      // console.log(value)
      this.$emit('getSelectedData', value)
    }
  }

value是选中的option构成的数组

      <i-option
       v-for ='(item, index) in list'
       :value='item.value'
       :key='index'
      >{{item.label}}
      </i-option>

option中循环遍历下拉列表数据,是父组件传递过来的

  props: {
    optionlist: Array
  }

欧克,在父组件中使用:

        <select-box
         :optionlist='citylist'
         placeholder='Select City'
         v-on:getdata='getSelectedData'
        ></select-box>

往父组件中传递placeholder值和下拉列表的数据

      citylist: [
        {
          value: 'beijing',
          label: '北京市'
        },
        {
          value: 'shanghai',
          label: '上海市'
        },
        {
          value: 'shenzhen',
          label: '深圳市'
        },
        {
          value: 'hangzhou',
          label: '杭州市'
        },
        {
          value: 'nanjing',
          label: '南京市'
        },
        {
          value: 'chongqing',
          label: '重庆市'
        }
      ]

同时,父组件需要接收一个选中的option数组

  v-on:getdata='getSelectedData'
  ...
  methods: {
    getSelectedData (data) {
      console.log(data)
    }
  }

这样父组件就得到了子组件的选中的值了

Logo

前往低代码交流专区

更多推荐