vue2项目升级到vue3经历分享5

写到第5篇了,解决了很多问题,还有一些需要调整
1 el-input-number指令兼容性调整
下面这个可编辑的表格,全是0,于是需要一个指令,让它自己实现如果是0,就置空;如果是数字就是格式化为千分位;如果焦点放上去,变成数字。焦点失去有变成格式化。
1
在vue2中这么写,但在vue3中vnode.elm.querySelector,这种写法是不行的,因为你不应该直接操作dom,el 参数实际上指向的是 el-input-number 的根 DOM 元素,而不是内部的 input 元素。由于 el-input-number 是组件,不是原生的 input 元素,直接监听其内部 input 事件可能不太方便。

let options = {
  precision: 2,
  thousands: ','
}
const money = (el, binding, vnode) => {
  // // 判断是否是input元素
  if (vnode) {
    el = vnode.elm.querySelector('input')
  } else {
    throw new Error('v-money-format requires 1 input')
  }
  const opt = Object.assign({}, options, binding.value ? binding.value : {})
  const regStr = '/^$*+?.|'
  const inRegStr = regStr.includes(opt.thousands) ? (`\\${opt.thousands}`) : opt.thousands
  const thousandsReg = new RegExp(inRegStr, 'g')

  if (!el.isFocus) { //设置初始值 input框为0 去除显示
    if (el.value == 0) {
      el.value = '';
    }else if(el.value != '' || el.value != 0){  //初始化千分位
      el.value = el.value.replace(thousandsReg, '').cut();
    }
  }
  el.onfocus = function () {
    el.isFocus = true
    el.value = el.value.replace(thousandsReg, '')
  }
  el.onblur = function () {
    el.isFocus = false
    if (el.value != '') {
      el.value = el.value.cut();
    }
    if (el.value == 0) {
      el.value = '';
    }
    // el.value = moneyFormat(el.value, opt.precision, opt.thousands)
  }
  el.oninput = function () {
    el.value = el.value.replace(/[^\d.-]/g, '')
  }
}

export default money

把这个代码放到文心一言,改成vue3的模式,无效,只能自己想办法。调整为vue3的模式

/**
 * 金额格式化指令
 */
import $tool from '@/utils/tool'  
  
const options = {  
  precision: 2,  
  thousands: ','  
}  
  
const money = {  
  mounted(el, binding,vnode) {  
    let input;
    if (vnode){
      input = el.querySelector('input');
    } else{
      throw new Error('v-money-format requires 1 input');
    }

    const opt = Object.assign({}, options, binding.value || {})  
    const regStr = '/^$*+?.|'  
    const inRegStr = regStr.includes(opt.thousands) ? (`\\${opt.thousands}`) : opt.thousands  
    const thousandsReg = new RegExp(inRegStr, 'g')  
  
    // 初始化输入框
    if (!input.isFocus && input.value) {
      if (input.value === '0') {
        input.value = '';
      } else if (input.value !== '' || input.value !== '0') {
        let fmt = $tool.cut(input.value.replace(thousandsReg, ''));
        input.value = fmt
        console.log(input.value);
      }
    } else {
      input.value = null;
    }
    
    // 监听事件
    input.addEventListener('focus', () => {
      input.isFocus = true;
      input.value = input.value.replace(thousandsReg, '');
    });

    input.addEventListener('blur', () => {
      input.isFocus = false;
      if (input.value !== '') {
        input.value = $tool.cut(input.value);
      }
      if (input.value === '0') {
        input.value = '';
      }
    });


    input.addEventListener('input', () => {
      if (input.value) {
        input.value = input.value.replace(/[^\d.-]/g, '');
      } else {
        input.value = '0';
      }
    });

  },  
}  
  
export default money;

