mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-04-06 03:57:59 +08:00
[new feature] AddressList: support disabled list (#1729)
This commit is contained in:
parent
1471f6d5b5
commit
ad5ca640e0
32
packages/address-list/Item.vue
Normal file
32
packages/address-list/Item.vue
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<template>
|
||||||
|
<cell :class="b({ disabled })" :is-link="!disabled" @click="$emit('select')">
|
||||||
|
<radio :name="data.id">
|
||||||
|
<div :class="b('name')">{{ data.name }},{{ data.tel }}</div>
|
||||||
|
<div :class="b('address')">{{ data.address }}</div>
|
||||||
|
</radio>
|
||||||
|
<icon
|
||||||
|
slot="right-icon"
|
||||||
|
name="edit"
|
||||||
|
:class="b('edit')"
|
||||||
|
@click.stop="$emit('edit')"
|
||||||
|
/>
|
||||||
|
</cell>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Radio from '../radio';
|
||||||
|
import create from '../utils/create';
|
||||||
|
|
||||||
|
export default create({
|
||||||
|
name: 'address-item',
|
||||||
|
|
||||||
|
components: {
|
||||||
|
Radio
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
data: Object,
|
||||||
|
disabled: Boolean
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
@ -4,6 +4,8 @@
|
|||||||
<van-address-list
|
<van-address-list
|
||||||
v-model="chosenAddressId"
|
v-model="chosenAddressId"
|
||||||
:list="$t('list')"
|
:list="$t('list')"
|
||||||
|
:disabled-list="$t('disabledList')"
|
||||||
|
:disabled-text="$t('disabledText')"
|
||||||
@add="onAdd"
|
@add="onAdd"
|
||||||
@edit="onEdit"
|
@edit="onEdit"
|
||||||
/>
|
/>
|
||||||
@ -27,7 +29,9 @@ export default {
|
|||||||
name: '李四',
|
name: '李四',
|
||||||
tel: '1310000000',
|
tel: '1310000000',
|
||||||
address: '浙江省杭州市拱墅区莫干山路 50 号'
|
address: '浙江省杭州市拱墅区莫干山路 50 号'
|
||||||
},
|
}
|
||||||
|
],
|
||||||
|
disabledList: [
|
||||||
{
|
{
|
||||||
id: '3',
|
id: '3',
|
||||||
name: '王五',
|
name: '王五',
|
||||||
@ -36,7 +40,8 @@ export default {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
add: '新增地址',
|
add: '新增地址',
|
||||||
edit: '编辑地址'
|
edit: '编辑地址',
|
||||||
|
disabledText: '以下地址超出配送范围'
|
||||||
},
|
},
|
||||||
'en-US': {
|
'en-US': {
|
||||||
list: [
|
list: [
|
||||||
@ -51,7 +56,9 @@ export default {
|
|||||||
name: 'Ned Stark',
|
name: 'Ned Stark',
|
||||||
tel: '1310000000',
|
tel: '1310000000',
|
||||||
address: 'Somewhere'
|
address: 'Somewhere'
|
||||||
},
|
}
|
||||||
|
],
|
||||||
|
disabledList: [
|
||||||
{
|
{
|
||||||
id: '3',
|
id: '3',
|
||||||
name: 'Tywin',
|
name: 'Tywin',
|
||||||
@ -60,7 +67,8 @@ export default {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
add: 'Add',
|
add: 'Add',
|
||||||
edit: 'Edit'
|
edit: 'Edit',
|
||||||
|
disabledText: 'The following address is out of range'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -74,6 +82,7 @@ export default {
|
|||||||
onAdd() {
|
onAdd() {
|
||||||
this.$toast(this.$t('add'));
|
this.$toast(this.$t('add'));
|
||||||
},
|
},
|
||||||
|
|
||||||
onEdit(item, index) {
|
onEdit(item, index) {
|
||||||
this.$toast(this.$t('edit') + ':' + index);
|
this.$toast(this.$t('edit') + ':' + index);
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,8 @@ Vue.use(AddressList);
|
|||||||
<van-address-list
|
<van-address-list
|
||||||
v-model="chosenAddressId"
|
v-model="chosenAddressId"
|
||||||
:list="list"
|
:list="list"
|
||||||
|
:disabled-list="disabledList"
|
||||||
|
disabled-text="The following address is out of range"
|
||||||
@add="onAdd"
|
@add="onAdd"
|
||||||
@edit="onEdit"
|
@edit="onEdit"
|
||||||
/>
|
/>
|
||||||
@ -38,6 +40,14 @@ export default {
|
|||||||
tel: '1310000000',
|
tel: '1310000000',
|
||||||
address: 'Somewhere'
|
address: 'Somewhere'
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
disabledList: [
|
||||||
|
{
|
||||||
|
id: '3',
|
||||||
|
name: 'Tywin',
|
||||||
|
tel: '1320000000',
|
||||||
|
address: 'Somewhere'
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -59,6 +69,8 @@ export default {
|
|||||||
|-----------|-----------|-----------|-------------|
|
|-----------|-----------|-----------|-------------|
|
||||||
| v-model | Id of chosen address | String | - |
|
| v-model | Id of chosen address | String | - |
|
||||||
| list | Address list | Array | `[]` |
|
| list | Address list | Array | `[]` |
|
||||||
|
| disabled-list | Disabled address list | `Array` | `[]` |
|
||||||
|
| disabled-text | Disabled text | `String` | - |
|
||||||
| add-button-text | Add button text | String | `Add new address` |
|
| add-button-text | Add button text | String | `Add new address` |
|
||||||
|
|
||||||
### Event
|
### Event
|
||||||
@ -66,8 +78,10 @@ export default {
|
|||||||
| Event | Description | Arguments |
|
| Event | Description | Arguments |
|
||||||
|-----------|-----------|-----------|
|
|-----------|-----------|-----------|
|
||||||
| add | Triggered when click add button | - |
|
| add | Triggered when click add button | - |
|
||||||
| edit | Triggered when click edit button | item: address object,index |
|
| edit | Triggered when edit address | item: address object,index |
|
||||||
| select | Triggered when select address | item: address object,index |
|
| select | Triggered when select address | item: address object,index |
|
||||||
|
| edit-disabled | Triggered when edit disabled address | item: address object,index |
|
||||||
|
| select-disabled | Triggered when select disabled address | item: address object,index |
|
||||||
|
|
||||||
### Address Data Structure
|
### Address Data Structure
|
||||||
|
|
||||||
|
@ -1,22 +1,28 @@
|
|||||||
<template>
|
<template>
|
||||||
<div :class="b()">
|
<div :class="b()">
|
||||||
<slot name="top" />
|
<slot name="top" />
|
||||||
<radio-group :value="value" :class="b('group')" @input="$emit('input', $event)">
|
<radio-group :value="value" @input="$emit('input', $event)">
|
||||||
<cell-group>
|
<cell-group>
|
||||||
<cell v-for="(item, index) in list" :key="item.id" is-link>
|
<address-item
|
||||||
<radio :name="item.id" @click="$emit('select', item, index)">
|
v-for="(item, index) in list"
|
||||||
<div :class="b('name')">{{ item.name }},{{ item.tel }}</div>
|
:data="item"
|
||||||
<div :class="b('address')">{{ $t('address') }}:{{ item.address }}</div>
|
:key="item.id"
|
||||||
</radio>
|
@select="$emit('select', item, index)"
|
||||||
<icon
|
@edit="$emit('edit', item, index)"
|
||||||
slot="right-icon"
|
/>
|
||||||
name="edit"
|
|
||||||
:class="b('edit')"
|
|
||||||
@click="$emit('edit', item, index)"
|
|
||||||
/>
|
|
||||||
</cell>
|
|
||||||
</cell-group>
|
</cell-group>
|
||||||
</radio-group>
|
</radio-group>
|
||||||
|
<div v-if="disabledText" :class="b('disabled-text')">{{ disabledText }}</div>
|
||||||
|
<cell-group v-if="disabledList.length">
|
||||||
|
<address-item
|
||||||
|
v-for="(item, index) in disabledList"
|
||||||
|
disabled
|
||||||
|
:data="item"
|
||||||
|
:key="item.id"
|
||||||
|
@select="$emit('select-disabled', item, index)"
|
||||||
|
@edit="$emit('edit-disabled', item, index)"
|
||||||
|
/>
|
||||||
|
</cell-group>
|
||||||
<slot />
|
<slot />
|
||||||
<van-button
|
<van-button
|
||||||
square
|
square
|
||||||
@ -31,25 +37,30 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import create from '../utils/create';
|
import create from '../utils/create';
|
||||||
import Radio from '../radio';
|
|
||||||
import RadioGroup from '../radio-group';
|
import RadioGroup from '../radio-group';
|
||||||
import VanButton from '../button';
|
import VanButton from '../button';
|
||||||
|
import AddressItem from './Item';
|
||||||
|
|
||||||
export default create({
|
export default create({
|
||||||
name: 'address-list',
|
name: 'address-list',
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
Radio,
|
|
||||||
RadioGroup,
|
RadioGroup,
|
||||||
VanButton
|
VanButton,
|
||||||
|
AddressItem
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
|
disabledText: String,
|
||||||
addButtonText: String,
|
addButtonText: String,
|
||||||
value: [String, Number],
|
value: [String, Number],
|
||||||
list: {
|
list: {
|
||||||
type: Array,
|
type: Array,
|
||||||
default: () => []
|
default: () => []
|
||||||
|
},
|
||||||
|
disabledList: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -4,38 +4,41 @@ exports[`renders demo correctly 1`] = `
|
|||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<div class="van-address-list">
|
<div class="van-address-list">
|
||||||
<div class="van-radio-group van-address-list__group">
|
<div class="van-radio-group">
|
||||||
<div class="van-cell-group van-hairline--top-bottom">
|
<div class="van-cell-group van-hairline--top-bottom">
|
||||||
<div class="van-cell van-cell--clickable van-hairline">
|
<div class="van-cell van-cell--clickable van-hairline van-address-item">
|
||||||
<!---->
|
<!---->
|
||||||
<!---->
|
<!---->
|
||||||
<div class="van-cell__value van-cell__value--alone">
|
<div class="van-cell__value van-cell__value--alone">
|
||||||
<div class="van-radio"><span class="van-radio__input"><input type="radio" value="1" checked="checked" class="van-radio__control"> <i class="van-icon van-icon-checked" style="color:undefined;font-size:undefined;"> <!----></i></span> <span class="van-radio__label"><div class="van-address-list__name">张三,13000000000</div> <div class="van-address-list__address">收货地址:浙江省杭州市西湖区文三路 138 号东方通信大厦 7 楼 501 室</div></span></div>
|
<div class="van-radio"><span class="van-radio__input"><input type="radio" value="1" checked="checked" class="van-radio__control"> <i class="van-icon van-icon-checked" style="color:undefined;font-size:undefined;"> <!----></i></span> <span class="van-radio__label"><div class="van-address-item__name">张三,13000000000</div> <div class="van-address-item__address">浙江省杭州市西湖区文三路 138 号东方通信大厦 7 楼 501 室</div></span></div>
|
||||||
</div>
|
</div>
|
||||||
<i class="van-icon van-icon-edit van-address-list__edit" style="color:undefined;font-size:undefined;">
|
<i class="van-icon van-icon-edit van-address-item__edit" style="color:undefined;font-size:undefined;">
|
||||||
<!---->
|
<!---->
|
||||||
</i>
|
</i>
|
||||||
</div>
|
</div>
|
||||||
<div class="van-cell van-cell--clickable van-hairline">
|
<div class="van-cell van-cell--clickable van-hairline van-address-item">
|
||||||
<!---->
|
<!---->
|
||||||
<!---->
|
<!---->
|
||||||
<div class="van-cell__value van-cell__value--alone">
|
<div class="van-cell__value van-cell__value--alone">
|
||||||
<div class="van-radio"><span class="van-radio__input"><input type="radio" value="2" class="van-radio__control"> <i class="van-icon van-icon-check" style="color:undefined;font-size:undefined;"> <!----></i></span> <span class="van-radio__label"><div class="van-address-list__name">李四,1310000000</div> <div class="van-address-list__address">收货地址:浙江省杭州市拱墅区莫干山路 50 号</div></span></div>
|
<div class="van-radio"><span class="van-radio__input"><input type="radio" value="2" class="van-radio__control"> <i class="van-icon van-icon-check" style="color:undefined;font-size:undefined;"> <!----></i></span> <span class="van-radio__label"><div class="van-address-item__name">李四,1310000000</div> <div class="van-address-item__address">浙江省杭州市拱墅区莫干山路 50 号</div></span></div>
|
||||||
</div>
|
</div>
|
||||||
<i class="van-icon van-icon-edit van-address-list__edit" style="color:undefined;font-size:undefined;">
|
<i class="van-icon van-icon-edit van-address-item__edit" style="color:undefined;font-size:undefined;">
|
||||||
<!---->
|
<!---->
|
||||||
</i>
|
</i>
|
||||||
</div>
|
</div>
|
||||||
<div class="van-cell van-cell--clickable van-hairline">
|
</div>
|
||||||
<!---->
|
</div>
|
||||||
<!---->
|
<div class="van-address-list__disabled-text">以下地址超出配送范围</div>
|
||||||
<div class="van-cell__value van-cell__value--alone">
|
<div class="van-cell-group van-hairline--top-bottom">
|
||||||
<div class="van-radio"><span class="van-radio__input"><input type="radio" value="3" class="van-radio__control"> <i class="van-icon van-icon-check" style="color:undefined;font-size:undefined;"> <!----></i></span> <span class="van-radio__label"><div class="van-address-list__name">王五,1320000000</div> <div class="van-address-list__address">收货地址:浙江省杭州市滨江区江南大道 15 号</div></span></div>
|
<div class="van-cell van-hairline van-address-item van-address-item--disabled">
|
||||||
</div>
|
<!---->
|
||||||
<i class="van-icon van-icon-edit van-address-list__edit" style="color:undefined;font-size:undefined;">
|
<!---->
|
||||||
<!---->
|
<div class="van-cell__value van-cell__value--alone">
|
||||||
</i>
|
<div class="van-radio"><span class="van-radio__input"><input type="radio" value="3" class="van-radio__control"> <i class="van-icon van-icon-check" style="color:undefined;font-size:undefined;"> <!----></i></span> <span class="van-radio__label"><div class="van-address-item__name">王五,1320000000</div> <div class="van-address-item__address">浙江省杭州市滨江区江南大道 15 号</div></span></div>
|
||||||
</div>
|
</div>
|
||||||
|
<i class="van-icon van-icon-edit van-address-item__edit" style="color:undefined;font-size:undefined;">
|
||||||
|
<!---->
|
||||||
|
</i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button class="van-button van-button--danger van-button--large van-button--square van-address-list__add">
|
<button class="van-button van-button--danger van-button--large van-button--square van-address-list__add">
|
||||||
|
@ -15,6 +15,8 @@ Vue.use(AddressList);
|
|||||||
<van-address-list
|
<van-address-list
|
||||||
v-model="chosenAddressId"
|
v-model="chosenAddressId"
|
||||||
:list="list"
|
:list="list"
|
||||||
|
:disabled-list="disabledList"
|
||||||
|
disabled-text="以下地址超出配送范围"
|
||||||
@add="onAdd"
|
@add="onAdd"
|
||||||
@edit="onEdit"
|
@edit="onEdit"
|
||||||
/>
|
/>
|
||||||
@ -38,6 +40,14 @@ export default {
|
|||||||
tel: '1310000000',
|
tel: '1310000000',
|
||||||
address: '浙江省杭州市拱墅区莫干山路 50 号'
|
address: '浙江省杭州市拱墅区莫干山路 50 号'
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
disabledList: [
|
||||||
|
{
|
||||||
|
id: '3',
|
||||||
|
name: '王五',
|
||||||
|
tel: '1320000000',
|
||||||
|
address: '浙江省杭州市滨江区江南大道 15 号'
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -46,6 +56,7 @@ export default {
|
|||||||
onAdd() {
|
onAdd() {
|
||||||
Toast('新增地址');
|
Toast('新增地址');
|
||||||
},
|
},
|
||||||
|
|
||||||
onEdit(item, index) {
|
onEdit(item, index) {
|
||||||
Toast('编辑地址:' + index);
|
Toast('编辑地址:' + index);
|
||||||
}
|
}
|
||||||
@ -58,17 +69,21 @@ export default {
|
|||||||
|
|
||||||
| 参数 | 说明 | 类型 | 默认值 |
|
| 参数 | 说明 | 类型 | 默认值 |
|
||||||
|-----------|-----------|-----------|-------------|
|
|-----------|-----------|-----------|-------------|
|
||||||
| v-model | 当前选中地址的 id | String | - |
|
| v-model | 当前选中地址的 id | `String` | - |
|
||||||
| list | 地址列表 | Array | `[]` |
|
| list | 地址列表 | `Array` | `[]` |
|
||||||
| add-button-text | 底部按钮文字 | String | `新增地址` |
|
| disabled-list | 不可配送地址列表 | `Array` | `[]` |
|
||||||
|
| disabled-text | 不可配送提示文案 | `String` | - |
|
||||||
|
| add-button-text | 底部按钮文字 | `String` | `新增地址` |
|
||||||
|
|
||||||
### Event
|
### Event
|
||||||
|
|
||||||
| 事件名 | 说明 | 参数 |
|
| 事件名 | 说明 | 参数 |
|
||||||
|-----------|-----------|-----------|
|
|-----------|-----------|-----------|
|
||||||
| add | 点击新增按钮时触发 | - |
|
| add | 点击新增按钮时触发 | - |
|
||||||
| edit | 点击编辑按钮时触发 | item: 当前地址对象,index: 索引 |
|
| edit | 点击编辑按钮时触发 | item: 地址对象,index: 索引 |
|
||||||
| select | 切换选中的地址时触发 | item: 当前地址对象,index: 索引 |
|
| select | 切换选中的地址时触发 | item: 地址对象,index: 索引 |
|
||||||
|
| edit-disabled | 编辑不可配送的地址时触发 | item: 地址对象,index: 索引 |
|
||||||
|
| select-disabled | 选中不可配送的地址时触发 | item: 地址对象,index: 索引 |
|
||||||
|
|
||||||
### 数据格式
|
### 数据格式
|
||||||
|
|
||||||
|
@ -63,7 +63,6 @@ export default {
|
|||||||
placeholder: 'Address'
|
placeholder: 'Address'
|
||||||
},
|
},
|
||||||
vanAddressList: {
|
vanAddressList: {
|
||||||
address: 'Address',
|
|
||||||
add: 'Add new address'
|
add: 'Add new address'
|
||||||
},
|
},
|
||||||
vanSku: {
|
vanSku: {
|
||||||
|
@ -63,7 +63,6 @@ export default {
|
|||||||
placeholder: '街道门牌、楼层房间号等信息'
|
placeholder: '街道门牌、楼层房间号等信息'
|
||||||
},
|
},
|
||||||
vanAddressList: {
|
vanAddressList: {
|
||||||
address: '收货地址',
|
|
||||||
add: '新增地址'
|
add: '新增地址'
|
||||||
},
|
},
|
||||||
vanSku: {
|
vanSku: {
|
||||||
|
@ -63,7 +63,6 @@ export default {
|
|||||||
placeholder: '街道門牌、樓層房間號等信息'
|
placeholder: '街道門牌、樓層房間號等信息'
|
||||||
},
|
},
|
||||||
vanAddressList: {
|
vanAddressList: {
|
||||||
address: '收貨地址',
|
|
||||||
add: '新增地址'
|
add: '新增地址'
|
||||||
},
|
},
|
||||||
vanSku: {
|
vanSku: {
|
||||||
|
@ -5,10 +5,24 @@
|
|||||||
padding-bottom: 100px;
|
padding-bottom: 100px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
|
||||||
.van-cell {
|
&__add {
|
||||||
padding: 15px;
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
z-index: 9999;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&__disabled-text {
|
||||||
|
color: $gray-dark;
|
||||||
|
padding: 0 15px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 30px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.van-address-item {
|
||||||
|
padding: 15px;
|
||||||
|
|
||||||
.van-cell__value {
|
.van-cell__value {
|
||||||
color: $text-color;
|
color: $text-color;
|
||||||
padding-right: 34px;
|
padding-right: 34px;
|
||||||
@ -16,6 +30,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.van-radio__label {
|
.van-radio__label {
|
||||||
|
width: 100%;
|
||||||
margin-left: 27px;
|
margin-left: 27px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,14 +46,6 @@
|
|||||||
color: $red;
|
color: $red;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__group {
|
|
||||||
height: 100%;
|
|
||||||
overflow-y: scroll;
|
|
||||||
padding-bottom: 100px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
-webkit-overflow-scrolling: touch;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__name {
|
&__name {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
@ -52,6 +59,21 @@
|
|||||||
color: $gray-darker;
|
color: $gray-darker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&--disabled {
|
||||||
|
.van-address-item__name,
|
||||||
|
.van-address-item__address {
|
||||||
|
color: $gray-dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
.van-radio__input {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.van-radio__label {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
&__edit {
|
&__edit {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
@ -59,11 +81,4 @@
|
|||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
transform: translate(0, -50%);
|
transform: translate(0, -50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
&__add {
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
z-index: 9999;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user