前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【react】开发一款城市选择组件

【react】开发一款城市选择组件

作者头像
糊糊糊糊糊了
发布于 2018-07-04 04:44:30
发布于 2018-07-04 04:44:30
4K00
代码可运行
举报
文章被收录于专栏:糊一笑糊一笑
运行总次数:0
代码可运行

想到做这个,是因为无意中在github上看到了这一个仓库https://github.com/lunlunshiwo/ChooseCity,做的就是一个城市选择控件,是用vue写的,说的是阿里的一道题目,然后想想自己闲着也是闲着,就动手用react又重新做了一遍。

演示

地址:城市选择控件

github: https://github.com/Rynxiao/city-selector

整体效果如下:

运行

运行需知:首先去百度开放云平台申请自己的AK,申请方法见下面的定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# dev
npm install
npm start

# deploy
npm run build
npm install http-server -g
http-server ./build -p 38083 -s -P http://www.msece.com
localhost:38083

# test
npm run test

要求

  • 可定位到当前所在城市,可支持传城市
  • 下次打开优先选取上次定位城市,如本次定位和上次不一样,则取本地城市,同时展示最近选择的城市,最近选择的城市可配
  • 城市列表按字母分组,如B组:北京、包头,同时左侧带A-Z导航符条,点击对应字母定位至对应的组位置,如点击C则定位至C组,同时弹出提示为C
  • 支持城市搜索,页头带搜索框,可支持联想功能,注意性能
  • 选择对应城市,会将对应城市数据带回给使用页面
  • 支持单个页面上同时存在多个城市组件
  • 页面用flex布局(css)

说明

个人采用的路由形式,因此没有做成一个具体的组件(要组件化也就是把state换成props传值即可),但是在整个页面中做了很小单元的拆分。另外“上次定位”的功能暂时未完善,容之后补上。

技术栈

采用的是react官网提供的脚手架create-react-app,因此整体技术是react,采用webpack进行打包构建,jest测试。同时在此基础上新增了一些东西。

sass

脚手架最开始不支持sass,开启sass需要如下配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 安装依赖包
npm install --save node-sass-chokidar
npm install --save npm-run-all

# 脚本中增加build-css与watch-css
# 修改start和build命令,让其可以同时运行多个命令
"scripts": {
+    "build-css": "node-sass-chokidar --include-path ./src --include-path ./node_modules src/ -o src/",
+    "watch-css": "npm run build-css && node-sass-chokidar --include-path ./src --include-path ./node_modules src/ -o src/ --watch --recursive",
     "test": "react-scripts test --env=jsdom",
-    "start": "react-scripts start",
-    "build": "react-scripts build",
+    "start-js": "react-scripts start",
+    "start": "npm-run-all -p watch-css start-js",
+    "build-js": "react-scripts build",
+    "build": "npm-run-all build-css build-js"
}

# .gitignore中去除生成的css文件
src/**/*.css

react-router

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install --save react-router-dom

安装依赖之后,增加了一个全局入口,在src/container/index.js中,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Switch>
    <Route exact path="/" component={ App } />
    <Route path="/city" component={ City } />
</Switch>

增加两个页面,路由分别如上配置。

定位

需要定位到当前城市,采用的是百度地图的定位,需要首先去百度地图开放平台上申请一个秘钥,地址在这里http://lbsyun.baidu.com/apiconsole/key,进去之后查看js文档,这里不再赘述,可以自己去了解。

  • src/public/index.html中加入百度开放平台提供的脚本链接,填上自己的秘钥。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=your_ak"></script>
  • src/services/locationServices.js中加入定位代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function getLocalCity() {
    return new Promise(resolve => {
        var myCity = new window.BMap.LocalCity();
        myCity.get(result => {
            resolve(result.name);
        });
    }); 
}

获取城市数据

获取城市的接口API,历经千辛万苦终于在网上找到了一个能用的【这个接口有可能随时会挂哟???】,但是数据格式可能不太满意,只能自己转化。如果不想用这个格式,你也可以自己起一个后台服务器,然后输出你自己喜欢的格式,这里我算是偷懒了。

之前的格式是按照省份区分的:

格式化之后的格式是按照拼音字母来区分的:

设置代理

因为请求的地址域名不一致,肯定会有跨域问题,这里在package.json中设置了代理,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"proxy": "http://www.msece.com"

获取城市

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// src/services/cityServices.js
async function getAllCities() {
    const json = await axios.get(CITY_API);
    return formatCites(json);
}

UI

UI方面自己没有什么创意,所以使用了阿里的antd-mobile,可以去这里看:antd-mobile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 安装依赖
npm install antd-mobile --save

