我预实现的效果是:
根据pushData数据自动创建表单
并根据每个表单的不同绑定不同的方法,比如手机表单可以做到验证号码,姓名表单可以验证姓名规则等等
目前遇到一个问题,就是在手机表单中通过输入触发iserr属性,无法同步到视图显示
请问这是什么原因导致的呢?
我的的代码如下:
<template>
<div id="app">
<ul>
<li
v-for="(item, index) in pushData"
:key="index"
>
<!-- 如果是输入框 start -->
<input
v-if="item.type=='text'"
type="text"
:placeholder = "'请输入' + item.name"
@input="item.fun"
:class="item.iserr?'error':''" // 问题:数据无法同步到此处
/>
<!-- 如果是输入框 end -->
</li>
</ul>
</div>
</template>
<script>
export default {
data () {
return {
pushArray: [],
pushData: { // 表单中涉及的数据
user: {
name: '姓名',
type: 'text'
},
phone: {
name: '手机',
type: 'text'
},
company: {
name: '公司',
type: 'text'
}
}
}
},
created () { // 在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图
let that = this
for (let item in this.pushData) { // 数据筛选
let dataType = that.pushData[item]
dataType.iserr = false
switch (dataType.type) {
case 'text':
// typeText(dataType, dataName)
dataType.fun = function (e) {
dataType.val = e.target.value
// 问题:通过输入出发iserr改变,并控制input的class显示,但是无法同步到视图
dataType.iserr = true
// that.$set(that.pushData[item], 'iserr', true)
}
break
}
}
}
}
</script>
初始化iserr为false的时候使用 this.$set(this.pushData[item], 'iserr', false)
触发的时候有也要this.$set(this.pushData[item], 'iserr', true)