原文地址

  1. // 背景叙述
  2. // 这次升级想要把之前后台网站 vue2 版本的部分代码 拷贝到 vue3 的项目里。
  3. // 就是想要偷懒 (ↀ ω ↀ)
  4. //
  5. // ---------- (= ̄ω ̄=) --------- 分割线 ---------- Σ( ° △ °|||)︴----------
  6. //
  7. // 本次项目使用框架插件
  8. // ['vue3', 'vuex', 'antd2', 'vue-router', 'axios']


一. 准备部分

  1. 安装vue3
  1. # 卸载
  2. $ npm uninstall vue-cli
  3. # 安装
  4. $ npm install -g @vue/cli
  5. # 升级
  6. $ vue upgrade --next
  7. # 最新稳定版
  8. $ npm install vue@next
  1. 构建 vue3 项目 ``` // project name ‘level-up’ $ vue create levelUp

Please pick a preset: Manually select features ? Check the features needed for your project: Choose Vue version, Babel, Router, Vuex, Linter ? Choose a version of Vue.js that you want to start the project with 3.x (Preview) ? Use history mode for router? (Requires proper server setup for index fallback in production) Yes ? Pick a linter / formatter config: Prettier ? Pick additional lint features: Lint on save ? Where do you prefer placing config for Babel, ESLint, etc.? In package.json ? Save this as a preset for future projects? Yes ? Save preset as: default

$ cd level-up $ npm install antd axios —save

  1. <br />3. 代码迁移
  2. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/21425465/1646977846670-b2a152b2-ee96-42e8-8cfb-d3279696855b.png#clientId=u892916c8-92f3-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ub836ee29&margin=%5Bobject%20Object%5D&name=image.png&originHeight=175&originWidth=175&originalType=url&ratio=1&rotation=0&showTitle=false&size=62907&status=done&style=none&taskId=u935557bb-9b94-4b6b-b6d2-dddb4b60c87&title=)<br />ちょっと待ってください
  3. <a name="ehmrR"></a>
  4. ## **二. 升级 level Up**
  5. <a name="MP6T4"></a>
  6. ## **vue2 **➝** vue3**
  7. [介绍 | Vue.jsv3.cn.vuejs.org/guide/migration/introduction.html#%E6%A6%82%E8%A7%88](https://link.zhihu.com/?target=https%3A//v3.cn.vuejs.org/guide/migration/introduction.html%23%25E6%25A6%2582%25E8%25A7%2588)<br />**antd ➝ antd22**<br />[Ant Design Vue2x.antdv.com/docs/vue/migration-v2-cn](https://link.zhihu.com/?target=https%3A//2x.antdv.com/docs/vue/migration-v2-cn)
  8. **问题**
  9. ```json
  10. // 报问题 Vue
  11. // warning Replace `xxx` with `“xxx“` prettier/prettier
  12. // 配置 .prettierrc
  13. {
  14. "singleQuote": true,
  15. "semi": false,
  16. "bracketSpacing": true,
  17. "htmlWhitespaceSensitivity": "ignore",
  18. "arrowParens": "avoid"
  19. }
  20. // 执行
  21. $ npm run lint --fix
  22. // 重启编辑器
  23. // OR
  24. // 配置 package.json 修改 rules
  25. "rules": {
  26. "semi": 0,
  27. "quotes": 0,
  28. ...
  29. }
  30. // 接着 再重新编译就好了

slot

  1. <!-- 报问题 vue -->
  2. <!-- `slot` attributes are deprecated -->
  3. <!-- 问题 -->
  4. <span slot="title"></span>
  5. or
  6. <span slot="title" slot-scope="xxx"></span>
  7. <!-- 解决 -->
  8. <template #title></template>
  9. or
  10. <template #title="{xxx}"></template>

deep

  1. // 报问题 CSS 编译时错误
  2. // node
  3. // the >>> and /deep/ combinators have been deprecated. Use :deep() instead.
  4. // 错误
  5. /deep/ .a{}
  6. // 正确
  7. /* deep selectors */
  8. ::v-deep(.a) {}
  9. /* shorthand */
  10. :deep(.a) {}
  11. /* targeting slot content */
  12. ::v-slotted(.a) {}
  13. /* shorthand */
  14. :slotted(.a) {}
  15. /* one-off global rule */
  16. ::v-global(.a) {}
  17. /* shorthand */
  18. :global(.a) {}

keep-alive升级

  1. <!-- 报问题 antd2 -->
  2. <!-- <router-view> can no longer be used directly inside <transition> or <keep-alive>. Use slot props instead: -->
  3. // before
  4. <keep-alive>
  5. <transition v-if="$route.meta.keepAlive">
  6. <router-view></router-view>
  7. </transition>
  8. </keep-alive>
  9. <transition v-if="!$route.meta.keepAlive">
  10. <router-view></router-view>
  11. </transition>
  12. // after
  13. <router-view v-slot="{ Component }">
  14. <transition v-if="$route.meta.keepAlive">
  15. <component :is="Component" />
  16. </transition>
  17. <transition v-if="!$route.meta.keepAlive">
  18. <component :is="Component" />
  19. </transition>
  20. </router-view>

废弃icon

修改
Antd 2
1 . Form
合并了 FormModel、Form,详见下方的 Form 重构部分。
form 表单除了样式以外,其他需要重构。

  1. v-model
    v-model 更改成 v-model:xxx,具体涉及组件:
    v-model 改成 v-model:checked 的组件有: CheckableTag、Checkbox、Switch
    v-model 改成 v-model:value 的组件有: Radio、Mentions、CheckboxGroup、Rate、DatePicker
    v-model 改成 v-model:visible 的组件有: Tag、Popconfirm、Popove、Tooltip、Moda、Dropdown
    v-model 改成 v-model:activeKey 的组件有: Collaps、Tabs
    v-model 改成 v-model:current 的组件有: Steps
    v-model 改成 v-model:selectedKeys 的组件有: Menu

  2. icon
    官方图标组件不能和 1.x 版本一样,允许 自定义 icon 和 官方 icon 合并使用。
    官方文档里没有合并使用的 案例 和 api。
    必须分开使用。。。
    image.png
    我想了很多办法,将两者合并为一个组件,然后根据 type 属性 调用 icon。
    ……
    ……
    ……
    然而
    image.png
    官方
    image.png

就只能这样了吗?
image.png

跑去 阿里 iconfont 发现了官方图标库
iconfont-阿里巴巴矢量图标库www.iconfont.cn/collections/detail?spm=a313x.7781069.1998910419.d9df05512&cid=9402
全部添加到自定义的项目里面,然后调用就可以了。

v-model升级

. 完成

总结:

  1. antd2 文档有按需引入,但都是在 main.js 创建的 app 对象 use 引入。

image.png

相关组件介绍里也没有告诉如何引入。。。

这样可以在单页面里引入,
import {Menu} from ‘ant-design-vue’ export default { components:{ ‘AMenu’:menu, ‘AMenuItem’:menu.Item, ‘ASubMenu’:Menu.SubMenu, … }
但是这写法。。。

image.png

看了 Menu 组件的源码
image.png

好家伙,这是告诉我这么写吗?

  1. import {Menu} from 'ant-design-vue'
  2. export default {
  3. created() {
  4. Menu.install(this.$.appContext.app)
  5. }
  6. }

于是只能放弃 按需引入,使用全局引入

  1. 使用 from 验证每次输入都会提示。
    在 node_modules/async-validator/dist-node 和 /dist-node 目录里修改 index.js
    把 console.warn 禁用就可以了。