VUE ElementUI 下拉框组件(select)的封装

今天写一下elementUI中select组件的封装:以下面这个以可搜索的下拉框为例:

 1.创建子组件:Select.vue

<template>
  <div>
    <el-select v-model="value" filterable :placeholder="'请选择'+select.name" @change="change">
    <el-option
      v-for="item in select.data"
      :key="item.value"
      :label="item.label"
      :value="item.value">
    </el-option>
  </el-select>
  </div>
</template>

<script>
  export default {
    name: "Select",
    props:{
      select:Object
    },
    data() {
      return {
        //value: this.select.result
      }
    },
    computed:{
      value:{
        get(){
          this.select.result && this.change(this.select.result)
          return this.select.result
        }
      }
    },
    methods: {
      change(val) {
        console.log(val);
        //方法:利用select对象把值传给父组件
        this.select.result = val
        //把二级子项的数据找到,并传给父组件
        let a = this.buildChild(val)
        console.log(a);
        this.$emit('erjichange',a)
        // this.select.chang && this.select.change(this.buildChild(val))
      },
      buildChild(val){
        let data = this.select.data.find(item=>{
          return item.value == val
        })
        return data.children
      }
    },
  }
</script>

<style lang="scss" scoped>

</style>

2.父组件:

<template>
  <div style="margin:20px">
    <!-- 下拉框组件的封装 -->
    <Select :select="select" @erjichange="erjichange"></Select>
    <Select :select="selectChild"></Select>
  </div>
</template>

<script>
import Select from "./Select.vue"
import SelectTable from "./SelectTable.vue";
  export default {
    name: "SelectMain",
    components:{ Select, SelectTable },
    data() {
      return {
        selectChild:{
          result:"",
          name: "食物子项",
          data: []
        },
        select:{
          result:"选项1",  //选中的value
          name: "食物",
          // change: (data)=>{
          //   console.log(data);
          //   this.selectChild.data = data
          // },
          data: [{
            value: '选项1',
            label: '黄金糕',
            children: [{
              value: '选项1-1',
              label: '黄金糕1-1',   
            },
            {
              value: '选项1-2',
              label: '黄金糕1-2',
            }
          ]
          }, {
            value: '选项2',
            label: '双皮奶',
            children: [{
              value: '选项2-1',
              label: '双皮奶2-1',   
            },
            {
              value: '选项2-2',
              label: '双皮奶2-2',
            }
          ]
          }, {
            value: '选项3',
            label: '蚵仔煎',
            children: [{
              value: '选项3-1',
              label: '蚵仔煎3-1',   
            },
            {
              value: '选项3-2',
              label: '蚵仔煎3-2',
            }
          ]
          }, {
            value: '选项4',
            label: '龙须面'
          }, {
            value: '选项5',
            label: '北京烤鸭'
          }],
        },
      }
    },
    methods: {
      erjichange(data) {
        console.log(data);
        this.selectChild.result = ''
        this.selectChild.data = data
      }
    },
  }
</script>

<style lang="scss" scoped>

</style>

页面效果:

这个例子是做了一个二级联动的效果,当第一个下拉框选择后,第二个下拉框的内容就确定了;

比较难懂的部分是:

子组件:

 这所以加这行代码是为了,首次加载时,第一个下拉框有默认值的情况下第二个下拉框也有相应的默认值。

      change(val) {
        console.log(val);
        //方法:利用select对象把值传给父组件
        this.select.result = val
        //把二级子项的数据找到,并传给父组件
        let a = this.buildChild(val)
        console.log(a);
        this.$emit('erjichange',a)
        //第二种方法触发父组件的change属性
        // this.select.chang && this.select.change(this.buildChild(val))
      },
      buildChild(val){
        let data = this.select.data.find(item=>{
          return item.value == val
        })
        return data.children
      }

父组件:

 

 以上我是采用了两种触发父组件change方法的方法:一种是给的select对象添加change属性,二种是用子传父的$emit方法;

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的 Vue 下拉框组件封装及引用代码: ```vue <template> <div class="select-container"> <div class="select-header" @click="showOptions = !showOptions"> {{ selectedOption || placeholder }} <i v-if="showOptions" class="fa fa-sort-up"></i> <i v-else class="fa fa-sort-down"></i> </div> <div class="select-options" v-show="showOptions"> <div v-for="(option, index) in options" :key="index" @click="selectOption(option)"> {{ option }} </div> </div> </div> </template> <script> export default { props: { options: { type: Array, default: () => [] }, placeholder: { type: String, default: "请选择" } }, data() { return { selectedOption: "", showOptions: false }; }, methods: { selectOption(option) { this.selectedOption = option; this.showOptions = false; this.$emit("option-selected", option); } } }; </script> ``` 这个组件的使用方法如下: ```vue <template> <div> <SelectBox :options="options" placeholder="请选择" @option-selected="onOptionSelected"/> </div> </template> <script> import SelectBox from "@/components/SelectBox.vue"; export default { components: { SelectBox }, data() { return { options: ["Option1", "Option2", "Option3"] }; }, methods: { onOptionSelected(option) { console.log(`Selected option: ${option}`); } } }; </script> ``` 在这个例子中,我们向 `SelectBox` 组件传递了一个 `options` 属性,这是一个包含下拉框选项的数组。我们还传递了一个 `placeholder` 属性,以指定下拉框未选择选项时显示的文本。`SelectBox` 组件使用 `v-for` 指令为每个选项生成一个 `div` 元素,并在用户选择一个选项时发出一个 `option-selected` 事件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值