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

当初花了1个半月将十几个微服务从mybatis升级为mybatis-plus,就很自信的认为前端vue2升级到vue3也不过so so,世界过程中却是折腾,写法乱七八糟,不兼容的问题一大堆。
1 操作dom元素
this.$refs.subject[index].$children[0].$children[0].$el;element-ui的旧系统,之所以有这段代码,是因为科目表的数据很多,当修改科目或者新增下级科目后,希望能自动移动到之前编辑的位置。
这样写法在element-plus中却直接报错。
1
2 attr属性获取
element-ui中可以通过tab.$attrs.category中获取
1
如下面的category
1
它违反了 Vue 的响应式原则,需要换种写法

tabClick(tab, event) {
        // this.fcId = 1 ; //切换 设置人民币
        this.$tool.session.set('initalIndex', tab.index)
        let category = this.tabs.find(item=>item.title == tab.props.label).category;
        this.$refs.beginning[this.tabIndex].initTableList(category , this.fcId);
      },

3 v-model表达式问题
下面的35-tmpData.marginLeft的用法是不正确的,这是一个表达式,而不是数据属性。在vite中编译直接报错。

<span><el-input-number class="num" :controls='false' v-model='tmpData.marginLeft' :min="0" :max="35" /> 毫米</span>  
                <span><el-input-number class="num" :controls='false' v-model='35-tmpData.marginLeft' :max="35" disabled /> 毫米</span>

那么如何调整呢?按照计算属性来调整

 <span><el-input-number class="num" :controls='false' v-model='computeMarginLeft' :max="35" disabled /> 毫米</span>


 computed: {
      computeMarginTop(){
        return this.margins-this.tmpData.marginTop;
      },
      computeMarginLeft(){
        return 35 - this.tmpData.marginLeft;
      },
    },

4 el-select样式问题
element-ui中使用的样式,图标可以通过\e790来构建
1
但在element-plus中不支持,另外多了一层el-input__wrapper
1
因此调整样式为

.time_input {
  .el-input__wrapper{
    border-radius: 8px;
      background-color: #4F71FF;
      border-color: #4F71FF !important;
      // color: #fff;

    .el-input.is-focus .el-input__inner,
    .el-input__inner.is-focus,
    .el-input__inner {
      width: 140px;
      border-radius: 8px;
      background-color: #4F71FF;
      border-color: #4F71FF !important;
      color: #fff;
    }
    .el-input__suffix {
        height: 40px;
      .el-select__icon {
        color: #fff;
      }
    }
  }
}

前端图标调整如下:
3
5 el-popover关闭的问题
element-ui中下面的写法是可行的
1
但element-plus中操作后,依然不能关闭,解决方案调整为v-model:visible

 <el-popover placement="bottom-start" width="520px" trigger="click"  v-model:visible="visible">

6 el-tabs默认不打开页签的问题
之前使用element-ui 2.15.2,但即使是element-ui也是根据name属性,不知道之前这个value表示什么意思
1
调整后,注意tabIndex: '0',这里使用字符串而不是数值。
1
7 页面不进入created方法
vue 生命周期钩子
1
为什么页面中created方法没有执行,问题出在少了一个括号,created被认为是methods中的方法,没有作为vue生命周期的一个环节,故而出错。

1
7 flex布局的问题
element-plus默认使用flex布局,故而有些之前的布局,就有问题,例如下面的按钮就有错位。
1

// 修正添加列不对齐的问题
:deep(.el-form-item__content){
  align-items: baseline;
}

8 el-table动态render
这个导致按钮样式丢失,变成空的了。
1
因为在vue2中自定义组件写法是这样的

 render: (h,data) => {
              let arr = [{status:data.row.canAdd,text:'新增',authValue:'subject:add',},{status:data.row.canEdit,text:'编辑',authValue:'subject:edit',},{status:data.row.canDelete,text:'删除',authValue:'subject:delete',}]
              let that = this;
              return h('div', arr.map(function (item,index) { //遍历数据进行展示 按需匹配
                if(item.status == '1'){
                  return h('el-button',{
                    props: {
                      type: 'text',
                    },
                    style: {
                      marginRight: '5px'
                    },
                    on:{
                      click:()=>{// 这里给了他一个打印事件,下面有展示图
                        that.onBusClick(data.row,item.text)
                      }
                    },
                    // 使用自定义指令
                    directives: [
                      {
                        name: 'auth',
                        value: item.authValue,
                        // 如有其他参数可以在此添加
                      }
                    ]
                  }, item.text)
                }
              }))
            }
          }

但vue3中的写法发生变化了,调整如下:

render: (h,data) => {
              return h('span',{style:{display:'flex',justifyContent:'flex-start'}},[
                data.row.canAdd == '1'? h(<el-button class="button" type="text"  onClick={()=>{this.onBusClick(data.row,'新增')}} v-auth="subject:add" >新增</el-button>):null,
                data.row.canEdit == '1'? h(<el-button class="button" type="text"  onClick={()=>{this.onBusClick(data.row,'编辑')}} v-auth="subject:edit">编辑</el-button>):null, 
                data.row.canDelete == '1'? h(<el-button class="button" type="text"  onClick={()=>{this.onBusClick(data.row,'删除')}} v-auth="subject:delete" >删除</el-button>):null,
              ]
              )
            }

如此上面,操作列可以出来了,但这样写指令是否生效,还需验证
在这里插入图片描述

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
升级Vue2到Vue3需要注意以下几点: 1. Vue3将成为官方的重点研发版本,因此周边生态、组件、插件等都会以Vue3为默认版本进行维护和更新,而Vue2的组件插件库将逐渐停止维护和迭代更新。因此,为了跟上时代的步伐,建议转向Vue3。\[1\] 2. 在Vue2中,全局挂载(Vue.prototype)的写法在Vue3中不再适用,需要修改为使用createApp函数来创建应用,并使用app.config.globalProperties来进行全局挂载。\[2\] 3. 组件库的语法也会有所修改,例如element-UI改用elementPLus,引入方式和部分组件用法都有所改变。需要根据具体的组件库文档进行相应的修改。\[2\] 4. 废弃语法也需要进行修改,例如插槽语法的改写,以及一些被废弃的语法需要改成对应Vue3的语法。需要仔细查看Vue3的官方文档进行相应的修改。\[2\] 5. 生命周期的命名也有所修改,例如destroyed生命周期选项被重命名为unmounted,beforeDestroy生命周期选项被重命名为beforeUnmount。需要注意修改相应的生命周期钩子函数的命名。\[2\] 6. Vue3中的v-model用法也有所改变,需要参考官方文档进行相应的修改。\[2\] 7. 在Vue3中,无法直接使用this来调用上下文方法,需要使用proxy来获取data和methods的内容。需要注意修改相关代码。\[2\] 总之,升级Vue2到Vue3需要仔细阅读Vue3的官方文档,并根据具体情况进行相应的修改。逐步替换Vue2框架为Vue3,并按照Vue3的composition API结构来编写新增的页面和组件。\[3\] #### 引用[.reference_title] - *1* *2* [手摸手带你玩转Vue3——Vue2升级Vue3](https://blog.csdn.net/weixin_46709512/article/details/124966678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Vue2 大型项目升级 Vue3 详细经验总结](https://blog.csdn.net/Kevinblant/article/details/126238184)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

warrah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值