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.thousandsconst 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 = trueel.value = el.value.replace(thousandsReg, '')}el.onblur = function () {el.isFocus = falseif (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 = fmtconsole.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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP1.1的优化措施

3.2 HTTP/1.1 如何优化? 可以从以下三个方面来优化http/1.1协议: 尽量避免发送 HTTP 请求; 在需要发送 HTTP 请求时,考虑如何减少请求次数; 减少服务器的 HTTP 响应的数据大小; 避免发送HTTP请求 对于…

文献阅读——中国农产品期货的正负价格泡沫(LPPLS)

Positive and negative price bubbles of Chinese agricultural commodity futures Fang, Ming, Yizhou Lin, and Chiu-Lan Chang. “Positive and negative price bubbles of Chinese agricultural commodity futures.” Economic Analysis and Policy 78 (2023): 456-471. 经…

React 第三十章 前端框架的分类

现代前端框架,有一个非常重要的特点,那就是基于状态的声明式渲染。如果要概括的话,可以使用一个公式: UI f(state) state:当前视图的一个状态f:框架内部的一个运行机制UI&#xff1…

ADS基础介绍篇1

一. ADS简介 常用的射频仿真软件有ADS和AWR,ADS(Advanced Design system)最传统,是Agilent公司于2008年推出的电磁场仿真器,可提供原理图设计和layout版图设计。仿真功能十分强大,可提供从无源到有源,从直流到交流&am…

【激活函数--中】激活函数和阶跃函数的可视化及对比

文章目录 一、Python中绘制阶跃函数的图形二、实现和可视化Sigmoid函数2.1 Python实现2.2 可视化Sigmoid函数 三、比较Sigmoid函数与阶跃函数3.1 Sigmoid函数与阶跃函数的差异3.2 Sigmoid函数与阶跃函数的共同点 一、Python中绘制阶跃函数的图形 在Python中实现阶跃函数的代码…

SD-WAN提升Microsoft 365用户体验

随着数字化时代的到来,SaaS应用如Microsoft 365已经成为各类企业的主流选择。在这一趋势下,企业需要以更加灵活、高效的方式使用Microsoft 365,以满足日益增长的业务需求。而传统的网络基础设施可能无法满足这一需求,因此&#xf…

Gitlab:从其它项目组里导入一个项目

1.首先获取原项目的http地址 http://ip/projectGroup/ProjectX.git其中,ip 为公司gitlab内网地址。 2.进入目的项目组进行创建 首先,需要拥有一个该组拥有者权限的账号,才能进行后续的操作。 2.1.点击创建项目按钮 2.2.选择导入项目 其中…

SAP_MM模块-配置物料主数据号码段时的一些坑

业务背景:对于新入职的一家公司,人员不熟悉,业务不熟悉、系统也不熟悉的情况下,领导要求负责一个推广项目(只需要维护MM和FICO模块),对于一个没有独立配置过财务模块的后勤顾问来说,…

Python | Leetcode Python题解之第83题删除排序链表中的重复元素

题目: 题解: class Solution:def deleteDuplicates(self, head: ListNode) -> ListNode:if not head:return headcur headwhile cur.next:if cur.val cur.next.val:cur.next cur.next.nextelse:cur cur.nextreturn head

数据结构与算法学习笔记三---循环队列的表示和实现(C语言)

目录 前言 1.为啥要使用循环队列 2.队列的顺序表示和实现 1.定义 2.初始化 3.销毁 4.清空 5.空队列 6.队列长度 7.获取队头 8.入队 9.出队 10.遍历队列 11.完整代码 前言 本篇博客介绍栈和队列的表示和实现。 1.为啥要使用循环队列 上篇文章中我们知道了顺序队列…

[单机]成吉思汗3_GM工具_VM虚拟机

稀有端游成吉思汗1,2,3单机版虚拟机一键端完整版 本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!! 教程是本人亲自搭建成功的,绝对是完整可运行的&#x…

阿里云域名备案流程

阿里云域名备案流程大致可以分为以下几个步骤,这些信息综合了不同来源的最新流程说明,确保了流程的时效性和准确性: UP贴心的附带了链接: 首次备案流程:ICP首次备案_备案(ICP Filing)-阿里云帮助中心 (aliyun.com) …