如何使 Vue 的 element-ui validateField() 与 v-if 一起工作?
How to make Vue's element-ui validateField() works with v-if?
请查看密码字段。 Password
和 Confirm Password
字段在单击 Change Password?
按钮时显示。
下面的代码工作正常,并按预期使用 v-show
验证表单,但在使用 v-if
时不验证。
我了解 v-show
和 v-if
的作用,data(){}
中的函数在 element-ui 的文档中也是如此。这是文档的 url:http://element.eleme.io/#/en-US/component/form#custom-validation-rules
<template lang="pug">
el-dialog( width="600px", title="Users", :visible.sync="dialogVisible")
el-form.demo-ruleForm(:model="editedItem", status-icon, :rules="formRules", ref="userForm", label-width="140px")
el-form-item(label="Name", prop="firstName")
el-input(v-model="editedItem.name", auto-complete="off")
template(v-if="!changePassword")
el-form-item
el-button(@click="changePassword = true") Change Password?
template(v-else)
el-form-item(label="Password", prop="password")
el-input(type="password", v-model="editedItem.password", auto-complete="off")
el-form-item(label="Confirm Password", prop="confirmPassword")
el-input(type="password", v-model="editedItem.confirmPassword", auto-complete="off")
.dialog-footer(slot="footer")
el-button(type="primary", @click="submitForm('userForm')") Save
</template>
<script>
export default {
name: 'dialog-add-edit-user',
props: {
editedItem: Object,
},
data () {
const validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('Please input the password'))
} else {
if (this.confirmPassword !== '') {
this.$refs.userForm.validateField('confirmPassword')
}
callback()
}
}
const validatePass2 = (rule, value, callback) => {
if (value === '') {
callback(new Error('Please input the password again'))
} else if (value !== this.editedItem.password) {
callback(new Error('Two inputs don\'t match!'))
} else {
callback()
}
}
return {
formRules: {
password: [
{
validator: validatePass,
trigger: 'blur'
}
],
confirmPassword: [
{
validator: validatePass2,
trigger: 'blur'
}
]
},
dialogVisible: false,
changePassword: false,
editedItem: {
name: '',
password: '',
confirmPassword: ''
}
}
},
methods: {
submitForm (formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.$emit('save-item')
console.log('submit!')
} else {
console.log('error submit!!')
return false
}
})
}
}
}
</script>
好的,我想我明白问题是什么了。
你的验证通过了,但它不检查 name
和 password
,只检查 passwordChange
.
因此,如果您“...了解 v-show 和 v-if 的作用”,您就会知道使用 v-if
/[=15= 时元素不存在].它们会根据需要添加和删除。
这是一个问题的原因是元素库在添加时要经过初始化阶段。稍后使用 $ref
引用该元素。看看 SubmitForm
,它使用 `this.$refs[formName].validate'
所以当你使用 v-if/v-else
时,因为元素不存在,所以它们将不会被正确调用。
你有两个选择,要么坚持使用 v-show
,这应该很简单,或者你可以使用我一直在利用不允许强制手动或自动的第三方库的 hack重新加载。破解包括向主要元素添加 key
。所以 html 看起来像这样。
<el-form
class="demo-ruleForm"
:model="editedItem"
status-icon="status-icon"
:key="'form'+changePassword" <--- this is the magic
:rules="formRules"
ref="userForm"
label-width="140px"
>
哈巴狗
el-form.demo-ruleForm(:model="editedItem", :key="'form'+changePassword", status-icon, :rules="formRules", ref="userForm", label-width="140px")
请查看密码字段。 Password
和 Confirm Password
字段在单击 Change Password?
按钮时显示。
下面的代码工作正常,并按预期使用 v-show
验证表单,但在使用 v-if
时不验证。
我了解 v-show
和 v-if
的作用,data(){}
中的函数在 element-ui 的文档中也是如此。这是文档的 url:http://element.eleme.io/#/en-US/component/form#custom-validation-rules
<template lang="pug">
el-dialog( width="600px", title="Users", :visible.sync="dialogVisible")
el-form.demo-ruleForm(:model="editedItem", status-icon, :rules="formRules", ref="userForm", label-width="140px")
el-form-item(label="Name", prop="firstName")
el-input(v-model="editedItem.name", auto-complete="off")
template(v-if="!changePassword")
el-form-item
el-button(@click="changePassword = true") Change Password?
template(v-else)
el-form-item(label="Password", prop="password")
el-input(type="password", v-model="editedItem.password", auto-complete="off")
el-form-item(label="Confirm Password", prop="confirmPassword")
el-input(type="password", v-model="editedItem.confirmPassword", auto-complete="off")
.dialog-footer(slot="footer")
el-button(type="primary", @click="submitForm('userForm')") Save
</template>
<script>
export default {
name: 'dialog-add-edit-user',
props: {
editedItem: Object,
},
data () {
const validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('Please input the password'))
} else {
if (this.confirmPassword !== '') {
this.$refs.userForm.validateField('confirmPassword')
}
callback()
}
}
const validatePass2 = (rule, value, callback) => {
if (value === '') {
callback(new Error('Please input the password again'))
} else if (value !== this.editedItem.password) {
callback(new Error('Two inputs don\'t match!'))
} else {
callback()
}
}
return {
formRules: {
password: [
{
validator: validatePass,
trigger: 'blur'
}
],
confirmPassword: [
{
validator: validatePass2,
trigger: 'blur'
}
]
},
dialogVisible: false,
changePassword: false,
editedItem: {
name: '',
password: '',
confirmPassword: ''
}
}
},
methods: {
submitForm (formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.$emit('save-item')
console.log('submit!')
} else {
console.log('error submit!!')
return false
}
})
}
}
}
</script>
好的,我想我明白问题是什么了。
你的验证通过了,但它不检查 name
和 password
,只检查 passwordChange
.
因此,如果您“...了解 v-show 和 v-if 的作用”,您就会知道使用 v-if
/[=15= 时元素不存在].它们会根据需要添加和删除。
这是一个问题的原因是元素库在添加时要经过初始化阶段。稍后使用 $ref
引用该元素。看看 SubmitForm
,它使用 `this.$refs[formName].validate'
所以当你使用 v-if/v-else
时,因为元素不存在,所以它们将不会被正确调用。
你有两个选择,要么坚持使用 v-show
,这应该很简单,或者你可以使用我一直在利用不允许强制手动或自动的第三方库的 hack重新加载。破解包括向主要元素添加 key
。所以 html 看起来像这样。
<el-form
class="demo-ruleForm"
:model="editedItem"
status-icon="status-icon"
:key="'form'+changePassword" <--- this is the magic
:rules="formRules"
ref="userForm"
label-width="140px"
>
哈巴狗
el-form.demo-ruleForm(:model="editedItem", :key="'form'+changePassword", status-icon, :rules="formRules", ref="userForm", label-width="140px")