mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-04-06 03:57:59 +08:00
[bugfix] AddressEdit: area code observer (#680)
This commit is contained in:
parent
2d441c5e86
commit
0b7468f596
@ -17,7 +17,12 @@
|
|||||||
:error="errorInfo.tel"
|
:error="errorInfo.tel"
|
||||||
@focus="onFocus('tel')"
|
@focus="onFocus('tel')"
|
||||||
/>
|
/>
|
||||||
<cell class="van-address-edit__area" :title="$t('areaTitle')" @click="showAreaSelect = true">
|
<cell
|
||||||
|
clickable
|
||||||
|
class="van-address-edit__area"
|
||||||
|
:title="$t('areaTitle')"
|
||||||
|
@click="showAreaSelect = true"
|
||||||
|
>
|
||||||
<span>{{ currentInfo.province || $t('placeholder.province') }}</span>
|
<span>{{ currentInfo.province || $t('placeholder.province') }}</span>
|
||||||
<span>{{ currentInfo.city || $t('placeholder.city') }}</span>
|
<span>{{ currentInfo.city || $t('placeholder.city') }}</span>
|
||||||
<span>{{ currentInfo.county || $t('placeholder.county') }}</span>
|
<span>{{ currentInfo.county || $t('placeholder.county') }}</span>
|
||||||
@ -63,6 +68,7 @@
|
|||||||
<popup v-model="showAreaSelect" position="bottom">
|
<popup v-model="showAreaSelect" position="bottom">
|
||||||
<van-area
|
<van-area
|
||||||
ref="area"
|
ref="area"
|
||||||
|
:loading="!areaListLoaded"
|
||||||
:value="currentInfo.area_code"
|
:value="currentInfo.area_code"
|
||||||
:area-list="areaList"
|
:area-list="areaList"
|
||||||
@confirm="onAreaConfirm"
|
@confirm="onAreaConfirm"
|
||||||
@ -74,7 +80,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
/* eslint-disable camelcase */
|
/* eslint-disable camelcase */
|
||||||
import { create } from '../utils';
|
import { create, isObj } from '../utils';
|
||||||
import Field from '../field';
|
import Field from '../field';
|
||||||
import Cell from '../cell';
|
import Cell from '../cell';
|
||||||
import CellGroup from '../cell-group';
|
import CellGroup from '../cell-group';
|
||||||
@ -87,6 +93,18 @@ import AddressEditDetail from './Detail';
|
|||||||
import SwitchCell from '../switch-cell';
|
import SwitchCell from '../switch-cell';
|
||||||
import validateMobile from '../utils/validate/mobile';
|
import validateMobile from '../utils/validate/mobile';
|
||||||
|
|
||||||
|
const defaultAddress = {
|
||||||
|
name: '',
|
||||||
|
tel: '',
|
||||||
|
province: '',
|
||||||
|
city: '',
|
||||||
|
county: '',
|
||||||
|
area_code: '',
|
||||||
|
postal_code: '',
|
||||||
|
address_detail: '',
|
||||||
|
is_default: false
|
||||||
|
};
|
||||||
|
|
||||||
export default create({
|
export default create({
|
||||||
name: 'van-address-edit',
|
name: 'van-address-edit',
|
||||||
|
|
||||||
@ -111,17 +129,7 @@ export default create({
|
|||||||
addressText: String,
|
addressText: String,
|
||||||
addressInfo: {
|
addressInfo: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => ({
|
default: () => ({ ...defaultAddress })
|
||||||
name: '',
|
|
||||||
tel: '',
|
|
||||||
province: '',
|
|
||||||
city: '',
|
|
||||||
county: '',
|
|
||||||
area_code: '',
|
|
||||||
postal_code: '',
|
|
||||||
address_detail: '',
|
|
||||||
is_default: false
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
searchResult: {
|
searchResult: {
|
||||||
type: Array,
|
type: Array,
|
||||||
@ -136,7 +144,10 @@ export default create({
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
showAreaSelect: false,
|
showAreaSelect: false,
|
||||||
currentInfo: this.addressInfo,
|
currentInfo: {
|
||||||
|
...defaultAddress,
|
||||||
|
...this.addressInfo
|
||||||
|
},
|
||||||
isEdit: !!this.addressInfo.id,
|
isEdit: !!this.addressInfo.id,
|
||||||
detailFocused: false,
|
detailFocused: false,
|
||||||
errorInfo: {
|
errorInfo: {
|
||||||
@ -151,10 +162,23 @@ export default create({
|
|||||||
watch: {
|
watch: {
|
||||||
addressInfo: {
|
addressInfo: {
|
||||||
handler(val) {
|
handler(val) {
|
||||||
this.currentInfo = val;
|
this.currentInfo = {
|
||||||
|
...defaultAddress,
|
||||||
|
...val
|
||||||
|
};
|
||||||
this.isEdit = !!val.id;
|
this.isEdit = !!val.id;
|
||||||
|
|
||||||
|
if (val.area_code) {
|
||||||
|
this.setAreaCode(val.area_code);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
deep: true
|
deep: true
|
||||||
|
},
|
||||||
|
|
||||||
|
areaList() {
|
||||||
|
if (this.currentInfo.area_code) {
|
||||||
|
this.setAreaCode(this.currentInfo.area_code);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -166,6 +190,10 @@ export default create({
|
|||||||
|
|
||||||
computedAddressText() {
|
computedAddressText() {
|
||||||
return this.addressText || this.$t('addressText');
|
return this.addressText || this.$t('addressText');
|
||||||
|
},
|
||||||
|
|
||||||
|
areaListLoaded() {
|
||||||
|
return isObj(this.areaList) && Object.keys(this.areaList).length;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -99,42 +99,42 @@ describe('AddressEdit', () => {
|
|||||||
const saveButton = wrapper.find('.van-button')[0];
|
const saveButton = wrapper.find('.van-button')[0];
|
||||||
|
|
||||||
// name empty
|
// name empty
|
||||||
wrapper.vm.addressInfo.name = '';
|
wrapper.vm.currentInfo.name = '';
|
||||||
saveButton.trigger('click');
|
saveButton.trigger('click');
|
||||||
expect(wrapper.vm.errorInfo['name']).to.be.true;
|
expect(wrapper.vm.errorInfo['name']).to.be.true;
|
||||||
wrapper.find('.van-field__control')[0].trigger('focus');
|
wrapper.find('.van-field__control')[0].trigger('focus');
|
||||||
expect(wrapper.vm.errorInfo['name']).to.be.false;
|
expect(wrapper.vm.errorInfo['name']).to.be.false;
|
||||||
|
|
||||||
// name too long
|
// name too long
|
||||||
wrapper.vm.addressInfo.name = '111111111111111111111111111';
|
wrapper.vm.currentInfo.name = '111111111111111111111111111';
|
||||||
saveButton.trigger('click');
|
saveButton.trigger('click');
|
||||||
expect(wrapper.vm.errorInfo['name']).to.be.true;
|
expect(wrapper.vm.errorInfo['name']).to.be.true;
|
||||||
wrapper.find('.van-field__control')[0].trigger('focus');
|
wrapper.find('.van-field__control')[0].trigger('focus');
|
||||||
expect(wrapper.vm.errorInfo['name']).to.be.false;
|
expect(wrapper.vm.errorInfo['name']).to.be.false;
|
||||||
|
|
||||||
// tel empty
|
// tel empty
|
||||||
wrapper.vm.addressInfo.name = '123';
|
wrapper.vm.currentInfo.name = '123';
|
||||||
wrapper.vm.addressInfo.tel = '';
|
wrapper.vm.currentInfo.tel = '';
|
||||||
saveButton.trigger('click');
|
saveButton.trigger('click');
|
||||||
expect(wrapper.vm.errorInfo['tel']).to.be.true;
|
expect(wrapper.vm.errorInfo['tel']).to.be.true;
|
||||||
wrapper.find('.van-field__control')[1].trigger('focus');
|
wrapper.find('.van-field__control')[1].trigger('focus');
|
||||||
expect(wrapper.vm.errorInfo['tel']).to.be.false;
|
expect(wrapper.vm.errorInfo['tel']).to.be.false;
|
||||||
|
|
||||||
// area_code empty
|
// area_code empty
|
||||||
wrapper.vm.addressInfo.tel = '13000000000';
|
wrapper.vm.currentInfo.tel = '13000000000';
|
||||||
wrapper.vm.addressInfo.area_code = '';
|
wrapper.vm.currentInfo.area_code = '';
|
||||||
saveButton.trigger('click');
|
saveButton.trigger('click');
|
||||||
expect(wrapper.vm.errorInfo['area_code']).to.be.true;
|
expect(wrapper.vm.errorInfo['area_code']).to.be.true;
|
||||||
|
|
||||||
// area_code invalid
|
// area_code invalid
|
||||||
wrapper.vm.addressInfo.tel = '13000000000';
|
wrapper.vm.currentInfo.tel = '13000000000';
|
||||||
wrapper.vm.addressInfo.area_code = '-1';
|
wrapper.vm.currentInfo.area_code = '-1';
|
||||||
saveButton.trigger('click');
|
saveButton.trigger('click');
|
||||||
expect(wrapper.vm.errorInfo['area_code']).to.be.true;
|
expect(wrapper.vm.errorInfo['area_code']).to.be.true;
|
||||||
|
|
||||||
// address_detail empty
|
// address_detail empty
|
||||||
wrapper.vm.addressInfo.area_code = '100000';
|
wrapper.vm.currentInfo.area_code = '100000';
|
||||||
wrapper.vm.addressInfo.address_detail = '';
|
wrapper.vm.currentInfo.address_detail = '';
|
||||||
saveButton.trigger('click');
|
saveButton.trigger('click');
|
||||||
expect(wrapper.vm.errorInfo['address_detail']).to.be.true;
|
expect(wrapper.vm.errorInfo['address_detail']).to.be.true;
|
||||||
wrapper.find('.van-field__control')[2].trigger('focus');
|
wrapper.find('.van-field__control')[2].trigger('focus');
|
||||||
@ -145,26 +145,26 @@ describe('AddressEdit', () => {
|
|||||||
for (let i = 0; i < 300; i++) {
|
for (let i = 0; i < 300; i++) {
|
||||||
longAddress += '1';
|
longAddress += '1';
|
||||||
}
|
}
|
||||||
wrapper.vm.addressInfo.address_detail = longAddress;
|
wrapper.vm.currentInfo.address_detail = longAddress;
|
||||||
saveButton.trigger('click');
|
saveButton.trigger('click');
|
||||||
expect(wrapper.vm.errorInfo['address_detail']).to.be.true;
|
expect(wrapper.vm.errorInfo['address_detail']).to.be.true;
|
||||||
wrapper.find('.van-field__control')[2].trigger('focus');
|
wrapper.find('.van-field__control')[2].trigger('focus');
|
||||||
expect(wrapper.vm.errorInfo['address_detail']).to.be.false;
|
expect(wrapper.vm.errorInfo['address_detail']).to.be.false;
|
||||||
|
|
||||||
// postal_code invalid
|
// postal_code invalid
|
||||||
wrapper.vm.addressInfo.address_detail = '123';
|
wrapper.vm.currentInfo.address_detail = '123';
|
||||||
wrapper.vm.addressInfo.postal_code = '123';
|
wrapper.vm.currentInfo.postal_code = '123';
|
||||||
saveButton.trigger('click');
|
saveButton.trigger('click');
|
||||||
expect(wrapper.vm.errorInfo['postal_code']).to.be.true;
|
expect(wrapper.vm.errorInfo['postal_code']).to.be.true;
|
||||||
wrapper.find('.van-field__control')[3].trigger('focus');
|
wrapper.find('.van-field__control')[3].trigger('focus');
|
||||||
expect(wrapper.vm.errorInfo['postal_code']).to.be.false;
|
expect(wrapper.vm.errorInfo['postal_code']).to.be.false;
|
||||||
|
|
||||||
// valid result
|
// valid result
|
||||||
wrapper.vm.addressInfo.postal_code = '123456';
|
wrapper.vm.currentInfo.postal_code = '123456';
|
||||||
saveButton.trigger('click');
|
saveButton.trigger('click');
|
||||||
|
|
||||||
// not show postal_code
|
// not show postal_code
|
||||||
wrapper.vm.addressInfo.postal_code = '156';
|
wrapper.vm.currentInfo.postal_code = '156';
|
||||||
wrapper.vm.showPostal = false;
|
wrapper.vm.showPostal = false;
|
||||||
saveButton.trigger('click');
|
saveButton.trigger('click');
|
||||||
expect(wrapper.vm.errorInfo['postal_code']).to.be.false;
|
expect(wrapper.vm.errorInfo['postal_code']).to.be.false;
|
||||||
@ -235,17 +235,17 @@ describe('AddressEdit', () => {
|
|||||||
wrapper.vm.onAreaConfirm([{ code: -1 }]);
|
wrapper.vm.onAreaConfirm([{ code: -1 }]);
|
||||||
wrapper.vm.onAreaConfirm([{ code: 1 }, { code: -1 }]);
|
wrapper.vm.onAreaConfirm([{ code: 1 }, { code: -1 }]);
|
||||||
wrapper.vm.onAreaConfirm([{ code: 1 }, { code: 1 }, { code: -1 }]);
|
wrapper.vm.onAreaConfirm([{ code: 1 }, { code: 1 }, { code: -1 }]);
|
||||||
expect(wrapper.vm.addressInfo['area_code']).to.equal(undefined);
|
expect(wrapper.vm.currentInfo['area_code']).to.equal('');
|
||||||
|
|
||||||
wrapper.vm.onAreaConfirm([
|
wrapper.vm.onAreaConfirm([
|
||||||
{ name: '浙江省' },
|
{ name: '浙江省' },
|
||||||
{ name: '杭州市' },
|
{ name: '杭州市' },
|
||||||
{ name: '西湖区', code: '123456' }
|
{ name: '西湖区', code: '123456' }
|
||||||
]);
|
]);
|
||||||
expect(wrapper.vm.addressInfo['province']).to.equal('浙江省');
|
expect(wrapper.vm.currentInfo['province']).to.equal('浙江省');
|
||||||
expect(wrapper.vm.addressInfo['city']).to.equal('杭州市');
|
expect(wrapper.vm.currentInfo['city']).to.equal('杭州市');
|
||||||
expect(wrapper.vm.addressInfo['county']).to.equal('西湖区');
|
expect(wrapper.vm.currentInfo['county']).to.equal('西湖区');
|
||||||
expect(wrapper.vm.addressInfo['area_code']).to.equal('123456');
|
expect(wrapper.vm.currentInfo['area_code']).to.equal('123456');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('delete address', done => {
|
it('delete address', done => {
|
||||||
@ -308,7 +308,7 @@ describe('AddressEdit', () => {
|
|||||||
wrapper.vm.$nextTick(() => {
|
wrapper.vm.$nextTick(() => {
|
||||||
wrapper.find('.van-field__icon')[0].trigger('touchstart');
|
wrapper.find('.van-field__icon')[0].trigger('touchstart');
|
||||||
wrapper.vm.$nextTick(() => {
|
wrapper.vm.$nextTick(() => {
|
||||||
expect(wrapper.vm.addressInfo.address_detail).to.equal('');
|
expect(wrapper.vm.currentInfo.address_detail).to.equal('');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -388,4 +388,36 @@ describe('AddressEdit', () => {
|
|||||||
done();
|
done();
|
||||||
}, 50);
|
}, 50);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('watch area code', done => {
|
||||||
|
wrapper = mount(AddressEdit, {
|
||||||
|
propsData: {
|
||||||
|
areaList: {},
|
||||||
|
addressInfo: {
|
||||||
|
area_code: '330304'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(wrapper.vm.currentInfo.city).to.equal('');
|
||||||
|
wrapper.vm.areaList = areaList;
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
expect(wrapper.vm.currentInfo.city).to.equal('温州市');
|
||||||
|
|
||||||
|
wrapper.vm.addressInfo = { area_code: '' };
|
||||||
|
wrapper.vm.areaList = {};
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
expect(wrapper.vm.currentInfo.city).to.equal('');
|
||||||
|
wrapper.vm.areaList = areaList;
|
||||||
|
wrapper.vm.addressInfo = { area_code: '330304' };
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
expect(wrapper.vm.currentInfo.city).to.equal('温州市');
|
||||||
|
done();
|
||||||
|
}, 50);
|
||||||
|
});
|
||||||
|
}, 50);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user