今天修改一个前端项目,增加一个多选字段,使用的是el-cascader控件,因页面是通过引用子页面组件形式使用,出现一个点选后再勾选原有值,输入框内不展示或取消后的也未正常隐藏,如果勾选的值是全新的则其他已选值也会被带出展示,好神奇~~~~~。
具体如下图:
各种尝试修改,隐藏屏蔽,还是不行。。。
最后发下一个之前遇到类似问题,就是引用子页面组件控件动态赋值时出现未及时更新情况。最后再组件中增加了点击事件方法,在方法里加了一句话就解决了。!!!!!
上代码:
//父级页面应用子页面组件
<el-tab-pane label="基本资料" name="userinfo">
<userInfo :user-data="user" :risk-list="riskList"/>
</el-tab-pane>
这里是子页面userInfo.vue页面应用el-cascader控件部分代码;其核心就再@change事件里面。
//子页面使用控件部分代码
<el-form-item label="检测因素" prop="itemList">
<el-cascader
v-model="userData.itemList"
placeholder="试试搜索"
:options="riskList"
:props="{ label: 'label', value: 'id', multiple: true }"
filterable @change="handleChangeCas"></el-cascader>
</el-form-item>
验证必填代码:
data() {
const validateOrg = (rule, value, callback) => {
if (!this.userData.itemList.length) {
callback(new Error('检测因素不能为空'))
} else {
callback()
}
}
return {
// 表单校验
rulesData: {
itemList: [
{ type:'array', required: true, validator: validateOrg }
],
}
}
}
handleChageCas方法代码:
methods: {
//刷新控件
handleChangeCas(val){
this.$forceUpdate()
},
}
总结:最后发现因为引用页面,值没有被更新,需要手动更新(
this.$forceUpdate()
)后才能生效。如果引用子页面输入控件(el-input)/选择控件(el-select)也出现类似情况可以使用此方法再@input事件执行。
<el-form-item label="联系电话" prop="phonenumber">
<el-input v-model="userData.phonenumber" maxlength="11" show-word-limit @input="change($event)"/>
</el-form-item>
<el-form-item label="联系邮箱" prop="email">
<el-input v-model="userData.email" @input="change($event)"/>
</el-form-item>
<el-form-item label="机构类型:" prop="organizationTypeAttr">
<el-select v-model="userData.organizationTypeAttr" clearable multiple @input="change($event)">
<el-option v-for="dict in dict.type.organization_type"
:value="dict.value"
:label="dict.label"
:key="parseInt(dict.value)"></el-option>
</el-select>
</el-form-item>
//解决输入框无法输入
change() {
this.$forceUpdate()
},