跨域请求数据
使用axios跨域请求数据
我们的项目是前后端分离,后端只负责接口,前端负责数据展示、逻辑处理。但是前后端开发模式,有一个重要的问题,就是跨域问题。Vue-cli 创建的项目,可以直接利用 Node.js 代理服务器,实现跨域请求,我使用axios解决跨域。
axios简介
vue2.0官方推荐axios进行ajax请求。axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:
- 从浏览器中创建 XMLHttpRequest
- 从 node.js 发出 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求和响应数据
- 取消请求
- 自动转换JSON数据
- 客户端支持防止 CSRF/XSRF
安装axios
|
|
在其他文件中axios即可。
首页
home.vue
|
|
获取城市列表
使用axios获取城市列表数据,因为最新的vue-webpack-template改用webpack.dev.conf.js文件代替,配置需写在这个文件中,在devServer{}括号里添加before(app){}。
|
|
我把业务组件相关的操作代码放在api文件下,使用时方便查找。创建/api/home.js文件:
|
|
引入axios,调用webpack.dev.conf.js中定义的/api/getCities url
回到home.vue组件,data中定义数据groupCity
,表示所有城市列表。创建getCities()方法获取城市列表数据。
|
|
获取到的数据发现并不是我想要的数据结构,需要手动将数据转化成我想要的数据结构。创建sortGroupCity()方法,将获取的数据按照A-Z字母开头排序。
|
|
在控制台console.log出数据:
在template中动态获取城市列表数据
|
|
页面展示
定位城市
定位城市首先就是要获取到城市id,data中定义guessCityid
和guessCity
,分别表示当前城市id和城市名称,创建getGuess()
方法获取当前城市。获取当前城市名称和id值。
|
|
在template中渲染
|
|
红色遮盖部分就是当然城市的名称,页面展示
根据guessCityid
获取到的城市。由此定位城市成功。
点击刷新
|
|
点击span文字刷新页面,创建reload点击事件
|
|
city页面
选择城市
点击当前城市跳转到city页面。修改city.vue
|
|
引入e-header组件并使用。
获取当前城市数据
同理,在webpack.dev.conf.js文件中添加代码
|
|
/api/city.js
|
|
city组件中,在data中定义cityId
和cityName
,分别表示当前城市id和当前城市名字,引入getCurrentCity()方法获取数据
city.vue
|
|
同时在mounted中挂载getCurrentCity()方法,渲染数据
|
|
页面展示
搜索地址
在input输入框里输入要搜索的地址,触发postPois事件
|
|
搜索历史
思路:用户通过在搜索框输入关键字之后点击提交按钮都展示搜索结果列表。 当搜索结果加载完毕时,将关键字和关键字对应的链接地址存起来。当搜索页重新加载时,将用户搜索的条件显示并保存在当前页面上。
首先,要写个js方法来保存搜索条件。在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的。这儿我就用localStorage对数据进行存储操作。
我把对于localStorage相关的操作代码写在mUtils.js中。
common/js/mUtils.js
|
|
注意:一般我们会将JSON存入localStorage中,但是在localStorage会自动将localStorage转换成为字符串形式,这时我们可以使用
JSON.stringify()
这个方法,来将JSON转换成为JSON字符串。
数据渲染
|
|
点击提交按钮后即隐藏搜索历史头部,默认为显示搜索历史头部。
获取搜索城市列表
点击提交按钮后显示搜索到的城市列表。在dom中进行遍历渲染。
|
|
得到搜索城市列表数据后,将搜索的条件显示并保存在当前页面上,同时点击哪个城市地址将进入到下一页面。创建nextPage事件。
|
|
将localStorage的key设置为placeHistory,先判断是否已经有一样的历史记录,如果没有则新增,如果有则不做重复储存,判断完成后进入下一页。
到此,city页面已经完成!