Выбор адреса часто используется в некоторых проектах, особенно когда некоторым онлайн-торговым центрам необходимо указать адрес доставки, чаще всего используются три раскрывающихся списка провинций и городов. И вот однажды, когда мне понадобился адрес доставки в маленьком проекте, я вдруг обнаружил, что вроде бы нет готовой библиотеки (чтобы можно было напрямуюnpm install xxx
), чтобы использовать 😰, а затем поискал на github и действительно обнаружил, что есть формат jsonНеобработанные данные,но структура на том же уровне,трудно отличить провинция это город или район.Хотя автор и предоставляет плагин jquery,он ведь используется на мобиле,и он лучше всего работать напрямую через js (это также можно использовать на сервере nodejs). Поэтому я решил переформатировать исходные данные во вложенный формат провинций и муниципалитетов, чтобы было легко через ID провинции получить список городов, а потом через ID города получить список районов. структура, которую хочет выпадающее меню.
Настройки структуры
Окончательная желаемая структура выглядит следующим образом:
{
"320000": {
"code": "320000",
"name": "江苏省",
"cities": {
"320100": {
"code": "320100",
"name": "南京市",
"districts": {
"320102": "玄武区",
"320104": "秦淮区",
//...
}
}
//...
}
}
//...
}
Мы используем первые 2 цифры кода для определения провинции, средние 2 цифры для определения города и последние 2 цифры для определения района, поэтому, если первые две цифры совпадают, это означает, что они принадлежат к одна и та же провинция, и средние 2 цифры одинаковы.Для одного и того же города и т. д. следует отметить, что для муниципалитетов, находящихся в непосредственном подчинении центрального правительства, таких как Шанхай и Пекин, провинция и город являются Шанхаем, код город 00, а город всего один, средние 2 кода следующих районов оба 01, тут Будьте внимательны при передаче данных.
Используйте библиотеку china-location
На основе вышеописанной логики пишется простой конверсионный js, и предоставляется простой API для вызова напрямую наружу 🍺. Сначала установите библиотекуchina-location:
npm install china-location --save
или
yarn add china-location
Затем внутри JS
//跟库一起绑定转换好的数据
import list from 'china-location/dist/location.json'
//in node.js
//const list = require('china-location/dist/location.json');
//ES6 import
import ChinaLocation from 'china-location';
//提供获取地址,修改地址API的类
//in node.js
//const ChinaLocation = require('china-location');
//初始化实例,并传入json数据
const location = new ChinaLocation(list);
//获取初始时当前地址包括code及中文名
//{
// province: {code: '110000', name: '北京市'},
// city: {code: '110000', name: '北京市'},
// district: {code: '110101', name: '东城区'}
//}
const defaultLocation = location.getCurrentAddress();
//修改地址
const newProvince = '320000';
const newCity = '320500';
const newDistrict = '320509';
//一般使用联动下拉框,获取选中的code来更新地址,获得下一级的数据
location.changeProvince(newProvince);
location.changeCity(newCity);
location.changeDistrict(newDistrict);
//也可以一次性都修改
location.changeLocation(newProvince, newCity, newDistrict);
//{
// province: {code: '320000', name: '江苏省'},
// city: {code: '320500', name: '苏州市'},
// district: {code: '320509', name: '吴江区'}
//}
//获取更新后的地址信息
const newLocation = location.getCurrentAddress();
API очень прост, инициализируйте, затем измените текущий адрес и, наконец, получите текущий адрес. С такой библиотекой мы можем легко выполнять логику, связанную с адресами, на странице браузера или на стороне node.js 🎉.
Используйте адресные данные, созданные самостоятельно
china-location
Упакованные данные могут быть не самыми последними, но исходные данные могли быть обновлены.Чтобы не повторять релизную версию, также можно использовать самые свежие данные.china-location
Также предоставляется простой скрипт npm для преобразования локально настроенных необработанных данных, а затемnew ChinaLocation(latestData)
При инициализации передайте данные json, которые вы преобразовали вручную.
Первый клонРепозиторий необработанных данных: mumuy/data_location, или сразу положить внутрьlist.json
Сохраните его, затем git clonechina-location:
git clone git@github.com:JasonBoy/china-location.git
cd china-location
Используйте после входа в корневой каталог chian-locationreformat
скрипт для конвертации:
npm run reformat -- /path/to/data_location/list.json
--
Следующий параметр представляет собой локальный путь к исходным данным, которые будут выводиться вdist
каталог, внутриlocation.json
а такжеlocation.min.json
, а затем скопируйте его непосредственно в импорт вашего проекта и передайте его вnew ChinaLocation(data)
Конструктор готов использовать последние данные.
Простой компонент React
Вышеупомянутое использование чистого JS.Конечно, если мы используем некоторые UI-библиотеки для разработки, такие как React, я также написал простой компонент Reactreact-china-location, Все стили являются собственными стилями раскрывающегося списка HTML, здесь используется только демонстрационное использование, вы можете создавать компоненты, которые соответствуют требованиям пользовательского интерфейса проекта в соответствии с этой логикой:
существуетreact-china-location
внутриchina-location
размещенpeerDependences
в, такchina-location
Его также необходимо установить отдельно:
npm install china-location react-china-location --save
Затем в вашем JSX:
import locationData from 'china-location/dist/location.json';
import ChinaLocation from 'react-china-location';
class App extends React.Component {
constructor (props) {
super(props);
this.onLocationChange = this.onLocationChange.bind(this);
this.state = {
currentLocation: {},
}
}
onLocationChange (newLocation) {
//{
// province: {code: '110000', name: '北京市'},
// city: {code: '110000', name: '北京市'},
// district: {code: '110101', name: '东城区'}
//}
console.log(newLocation);
//更新到state
this.setState({
currentLocation: newLocation,
});
}
render () {
<div>
<ChinaLocation list={locationData} onLocationChange={this.onLocationChange}/>
</div>
}
}
<ChinaLocation>
в компонентеlist
prop — это преобразованные данные json, аonLocationChange
Обратный вызов — это обратный вызов, когда пользователь выбирает другую провинцию или город, последние данные о местоположении будут переданы, а затем setState может быть обновлен для других пользовательских интерфейсов на странице.
В заключение
Надеюсь, это простоchina-locationБиблиотека может принести удобство другим небольшим партнерам, когда они используют адресную логику в проекте, чтобы ее можно было использовать «из коробки», не тратя время и не переписывая ее вручную, а уделяя больше времени собственной бизнес-логике.