// 按需加载
// 1. 安装依赖
npm install react-app-rewired --save-dev
npm install babel-plugin-import --save-dev

// 2. 在package.json中,将script中的 react-scripts 换成 react-app-rewired

// 3. 在根目录下建立config-overrides.js,内容如下:
const { injectBabelPlugin } = require('react-app-rewired');

module.exports = function override(config, env) {
    config = injectBabelPlugin(['import', { libraryName: 'antd-mobile', style: 'css' }], config);
    return config;
};

// 4. 更改引入方式
// before
import Button from 'antd-mobile/lib/button';
// after
import { Button } from 'antd-mobile';

coding

进行了组件的拆分,主要为:

  • 头部
  • 搜索区域
  • 需要定位的城市区域(分为最近城市和热门城市)
  • 列表区域
  • 右侧导航区域
  • 搜索弹层区域

具体可以参看src/components/city下的组件

最近选择城市

采用的是本地localstorage进行存储,默认最多存储两个,后选择的城市会替换掉第一个,如果选择的城市中有相同的,则不进行替换。页面公用本地存储,若不想公用,可以在之后区分id即可。

热门城市

热门城市是自己预先定义的,如果不希望预先定义,也可以参照某些API,这里算是偷懒。

导航条滑动

之前的写过一篇文章移动端效果之IndexList,具体实现可以参看。

搜索联动

支持中/英文搜索,中文搜索是进行了全数据遍历,英文搜索是进行了首字符判断,然后再进行子集遍历。在搜索方面,使用了函数节流,如果在1秒中之内还没有输入完成,则必须进行一次搜索。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// src/utils/index.js
function throttle(fn, wait = 500, period = 1000) {
    let startTime = new Date().getTime();
    let timeout;
    return (...args) => {
        return new Promise(resolve => {
            const now = new Date().getTime();
            if (now - startTime >= period) {
                startTime = now;
                resolve(fn.apply(null, args));
            } else {
                timeout && clearTimeout(timeout);
                timeout = setTimeout(() => {
                    resolve(fn.apply(null, args));
                }, wait);
            }
        }); 
    }
}

// src/pages/city/City.js
const searchCity = throttle(searchCityByName);

onSearchInput = async value => {
    if (!value) {
        this.hideMenuDialog();
        return;
    }

    const { labels, city } = this.state;
    const cities = await searchCity(value, labels, city);
    this.setState({  
        searchArea: true, 
        searchCities: transformCityMenuData(cities) 
    });
}

部署方面

本来是想使用heroku来部署应用的,但是经过一番折腾之后,在heroku的日志中看到服务是已经启动了的,但是外网访问不了,还需要技术支持^_^

后来只能就部署到自己的腾讯云上面去了,案例地址为:城市选择控件

总结

自己看到后就想写来玩玩而已,在其中也进一步了解了测试、react-router 4的用法,以及蚂蚁金服的UI库,也不是说没有收获。在项目中,也经过了一系列的代码重构,比如组件拆分、公共类库提取等等,写案例的同时也是在训练自己的意识,特意分享出来,大家共勉。

