:2026-07-25 7:06 点击:6
在区块链和加密货币领域,“上币”指代代币或数字资产在某个交易所正式上线交易的过程,对于开发者、投资者或普通用户而言,及时获取上币信息(如即将上线的代币、已上线代币详情、上币时间等)至关重要,本文将以uniapp为开发框架,详细介绍如何通过接口调用、页面展示等方式,实现“查看上币信息”的功能,包含技术实现思路、代码示例及注意事项。
在uniapp中查看上币信息,首先需要确定数据来源,常见的数据源包括:
本文以第三方聚合API(以非小号接口为例)为数据源,演示如何在uniapp中实现数据获取与展示。
若尚未创建项目,可通过HBuilderX或vue-cli初始化uniapp项目:
# 通过vue-cli创建 npx degit dcloudio/uni-preset-vue#vite my-coin-project cd my-coin-project npm install
uniapp中发起网络请求,通常使用uni.request方法,为方便复用,可封装一个API请求工具类(api/coin.js):
// api/coin.js
const BASE_URL = 'https://api.feixiaohao.com'; // 非小号API示例(需替换为实际可用接口)
// 获取即将上币信息
export const getUpcomingList = (params = {}) => {
return uni.request({
url: `${BASE_URL}/v1/coin/new/preview`,
method: 'GET',
data: params,
header: {
'Content-Type': 'application/json'
}
});
};
// 获取已上线币种列表
export const getListingList = (params = {}) => {
return uni.request({
url: `${BASE_URL}/v1/coin/list`,
method: 'GET',
data: params,
header: {
'Content-Type': 'application/json'
}
});
};
在pages目录下创建新页面(如coin/listing),并编写index.vue文件,实现数据获取与列表展示:
<template> <view class="container"> <!-- 顶部导航 --> <view class="nav-bar"> <text class="nav-title">上币信息</text> <view class="tab"> <text :class="['tab-item', activeTab === 'upcoming' ? 'active' : '']" @tap="switchTab('upcoming')" >即将上币</text> <text :class="['tab-item', activeTab === 'listed' ? 'active' : '']" @tap="switchTab('listed')" >已上线</text> </view> </view> <!-- 列表内容 --> <view class="list"> <block v-if="loading"> <view class="loading"> <text>加载中...</text> </view> </block> <block v-else> <view class="list-item" v-for="item in coinList" :key="item.id" @tap="goToDetail(item.id)" > <view class="item-left"> <image class="coin-logo" :src="item.logo" mode="aspectFit"></image> <view class="coin-info"> <text class="coin-name">{{ item.name }} ({{ item.symbol }})</text> <text class="coin-time">{{ activeTab === 'upcoming' ? '上币时间:' + item.listing_time : '上线时间:' + item.listing_time }}</text> </view> </view> <view class="item-right"> <text class="status-tag" :class="activeTab === 'upcoming' ? 'tag-upcoming' : 'tag-listed'" >{{ activeTab === 'upcoming' ? '待上线' : '已上线' }}</text> </view> </view> </block> <view v-if="!loading && coinList.length === 0" class="empty"> <text>暂无数据</text> </view> </view> </view> </template> <script> import { getUpcomingList, getListingList } from '@/api/coin.js'; export default { data() { return { activeTab: 'upcoming', // 默认展示“即将上币” coinList: [], // 币种列表 loading: false, // 加载状态 page: 1, // 当前页码 pageSize: 10 // 每页条数 }; }, onLoad() { this.fetchData(); }, onPullDownRefresh() { this.refreshData(); }, onReachBottom() { this.loadMore(); }, methods: { // 切换tab switchTab(tab) { if (this.activeTab === tab) return; this.activeTab = tab; this.refreshData(); }, // 获取数据 async fetchData() { this.loading = true; try { const res = await (this.activeTab === 'upcoming' ? getUpcomingList({ page: this.page, size: this.pageSize }) : getListingList({ page: this.page, size: this.pageSize }) ); if (res.statusCode === 200 && res.data.code === 0) { this.coinList = res.data.data; } else { uni.showToast({ title: '获取数据失败', icon: 'none' }); } } catch (error) { console.error('请求错误:', error); uni.showToast({ title: '网络请求失败', icon: 'none' }); } finally { this.loading = false; } }, // 下拉刷新 async refreshData() { this.page = 1; await this.fetchData(); uni.stopPullDownRefresh(); }, // 加载更多 loadMore() { this.page++; this.fetchData(); }, // 跳转详情页 goToDetail(id) { uni.navigateTo({ url: `/pages/coin/detail?id=${id}` }); } } }; </script> <style lang="scss"> .container { padding: 20rpx; background-color: #f5f5f5; min-height: 100vh; } .nav-bar { background-color: #fff; padding: 20rpx; border-radius: 12rpx; margin-bottom: 20rpx; display: flex; flex-direction: column; gap: 20rpx; .nav-title { font-size: 36rpx; font-weight: bold; color: #333; } .tab { display: flex; gap: 40rpx; .tab-item { font-size: 28rpx; color: #666; position: relative; &.active { color: #007aff; font-weight: bold; &::after { content: ''; position: absolute; bottom: -10rpx; left: 0; width: 100%; height: 4rpx; background-color: #007aff; border-radius: 2rpx; } } } } } .list { .loading { text-align: center; padding: 40rpx; color: #999; } .empty { text-align: center; padding: 40rpx; color: #999; } .list-item { background-color: #fff; border-radius: 12rpx; padding: 24rpx; margin-bottom: 20rpx; display: flex; justify-content: space-between; align-items: center; .item-left { display: flex; align-items: center; gap: 20rpx; .coin-logo { width: 80rpx; height: 80rpx; border-radius: 50%; } .coin-info { display: flex; flex-direction: column; gap: 8rpx; .coin-name { font-size:
本文由用户投稿上传,若侵权请提供版权资料并联系删除!