<template> <div class="van-contact-edit"> <van-cell-group> <van-field label="联系人" maxlength="30" placeholder="名字" v-model="currentInfo.name" :error="errorInfo.name" @focus="onFocus('name')"> </van-field> <van-field type="tel" label="联系电话" placeholder="手机或固定电话" v-model="currentInfo.tel" :error="errorInfo.tel" @focus="onFocus('tel')"> </van-field> </van-cell-group> <div class="van-contact-edit__buttons"> <van-button block :loading="isSaving" @click="onSaveContact" type="primary">保存</van-button> <van-button block :loading="isDeleting" @click="onDeleteContact" v-if="isEdit">删除联系人</van-button> </div> </div> </template> <script> import Field from '../field'; import Button from '../button'; import CellGroup from '../cell-group'; import Dialog from '../dialog'; import Toast from '../toast'; import validateMobile from 'zan-utils/validate/mobile'; export default { name: 'van-contact-edit', components: { [Field.name]: Field, [Button.name]: Button, [CellGroup.name]: CellGroup }, props: { isEdit: Boolean, isSaving: Boolean, isDeleting: Boolean, contactInfo: { type: Object, default: () => ({ id: '', tel: '', name: '' }) } }, data() { return { currentInfo: this.contactInfo, errorInfo: { name: false, tel: false } }; }, watch: { contactInfo(val) { this.currentInfo = val; } }, methods: { onFocus(key) { this.errorInfo[key] = false; }, getErrorMessageByKey(key) { const value = this.currentInfo[key]; switch (key) { case 'name': return value ? value.length <= 15 ? '' : '名字过长,请重新输入' : '请填写名字'; case 'tel': return validateMobile(value) ? '' : '请填写正确的手机号码或电话号码'; } }, onSaveContact() { const items = [ 'name', 'tel' ]; const isValid = items.every(item => { const msg = this.getErrorMessageByKey(item); if (msg) { this.errorInfo[item] = true; Toast(msg); } return !msg; }); if (isValid && !this.isSaving) { this.$emit('save', this.currentInfo); } }, onDeleteContact() { if (this.isDeleting) { return; } Dialog.confirm({ message: `确定要删除这个联系人么` }).then(() => { this.$emit('delete', this.currentInfo); }); } } }; </script>