运行提示moneyFormat.ts:31 The specified value "3,333" cannot be parsed, or is out of range,
vue2是没有这个问题的,分析原因,在vue2中el-input-number类型依旧是text
1
但是在element-plus中变成了number,改成el-inpu,结果发现blur事件后input.value被置空了。搞了快一天了,项目进度要紧,这种方案放弃了。
2
如果不用指令,采用formatterparser会怎么样呢?
1
调试你会发现,如果是在表格中,你没改一下,整个数字样式都不会重新格式化一遍。虽然这样,但是可用。
2 v-model中默认属性的问题
在vue2中当你的组件采用v-model绑定值,例如
1
进入到组件中,通过this.value赋值,这个在vue3中是不行的,需要改成modelValue,否则undefined错误
1
还需要定义出来。
1
3 keep-alive有些页面缓存了,有些没有缓存
setup模式下,给页面定义一个名称,就可以被缓存。

defineOptions({
  name: "采购入库单"  
})

但是在本次vue2升级到vue3的过程中,发现有些页面增加后,缓存了,有些没有被缓存了。经过调试发现
1
上面的name中的内容,要跟页签的名称一致,否则不会缓存。也就是说,这个name必须设置为凭证字才可以。这么推理keepalive应该是map结构。
1
即你必须要改成与页签同名,因为这个页面名在项目中是Component的名称
1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/616545.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】图的应用---最小生成树(Prim,Kruskal)、最短路径(BFS,Dijkstra,Floyd)、拓扑排序、关键路径、有向无环图表达式

文章目录 5.图的应用5.1 最小生成树5.1.1 Prim算法5.1.2 Kruskal算法5.1.3 最小生成树代码A.邻接矩阵B.邻接表 5.2 最短路径5.2.1 BFS5.2.2 Dijkstra5.2.3 Floyd5.2.4 三种算法的比较 5.3 有向无环图描述表达式5.4 拓扑排序5.5 关键路径 5.图的应用 5.1 最小生成树 定义 对一个…

Android Studio(AS)使用别人的项目与gradle包并运行项目

一、问题描述 在进行AS开发时,我们可能会使用到别人的项目,但发现别人把项目发给我们后会发现gradle项目同步失败o(≧口≦)o,此时计有三: 1.横行霸道、豪取抢夺:直接空降到项目人那里,强他的电脑占为己有…

哈夫曼编码(上)

文章目录 问题引入哈夫曼编码的编写总述步骤一步骤二步骤三步骤四 实现代码如下 问题引入 哈夫曼编码通常用于通信领域,是对较长信息进行压缩,然后发送到指定的位置,是为了节省发送信息占用的空间。 通常来说,如果信息中字符的重…

《Linux运维总结:ARM64架构CPU基于docker-compose一离线部署rabbitmq 3.10.25容器版镜像模式集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统&…

element 输入框禁止输入空格以及复制的值进去删除空格(vue自定义指令)开箱即用

实例图: 代码: //输入框禁止输入空格 Vue.directive(noSpace, {bind(el) {//禁止输入空格el.addEventListener("keydown", function (event) {if (event.keyCode 32) {event.preventDefault();}});//复制值时去掉空格el.addEventListener(&q…

探讨欧盟就人工智能监管达成协议

《人工智能法案》是一项具有里程碑意义的立法,它可以创造一个有利的环境,在这种环境中,人工智能的使用将成为一种更优秀的安全和信任的工具,确保整个欧盟的公共和私人机构利益相关者的参与。 历时3天的“马拉松式”谈判圆满结束&…

CCC数字钥匙各版本关系

CCC钥匙规范版本关系 CCC数字钥匙架构Overview

【教学类-55-01】20240511图层顺序挑战(四格长条纸)(4*4)和“手工纸自制参考图”

作品展示 背景需求 空间思维图层挑战2|逻辑推理|空间想象力 - 小红书 (xiaohongshu.com)https://www.xiaohongshu.com/discovery/item/62cbf6c60000000010026aa0?app_platformandroid&ignoreEngagetrue&app_version8.35.0&share_from_user_hiddentrue&typevi…

机器学习第37周周报 GGNN