最后,代码仓库为:https://github.com/Rynxiao/city-selector,如果觉得有点意思,多谢star。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C# excel转换Json
参考案例:https://www.cnblogs.com/fengxiang/p/3551621.html
全栈程序员站长
2022/06/30
8160
C# excel转换Json
DataTable排序结果的纠正
默认情况下,即便db中某一列的值是数字,查询出来的DataSet/DataTable里,Column的类型都是String型,所以当用dataTable.DefaultView.Sort ="XXX ASC"排序时,都是按字符串排序处理的,并不是我们想要的结果,下面给出了二种解决办法: using System; using System.Data; namespace DataTableSortSample { class Program { static void Ma
菩提树下的杨过
2018/01/24
1.6K0
MSSQL数据批量插入优化详细
那么我们针对以上两点做优化,1、创建一次sqlcommon对象,只与数据库建立一次连接。优化改造代码如下:
Vincent-yuan
2020/04/10
1.4K0
MSSQL数据批量插入优化详细
C# 读取EXCEL文件的三种经典方法
1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:
代码伴一生
2021/09/22
2.6K0
.NET常用的扩展方法整理
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; namespace IBO.XJMYQP.Utility { public static class Extens
跟着阿笨一起玩NET
2018/09/19
1.2K0
Datatable.select() 方法的使用
DataTable是我们在进行开发时经常用到的一个类,并且经常需要对DataTable中的数据进行筛选等操作,下面就介绍一下Datatable中经常用到的一个方法——Select,微软提供了四个函数的重载,分别是
乔达摩@嘿
2020/09/11
1K0
C#:DataTable映射成Model
这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还得自己处理。 反射自然必不可少的,另外考虑到DataTable中的ColumnName通常与Model的PropertyName并不严格对应,可以用Attribute来记录这种映射关系。 步骤1:先创建一个DataFieldAttribute类 1 using System; 2 3 namespace Jimmy.ORM 4 { 5
菩提树下的杨过
2018/01/24
9420
.Net之Nopi Excel数据导出和批量导入功能
  它是一个专门用于读写Microsoft Office二进制和OOXML文件格式的.NET库,我们使用它能够轻松的实现对应数据的导入,导出功能,并且还能通过其对应的属性对Excel进行对应的样式调整。是一个简洁而又强大的第三方库。
追逐时光者
2019/08/28
1.8K0
.Net之Nopi Excel数据导出和批量导入功能
简单代码生成器原理剖析(一)
上篇文章(深入浅出三层架构)分析了简单三层架构的实现。包括Model,DAL(数据访问层),BLL(业务逻辑层)的实现。 实际开发中,由于重复代码的操作,会花费大量时间,如果以代码生成器来自动生成三层
用户1161731
2018/01/11
1.4K0
简单代码生成器原理剖析(一)
利用Microsoft.VisualBasic中TextFieldParser解析器把CSV格式倒入数据库
写了个Demo,利用Microsoft.VisualBasic这个程序集中的TextFieldParser解析器解析CSV格式的文件,然后将解析的数据插入到相关表,这样的好处是不用去用令人头疼的ODBC去操作CSV格式文件,如之前是这样去操作: 利用ODBC去操作 string strConnString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + this.dirCSV.Trim() + ";Extensions=asc,csv,ta
用户1161731
2018/01/11
7520
NPOI操作EXCEL
------------------------------------------------------------------------
zls365
2020/10/30
1.9K0
NPOI操作EXCEL
C#操作json的通用帮助类
using System; using System.Data; using System.Text; using System.Collections.Generic; using System.Reflection; using System.Data.Common; using System.Collections; using System.IO; using System.Text.RegularExpressions; using System.Runtime.Serialization.Jso
用户7108768
2021/11/02
1.4K0
C#WinForm基础编程
视频课:https://edu.51cto.com/course/20906.html
张哥编程
2024/12/13
1680
.NET程序设计复习总结
没有两三天.NET就要考试了,按照考试大纲自己梳理一遍( 临时抱佛脚 ) 有些知识点大纲不考就没总结,面向考试编程
唔仄lo咚锵
2020/09/15
1.5K0
一个封装好的CSV文件操作C#类代码
这个C#类用于转换DataTable为CSV文件、CSV文件转换成DataTable,如果需要进行CSV和DataTable之间进行转换,使用这个类非常合适。
用户7108768
2021/11/03
8310
关于asp.net与winform导出excel的代码
一、asp.net中导出Execl的方法: 在asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上;一种是将文件直接将文件输出流写给浏览器。在Response输出时,t分隔的数据,导出execl时,等价于分列,n等价于换行。 1、将整个html全部输出execl 此法将html中所有的内容,如按钮,表格,图片等全部输出到Execl中。
跟着阿笨一起玩NET
2018/09/19
5.8K0
C#小知识:“$”符号的作用
C#中符号是从C# 6.0版本开始推出的语法糖, 主要是对String.format()的简化,当然format也不是没有价值,本文将介绍C#中符及String.format的一些通用用法。
郑子铭
2023/11/15
8770
C#小知识:“$”符号的作用
C# NOPI 项目实战(经典)(可下载项目源码)
这篇文章主要介绍了如何安装NPOI,以及NPOI具体如何使用,并且用具体实例介绍了excel导入到datagridview以及 datagridview如何导出到excel并保存。如果不清楚这块的去我公众号去搜索这篇文章阅读。
zls365
2021/02/26
2.4K0
C#二十七 Dataset和DataAdapter
DataAdapter提供连接DataSet对象和数据源的桥梁。DataAdapter使用Command对象在数据源中执行SQL命令,以便将数据加载到DataSet中,并使DataSet中数据的更改与数据源保持一致。
张哥编程
2024/12/13
3130
C#二十七 Dataset和DataAdapter
使用NPOI导出,读取EXCEL(可追加功能)
使用NPOI导出,读取EXCEL,具有可追加功能 看代码 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.IO; 5 using System.Data; 6 using NPOI.SS.UserModel; 7 using NPOI.XSSF.UserModel; 8 using NPOI.HSSF.UserModel; 9 10 name
冰封一夏
2019/09/11
2K0
相关推荐
C# excel转换Json
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验