import Vue from 'vue' ;
import { ContactCard , ContactList , ContactEdit } from 'vant' ;
Vue
. use ( ContactCard )
. use ( ContactList )
. use ( ContactEdit ) ;
<!-- Contact Card -->
< van-contact-card
:type ="cardType "
:name ="currentContact.name "
:tel ="currentContact.tel "
@click ="showList = true "
/>
<!-- Contact List -->
< van-popup v-model ="showList " position ="bottom ">
< van-contact-list
v-model ="chosenContactId "
:list ="list "
@add ="onAdd "
@edit ="onEdit "
@select ="onSelect "
/>
</ van-popup >
<!-- Contact Edit -->
< van-popup v-model ="showEdit " position ="bottom ">
< van-contact-edit
:contact-info ="editingContact "
:is-edit ="isEdit "
@save ="onSave "
@delete ="onDelete "
/>
</ van-popup >
export default {
data ( ) {
return {
chosenContactId : null ,
editingContact : { } ,
showList : false ,
showEdit : false ,
isEdit : false ,
list : [ {
name : 'John Snow' ,
tel : '13000000000' ,
id : 0
} ]
} ;
} ,
computed : {
cardType ( ) {
return this . chosenContactId !== null ? 'edit' : 'add' ;
} ,
currentContact ( ) {
const id = this . chosenContactId ;
return id !== null ? this . list . filter ( item => item . id === id ) [ 0 ] : { } ;
}
} ,
methods : {
// add contact
onAdd ( ) {
this . editingContact = { id : this . list . length } ;
this . isEdit = false ;
this . showEdit = true ;
} ,
// edit contact
onEdit ( item ) {
this . isEdit = true ;
this . showEdit = true ;
this . editingContact = item ;
} ,
// select contact
onSelect ( ) {
this . showList = false ;
} ,
// save contact
onSave ( info ) {
this . showEdit = false ;
this . showList = false ;
if ( this . isEdit ) {
this . list = this . list . map ( item => item . id === info . id ? info : item ) ;
} else {
this . list . push ( info ) ;
}
this . chosenContactId = info . id ;
} ,
// delete contact
onDelete ( info ) {
this . showEdit = false ;
this . list = this . list . filter ( item => item . id !== info . id ) ;
if ( this . chosenContactId === info . id ) {
this . chosenContactId = null ;
}
}
}
} ;
< van-contact-card
type ="edit "
name ="John Snow "
tel ="13000000000 "
:editable ="false "
/>
Attribute
Description
Type
Default
type
Can be set to add edit
string
add
name
Name
string
-
tel
Phone
string
-
add-text
Add card text
string
Add contact info
Event
Description
Arguments
click
Triggered when clicked
event: Event
| Attribute | Description | Type | Default |
|------|------|------|------|------|
| v-model | Id of chosen contact | string | number | - |
| list | Contact list | Contact[] | [] |
| add-text | Add button text | string | Add new contact |
Event
Description
Arguments
add
Triggered when click add button
-
edit
Triggered when click edit button
item: contact object,index
select
Triggered when select contact
item: contact object
| Attribute | Description | Type | Default |
|------|------|------|------|------|
| contact-info | Contact Info | object | [] |
| is-edit | Whether is editing | boolean | false |
| is-saving | Whether to show save button loading status | boolean | false |
| is-deleting | Whether to show delete button loading status | boolean | false |
| tel-validator | The method to validate tel | (tel: string) => boolean | - |
Event
Description
Arguments
save
Triggered when click save button
content:contact info
delete
Triggered when click delete button
content:contact info
Data Structure of Contact
key
Description
Type
id
ID
`string
name
Name
string
tel
Phone
string