hookehuyr

fix(product): 修复首页图标加载崩溃和金额显示问题

...@@ -286,8 +286,13 @@ const showAmountModal = ref(false) ...@@ -286,8 +286,13 @@ const showAmountModal = ref(false)
286 * @type {ComputedRef<string>} 286 * @type {ComputedRef<string>}
287 */ 287 */
288 const displayValue = computed(() => { 288 const displayValue = computed(() => {
289 - // 优先显示输入过程中的值 289 + // 优先显示输入过程中的值(格式化)
290 if (inputValue.value) { 290 if (inputValue.value) {
291 + // 尝试解析为数字并格式化,如果解析失败则返回原值
292 + const num = parseFloat(inputValue.value)
293 + if (!Number.isNaN(num)) {
294 + return num.toFixed(2)
295 + }
291 return inputValue.value 296 return inputValue.value
292 } 297 }
293 // 如果没有输入值,显示表单的原始值 298 // 如果没有输入值,显示表单的原始值
...@@ -350,7 +355,7 @@ onUnmounted(() => { ...@@ -350,7 +355,7 @@ onUnmounted(() => {
350 /** 355 /**
351 * 监听键盘显示状态 356 * 监听键盘显示状态
352 */ 357 */
353 -watch(showKeyboard, (newValue) => { 358 +watch(showKeyboard, (newValue, oldValue) => {
354 if (!keyboardPopupId.value) { 359 if (!keyboardPopupId.value) {
355 return 360 return
356 } 361 }
...@@ -365,6 +370,12 @@ watch(showKeyboard, (newValue) => { ...@@ -365,6 +370,12 @@ watch(showKeyboard, (newValue) => {
365 deactivatePopup(keyboardPopupId.value) 370 deactivatePopup(keyboardPopupId.value)
366 // 同步关闭金额弹窗 371 // 同步关闭金额弹窗
367 showAmountModal.value = false 372 showAmountModal.value = false
373 +
374 + // 【修复】如果是从打开状态关闭(用户点击遮罩或关闭按钮),清除临时输入值
375 + // 这样可以避免显示 "123." 这种不完整的值
376 + if (oldValue === true) {
377 + inputValue.value = ''
378 + }
368 } 379 }
369 }) 380 })
370 381
...@@ -390,14 +401,18 @@ const openKeyboard = () => { ...@@ -390,14 +401,18 @@ const openKeyboard = () => {
390 const onInput = (val) => { 401 const onInput = (val) => {
391 // 如果输入的是小数点,检查是否已经有小数点 402 // 如果输入的是小数点,检查是否已经有小数点
392 if (val === '.' && inputValue.value.includes('.')) { 403 if (val === '.' && inputValue.value.includes('.')) {
404 + // 震动反馈提示
405 + Taro.vibrateShort({ type: 'light' })
393 return 406 return
394 } 407 }
395 408
396 // 如果输入的是数字,检查小数点后的位数 409 // 如果输入的是数字,检查小数点后的位数
397 if (val >= '0' && val <= '9') { 410 if (val >= '0' && val <= '9') {
398 const parts = inputValue.value.split('.') 411 const parts = inputValue.value.split('.')
399 - // 如果已经有小数点,并且小数点后有2位,则忽略输入 412 + // 如果已经有小数点,并且小数点后有2位,则忽略输入并震动提示
400 if (parts.length === 2 && parts[1]?.length >= 2) { 413 if (parts.length === 2 && parts[1]?.length >= 2) {
414 + // 震动反馈提示已达到最大位数
415 + Taro.vibrateShort({ type: 'light' })
401 return 416 return
402 } 417 }
403 } 418 }
...@@ -445,6 +460,8 @@ const onConfirm = () => { ...@@ -445,6 +460,8 @@ const onConfirm = () => {
445 * 关闭键盘认处 460 * 关闭键盘认处
446 */ 461 */
447 const onClose = () => { 462 const onClose = () => {
463 + // 清除临时输入值,让它回退到原始值(避免显示 "123." 这种不完整的值)
464 + inputValue.value = ''
448 // 只关闭金额弹窗,让 showKeyboard 自然变化触发 watch 处理 GlobalPopupManager 465 // 只关闭金额弹窗,让 showKeyboard 自然变化触发 watch 处理 GlobalPopupManager
449 showAmountModal.value = false 466 showAmountModal.value = false
450 } 467 }
......
...@@ -203,28 +203,30 @@ const fetchHomeIcons = async () => { ...@@ -203,28 +203,30 @@ const fetchHomeIcons = async () => {
203 203
204 if (res.code === 1 && res.data) { 204 if (res.code === 1 && res.data) {
205 // 将 API 数据映射为 loopNav 格式 205 // 将 API 数据映射为 loopNav 格式
206 - loopNav.value = res.data.map(item => { 206 + loopNav.value = res.data
207 - // 解析 link 字段,格式: "/pages/category-list/index?cid=3129684" 207 + .filter(item => item.link) // 过滤掉 link 为空的项
208 - const [route, queryStr] = item.link.split('?'); 208 + .map(item => {
209 - const params = {}; 209 + // 解析 link 字段,格式: "/pages/category-list/index?cid=3129684"
210 - 210 + const [route, queryStr] = item.link.split('?');
211 - // 如果有查询参数,解析为对象 211 + const params = {};
212 - if (queryStr) { 212 +
213 - queryStr.split('&').forEach(param => { 213 + // 如果有查询参数,解析为对象
214 - const [key, value] = param.split('='); 214 + if (queryStr) {
215 - params[key] = decodeURIComponent(value); 215 + queryStr.split('&').forEach(param => {
216 - }); 216 + const [key, value] = param.split('=');
217 - } 217 + params[key] = decodeURIComponent(value);
218 - 218 + });
219 - // 返回导航项对象 219 + }
220 - return { 220 +
221 - id: String(item.id), 221 + // 返回导航项对象
222 - icon: item.icon, 222 + return {
223 - name: item.name, 223 + id: String(item.id),
224 - route, 224 + icon: item.icon,
225 - ...params // 展开参数(如 cid) 225 + name: item.name,
226 - }; 226 + route,
227 - }); 227 + ...params // 展开参数(如 cid)
228 + };
229 + });
228 } 230 }
229 } catch (err) { 231 } catch (err) {
230 console.error('获取首页图标失败:', err); 232 console.error('获取首页图标失败:', err);
......