form 表单 input select 输入框接口返回数据不能编辑

3 篇文章 0 订阅

在使用element  ui form 表单组件时候,input 输入框能够绑定数据 但是不能修改编辑、如下图所示:

问题:既然能够绑定为什么不能修改呢?

这个可以肯定的一点是数据单项赋值是生效了。双向绑定没有生效。所以我们入手就应该从Vue数据绑定的原理来解决问题。

那么Vue双向绑定的原理是什么?

Vue的双向绑定原理是通过数据劫持结合发布者-订阅者模式来实现的。

数据劫持:Vue组件初始化时,对 data 中的 item 进行递归遍历,会通过Object.defineProperty()方法来劫持对象的属性,这个方法可以对一个对象的属性进行定义或修改,包括定义getter和setter。这样,当这些被劫持的属性被读取或赋值时,就会触发相应的getter或setter函数

所以这个要搞清楚一点就是对data对象数据初始化的时候进行遍历劫持。然而细心的同学就会发现。我这里Data数据对象是通过方法。修改过的。那么对于Vue来说。接没有初始化过这个数据,也就没有办法劫持

所以就需要手动来添加劫持方法。 让这个对象保持响应式。对于Vue熟练一点的朋友就知道要使用this.$set(对象,属性名,值)来并确保这个新属性同样是响应式的,且触发视图更新。

最后结果

重点:什么情况容易出现这种情况呢?

1:Data数据式对象中对象 比如:

data(){
    return{
       dataform:{ 
            dataformson:{ 
                son1:'',
                son2:''
                } 
            } 
    }
}

2:  Data数据中对象通过方法来添加属性。比如:

data(){
    return{
        dataform:{
            son1: '',
            son2:''
        }    
    }
}
methods:{
//添加属性
  addSonFun(){
        this.dataform['son3']=''
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue项目中使用ElementUI生成表单,可以使用ElementUI提供的FormFormItem组件。接收后端传过来的数据动态生成表单元素,可以使用v-for指令进行循环渲染。 在动态添加表单验证方面,可以使用ElementUI提供的rules属性。针对三种需求,可以分别定义三个验证规则函数: 1. 不能为空: ``` rules: { required: [ { required: true, message: '该项不能为空', trigger: 'blur' } ] } ``` 2. 只允许输入小数: ``` rules: { decimal: [ { pattern: /^[0-9]+(\.[0-9]{1,2})?$/, message: '只能输入数字和小数点,小数点后最多两位', trigger: 'blur' } ] } ``` 3. 只允许小数且保留小数点后2位: ``` rules: { decimal2: [ { pattern: /^(([1-9]\d{0,9})|0)(\.\d{1,2})?$/, message: '只能输入数字和小数点,小数点后最多两位', trigger: 'blur' } ] } ``` 最后,通过v-model指令将表单元素与数据绑定在一起,就可以实现动态生成表单表单验证了。完整代码示例如下: ```html <template> <el-form ref="form" :model="form" :rules="rules" label-width="100px" class="demo-ruleForm"> <el-form-item v-for="(item, index) in formItems" :key="index" :label="item.label"> <template v-if="item.type === 'input'"> <el-input v-model="form[item.prop]" :placeholder="item.placeholder"></el-input> </template> <template v-else-if="item.type === 'select'"> <el-select v-model="form[item.prop]" placeholder="请选择"> <el-option v-for="(option, i) in item.options" :key="i" :label="option.label" :value="option.value"></el-option> </el-select> </template> </el-form-item> </el-form> </template> <script> export default { data() { return { formItems: [ { label: '输入框1', type: 'input', prop: 'input1', placeholder: '请输入' }, { label: '输入框2', type: 'input', prop: 'input2', placeholder: '请输入' }, { label: '输入框3', type: 'input', prop: 'input3', placeholder: '请输入' }, { label: '选择框1', type: 'select', prop: 'select1', options: [ { label: '选项1', value: 'option1' }, { label: '选项2', value: 'option2' }, { label: '选项3', value: 'option3' } ] }, { label: '选择框2', type: 'select', prop: 'select2', options: [ { label: '选项1', value: 'option1' }, { label: '选项2', value: 'option2' }, { label: '选项3', value: 'option3' } ] } ], form: { input1: '', input2: '', input3: '', select1: '', select2: '' }, rules: { input1: [ { required: true, message: '输入框1不能为空', trigger: 'blur' } ], input2: [ { required: true, message: '输入框2不能为空', trigger: 'blur' }, { pattern: /^[0-9]+(\.[0-9]{1,2})?$/, message: '只能输入数字和小数点,小数点后最多两位', trigger: 'blur' } ], input3: [ { required: true, message: '输入框3不能为空', trigger: 'blur' }, { pattern: /^(([1-9]\d{0,9})|0)(\.\d{1,2})?$/, message: '只能输入数字和小数点,小数点后最多两位', trigger: 'blur' } ], select1: [ { required: true, message: '请选择选择框1', trigger: 'change' } ], select2: [ { required: true, message: '请选择选择框2', trigger: 'change' } ] } } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值