el-select封装,根据字典类型生成字典下拉框

<template>
  <div class="dict">
    <!-- 字典下拉框公共组件 huang -->
    <el-select v-model="selValue" :placeholder="placeholder" :size="size" @change="changeHandle">
      <el-option v-for="item in options" :key="item.key" :label="item.value" :value="item.key" />
    </el-select>
  </div>

</template>

<script>

import { listDictItem } from '@/api/base/dict'
export default {
  components: { },
  props: {
    placeholder: {
      type: String,
      default: () => '选择'
    },
    style1: {
      type: String,
      default: () => ''
    },
    size: {
      type: String,
      default: () => 'small'
    },
    group: {
      type: String,
      required: true
    },
    value: {
      type: String,
      default: () => ''
    }

  },
  data() {
    return {
      options: [
      ],
      selValue: '',
      dictQuery: {}
    }
  },
  watch: {
    // huang
    group(val) {
      this.dictQuery.dictGroupCode = val
      this.listDict()
    },
    options(val) {
      console.log(val)
    },
    value(val) {
      this.selValue = '' + val
    }
  },
  created() {

  },
  mounted() {
    this.dictQuery.dictGroupCode = this.group
    this.listDict()
  },
  methods: {
    changeHandle(val) {
      this.$emit('input', val)
    },
    listDict() {
      console.log('this.dictQuery', this.dictQuery)
      listDictItem(this.dictQuery).then(response => {
        this.options = response.data
        this.selValue = '' + this.value
      })
    }
  }

}
</script>
<style lang="less" scoped>
  .dict{
    margin: 0px;
    padding: 0px;
  }
// 优化记录:回填赋值时增加 '' (this.selValue = '' + val)解决数字字典值不能回填的问题,即强制转成字符
// 在之前监听回显值变化赋值回填值之外在下拉数据读取完成后赋值回填值,解决部分场景不能回填选中值的问题
</style>

 

 

封装好的字典查询下拉框,作用是 减少重复劳动,使代码简洁。也可后期缓存也可以在组件中增加

之前卡在子组件修改父组件传过来的属性的问题上,后来百度找了一下找到答案了 ,

一下是引用如下

https://www.cnblogs.com/zero-zm/p/12102693.html

 

Vue 子组件更新props中de属性值

更多vue实战:https://www.yuque.com/smallwhy/fmgz6r

在子组件中更新props中的属性值,并且更新到父组件,有两种实现方式:.sync 和 自定义v-model

1、.sync属性

  • 父组件在给子组件传值时,属性名后需要加修饰符.sync,格式 :子组件props属性名.sync
  • 子组件向上弹射事件给父组件时,事件名必须为格式 update:props属性名

父组件

<template>
<div id="app">
    // 注意点一、:show后跟修饰符.sync
    // 等同于<my-componen :show="valueChild" @update:show="val => valueChild= val" />
    <my-component :show.sync='valueChild' />
</div>
</template>
<script>
export default {
    data(): {
        return {valueChild: false}
    }
}
</script>

子组件

<template>
    <h3>{{show}}</h3>
    <button @click="eventOpt">子组件事件</button>
</template>
<script>
export default {
   props: {
       show: { type: Boolean, default: false}
    } ,
    methods: {
        eventOpt() {
            // 注意二、事件名必须为update:属性名
            // 更改prop中的属性show的属性值,同时更新父组件中中valueChild的属性值
             this.$emit('update:show', false);
        }
    }
}
</script>

2、v-model应用

  • 子组件定义的属性名必须为 value
  • 父组件向上弹射事件给子组件时,事件名必须为 input

父组件

<template>
<div id="app">
   // 等同于<my-componen :value="valueChild" @input="val => valueChild= val" />
    <my-component :value='valueChild' />
</div>
</template>
<script>
export default {
    data(): {
        return {valueChild: false}
    }
}
</script>

子组件

<template>
    <h3>{{show}}</h3>
    <button @click="eventOpt">子组件事件</button>
</template>
<script>
export default {
   props: {
     // 注意点一、属性名必须为value
      value: { type: Boolean, default: false}
    } ,
    methods: {
        eventOpt() {
            // 注意二、事件名必须为input
            // 更改prop中的属性show的属性值,同时更新父组件中中valueChild的属性值
             this.$emit('input', false);
        }
    }
}
</script>

比较

_

  • v-model 子组件只能更改props中的一个属性值value;
  • .sync 子组件可以更改props中的多个属性值;

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值