文章目录 week37 GGNN摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 数据处理部分3.2 门控图神经网络3.3 掩码操作 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 传感器设置策略4.3.2 数据集4.3.3 实验设置4.3.4 模型参数设置4.3.5 实验结果 5. 结论 …

【linux】详解linux基本指令

目录 cat more less head tail 时间 cal find grep zip/unzip tar bc uname –r 关机 小编一共写了两篇linux基本指令,这两篇涵盖了大部分初学者的必备指令,这是第二篇,第一篇详见http://t.csdnimg.cn/HRlVt cat 适合查看小文…

JAVA 标准接口返回与i18n国际化配置

不喜欢废话直接上代码 标准通用返回 package com.luojie.common;import com.luojie.common.inter.ResponseCommon; import lombok.Data;Data public class ResponseCommonImpl implements ResponseCommon {int code;String msg;Object entity; }package com.luojie.common;im…

vue 中的 Vuex

Vuex Vuex是什么? 概念:专门在vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间…

【NTN 卫星通信】参考卫星集成场景和架构

1 卫星接入场景 1.1 同一PLMN内的卫星和地面接入网 一个PLMN可以同时具有地面3GPP接入和卫星3GPP接入。在此场景中,单独的N2实例处理单独的访问类型节点。然而,卫星接入网的覆盖范围可以跨越地面接入网的覆盖范围。 图1 同PLMN架构下的卫星和地面3GPP接…

如何在matlab时间序列中X轴标注月-日

一般我们使用的时间序列都是以年为单位,比如下图: 而如果要绘制月尺度的时间变化图,则需要调整X轴的标注。下面代码展示了如何绘制小时尺度的降水数据。 [sname2,lon2,lat2] kml2xy(GZ_.kml); nc_bound2 [lon2,lat2]; area_ind2inpolygon(e…

# 从浅入深 学习 SpringCloud 微服务架构(十六)

从浅入深 学习 SpringCloud 微服务架构(十六) 一、SpringCloudStream:自定义消息通道 1、在子工程 stream_product (子模块)中,创建 自定义的消息通道类 MyProcessor.java /*** spring_cloud_demo\stream_product…

【大数据·Hadoop】从词频统计由浅入深介绍MapReduce分布式计算的设计思想和原理

一、引入:词频统计问题 假如我们有一亿份文档,需要统计这一亿份文档的词频。我们会怎么做,有以下思路 使用单台PC执行:能不能存的下不说,串行计算,一份一份文档读,然后进行词频统计&#xff0…

【35分钟掌握金融风控策略23】定额策略

目录 定额策略 定额策略的开发、部署、监控和调优 定额策略开发 定额策略部署 定额策略监控 定额策略调优 定额策略 定额是对授信审批通过的客户给予合适授信额度的过程。如何定额、定多少额度是由定额策略来决定的。定额的多少与客户未来的动支情况、逾期情况和最终的收…

基于鹈鹕优化算法POA的复杂城市地形下无人机避障三维航迹规划,可以修改障碍物及起始点(Matlab代码)

复杂城市地形下无人机避障三维航迹规划是指在城市等高密度区域内,通过无人机的传感器和导航系统来实现飞行路径的规划和调整,从而避免无人机与建筑物、其他无人机、地面障碍物等发生碰撞和冲突。具体来说,无人机需要实时感知周围环境&#xf…

【报错合集】完美解决“虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本”

文章目录 解决方案:更改设置的硬件版本 今天我需要将别人的虚拟机克隆到我的VMware Workstation上运行,结果发生了以下的错误: 刚开始以为是VMware Workstation的版本问题太低导致的,所以我删除了原来的那个版本,下载…

MySQL数据库的初始化(创建库、创建表、向数据库添加测试数据)

MySQL数据库的初始化(创建库、创建表、向数据库添加测试数据) MySQL数据库简介MySQL创建一个新的数据库MySQL创建一张新的数据表简单(设置)表复杂(设置)表 填充测试数据SQL语句mysql>模式下输入的每句sq…