const { CURRENCIES, getPickerData } = require('../../utils/currencies'); const { getRates, convert, formatAmount, formatRate } = require('../../utils/rate'); const pickerData = getPickerData(); Page({ data: { pickerData, baseIndex: 0, amount: '100', list: [], updatedAt: '', loading: true, error: '', rates: null, showPicker: false, }, onLoad() { this.loadRates(); }, onPullDownRefresh() { this.loadRates().then(() => { wx.stopPullDownRefresh(); }); }, async loadRates() { this.setData({ loading: true, error: '' }); try { const baseCode = CURRENCIES[this.data.baseIndex].code; const { rates, updatedAt } = await getRates(baseCode); this.setData({ rates, updatedAt, loading: false }); this.buildList(); } catch (e) { this.setData({ loading: false, error: '汇率获取失败,请下拉刷新重试' }); } }, buildList() { const { rates, baseIndex, amount } = this.data; if (!rates) return; const num = parseFloat(amount); if (isNaN(num) || num <= 0) { this.setData({ list: [] }); return; } const baseCode = CURRENCIES[baseIndex].code; const list = CURRENCIES .filter((c) => c.code !== baseCode) .map((c) => { const converted = convert(num, baseCode, c.code, rates); const unitRate = convert(1, baseCode, c.code, rates); return { flag: c.flag, code: c.code, name: c.name, converted: formatAmount(converted, c.code), unitRate: formatRate(unitRate), }; }); this.setData({ list }); }, openBasePicker() { this.setData({ showPicker: true }); }, handlePickerSelect(e) { this.setData({ baseIndex: e.detail.value, showPicker: false }); this.loadRates(); }, handlePickerClose() { this.setData({ showPicker: false }); }, handleAmountInput(e) { this.setData({ amount: e.detail.value }); this.buildList(); }, });