关键词:Vue、Axios、加密货币价格看板、实时行情、API 调用、前端开发
为什么要用 Vue + Axios?
想在前端快速展示实时行情,却又不想写冗长原生的 XMLHttpRequest
?Vue 负责数据和视图双绑,Axios 负责优雅地搞定 HTTP 请求,两者结合能以最少的代码量搭建一个交互友好的加密货币实时价格看板。下文将分 4 个步骤带你完成整个项目,文末还准备了常见问答和进阶技巧,帮助你在 30 分钟内上手。
效果预览
完成后的页面将自动拉取比特币、以太坊、ChainLink 等币种的人民币与美元实时报价,并即时刷新。样式基于轻量的 Foundation CSS,简洁又耐看。
第 1 步:准备最小可运行的 Vue 页面
把下面内容保存为 index.html
,直接用浏览器打开即可看到「模拟行情」。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>Vue & Axios 加密货币看板</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/foundation-sites@6.7.5/dist/css/foundation.min.css">
</head>
<body>
<div id="app" class="grid-container" style="margin-top:2rem;">
<h3>加密货币实时价格</h3>
<div class="grid-x grid-margin-x">
<div v-for="(price, symbol) in results" :key="symbol" class="cell medium-4">
<div class="card">
<div class="card-section">
<strong></strong>
<p>¥ </p>
<p>$ </p>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="vueApp.js"></script>
</body>
</html>
此时 vueApp.js
先写死一段模拟数据:
const vm = new Vue({
el: '#app',
data: {
results: {
BTC: { CNY: 281999, USD: 40928 },
ETH: { CNY: 20758, USD: 3012 }
}
}
});
打开浏览器就能看到一个卡片式行情列表。接下来我们将把模拟数据替换为实时 API 数据。
第 2 步:把 JS 与 HTML 完全解耦
把上一步内嵌在 <script>
里的逻辑全部迁移到 vueApp.js
中,保持 HTML 纯粹负责结构。
这一步虽小,却是后续多人协作和代码可维护性的关键。
第 3 步:用真实 API 替换模拟数据
我们选用 Cryptocompare 提供的免费行情接口:
https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC,ETH,LINK&tsyms=CNY,USD
修改 vueApp.js
,在 Vue 生命周期钩子 mounted
里拉取数据:
const url =
'https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC,ETH,LINK&tsyms=CNY,USD';
new Vue({
el: '#app',
data: {
results: {}
},
mounted() {
axios
.get(url)
.then(res => (this.results = res.data))
.catch(err => console.error(err));
}
});
保存后刷新浏览器,你会看到实时数据已替换卡片中的数字。至此,你已经完成了 80% 的工作!
第 4 步:体验 10 秒刷新一次
为了让界面持续更新,只需在 mounted
外再套一个定时器:
created() {
const fetchPrice = () =>
axios
.get(url)
.then(res => (this.results = res.data))
.catch(console.error);
fetchPrice();
this.timer = setInterval(fetchPrice, 10000);
},
beforeDestroy() {
clearInterval(this.timer);
}
场景示例:手机扫一眼页面,10 秒后数字跳动;在地铁上用 4G 也能迅速查看最新价。
如何让行情更炫酷?
想把卡片换成 K 线图、深度图或者自选股列表?👉 这里汇集了加密行情主流可视化方案,直接拿去用!
Axios 进阶速查
- GET 带参数
axios.get('/api', { params: { coin: 'BTC' } });
- POST 提交数据 + Header
axios.post('/api', { symbol: 'ETH' }, { headers: { 'x-token': 'abc' } });
- 全局错误处理
axios.interceptors.response.use( res => res, err => { console.log('状态码:', err.response.status); return Promise.reject(err); } );
- async/await
async function getData() { try { const { data } = await axios.get(url); console.log(data); } catch (e) { console.log(e.response?.data || e.message); } }
常见问题与解答
Q1:为什么配置了 Axios 后浏览器报 CORS?
A:CORS 控制由服务端决定。免费接口通常允许跨域;若用自己的服务器,请加 Access-Control-Allow-Origin: *
响应头。
Q2:接口限速 200ms 一次,前端却设置了 1000ms?
A:建议在前端做防抖/截流,用 lodash.throttle
就行:
import throttle from 'lodash.throttle';
const fetchPrice = throttle(async () => {...}, 200);
Q3:生产环境如何隐藏 API Key?
A:千万不要把 Key 写死在前端。应由后端 proxy 转发,或在 CI/CD 阶段通过环境变量注入。
Q4:想让同一套代码跑在 Vue3 怎么办?
A:Vue3 用 createApp
+ setup
,但 axios
用法不变。示例:
const { createApp } = Vue;
createApp({
setup() { /* 逻辑同上 */ }
}).mount('#app');
Q5:移动端显示错位?
A:Foundation 自带移动优先栅格;若字体太小,可在 <head>
加
<meta name="viewport" content="width=device-width, initial-scale=1">
Q6:想本地化多币种,怎么解耦?
A:把币种配置放到 coins = ['BTC','ETH','SOL']
,再在 URL 中循环拼接即可,修改一行代码即可扩展。
小结与下一步
现在你已经拥有一个可刷新、可扩展的加密货币实时价格看板,核心流程分三步:
- Axios 拉数据;
- Vue 双绑渲染;
- Foundation 保障响应式样式。