关于antdesign of vue Form表单中自定义组件(数据字典)的实现 以及值不能回显的问题

      本人是后端开发工程师,但最近几个项目用到了微服务加前后端分离的技术,于是接触学习了vue.js。对于前端开发只能算是了解+可以应用,vue高级复杂的用法也不是很了解,所以有说的不准确的地方,还希望大家多多指点。之前项目前端工程是采用Vue+Element的框架,当前项目框架是Vue+Ant Design。最近发现Element 和 antdesign这两个组件库还是存在一些细微区别的。今天针对Form表单中自定义组件这个方面,想把我自己的解决方案分享给大家,希望可以帮助到需要的人。

      首先代码如下:

子组件:

<template>
  <a-select showSearch
            :filterOption="filterOption"
            :placeholder="placeholder"
            @change="handleChange"
            :value="seletedValue">
    <a-select-option value>{{ placeholder }}</a-select-option>
    <a-select-option v-for="(item, code) in dictOptions"
                     :key="code"
                     :value="item.code">{{ item.code }}-{{ item.name }}</a-select-option>
  </a-select>
</template>

<script>
import { getDictData } from './dict'

export default {
  name: 'DictSelect',
  props: {
    dictType: {
      required: true,
      type: String
    },
    placeholder: String,
    value: ""
  },
  data () {
    return {
      dictOptions: [],
      seletedValue: this.value
    }
  },
  created () {
    this.initDictData()
  },
  methods: {
    initDictData () {
      getDictData(this.dictType).then(r => {
        this.dictOptions = r.data.rows
      })
    },
    filterOption (input, option) {
      return (
        option.componentOptions.children[0].text
          .toLowerCase()
          .indexOf(input.toLowerCase()) >= 0
      )
    },
    handleChange (val) {
      this.$emit('change', val)
      //this.$emit('dataChanged', val)
    }
  },
  watch: {
    value: function () {
      this.seletedValue = this.value
    }
  }
}
</script>

父组件:

 <DictSelect dictType="currencyType"
             v-decorator="['currency']"></DictSelect>

遇到的问题:

     由于之前VUE+Element 表单中都是使用v-model指令进行数据的双向绑定,子组件中触发input回调将选中的值返回。但是现在父组件中使用的是v-decorator指令的方式(这种方式的双向绑定具体原理及实现建议参考Ant Design of Vue官网)。导致子组件this.$emit('input')只可以将选中的值返还给父组件的v-model,但是在修改需要回显的时候值却不能回显。后来发现官网中这段话提醒了我:

       这段话提醒我使用了v-decorator 双向绑定后,就不应该再用v-model,同时子组件默认要通过onChange来回传选中的值,所以相应的修改了代码,问题迎刃而解。

      另外分享一个小彩蛋,Vue的v-model这个语法糖做的是两件事,一是给表单控件元素绑定value(所以子组件prop中要用value接收),第二个是当输入值时,更新绑定的值。具体如下:

vue语法:

<input v-model="message">

相当于

<input v-bind:value="message" v-on:input="message = $event.target.value">

      最后声明一下,本人第一次写博客,自己接触前端时间也不长,可能写的很浅显,也可能有理解错误的地方,希望大家多多指正,相互学习。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
antd of vue 中的 v-decorator 单中,自定义组件数据字典)的实现是通过使用 v-model 来绑定数据的双向绑定功能。首先,在自定义组件中,我们需要接收一个 value 属性作为组件,同时也需要定义一个 input 事件来监听组件的变化。然后,在组件的模板中,我们需要使用 v-model 将传入的 value 绑定到组件的内部上,并在变化时触发 input 事件将新传递出去。 例如,我们可以创建一个自定义的 Select 组件,用于展示数据字典的选项。在组件内部,我们可以接收一个名为 options 的数据字典数组作为组件选项的来源。在组件的模板中,我们可以使用 antd 的 Select 组件将选项渲染出来,并通过 v-model 将传入的 value 绑定到 Select 组件上。 然而,在使用 v-decorator 单装饰器时,由于 antd of vue组件在进行数据绑定时只能通过 v-model 进行双向绑定,因此在使用自定义组件时会出现不能回显问题。这是由于 v-decorator 单装饰器只能通过获取组件的 value 属性来获取单的,而自定义组件是通过 input 事件进行传递的,和 value 属性并没有直接关联。 解决这个问题的方法是,在自定义组件中,我们需要在变化时手动触发 v-decorator 单装饰器的 onChange 事件,并将新的作为参数传递出去。这样,在单提交或重置时,v-decorator 单装饰器就能正确地获取到自定义组件,并进行数据回显。 总之,通过使用 v-model 和手动触发 onChange 事件,我们可以在 antd of vue 的 v-decorator 单中实现定义组件数据字典)的双向绑定和回显

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值