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,7 +203,9 @@ const fetchHomeIcons = async () => { ...@@ -203,7 +203,9 @@ 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 + .filter(item => item.link) // 过滤掉 link 为空的项
208 + .map(item => {
207 // 解析 link 字段,格式: "/pages/category-list/index?cid=3129684" 209 // 解析 link 字段,格式: "/pages/category-list/index?cid=3129684"
208 const [route, queryStr] = item.link.split('?'); 210 const [route, queryStr] = item.link.split('?');
209 const params = {}; 211 const params = {};
......