actualización del proyecto vue3 + view-ui-plus + js

Tabla de contenido

editar

1. vue3

1.2 Componentes de referencia en main.js

Dos, modificación del enrutador vue3

3. Referencia en vue3 vuex

3.1 configuración de vue3 vuex

3.2 valor de acceso vue3.x en vuex

3.3 Ver los datos en vuex en vue3 mostrará Proxy

Cuarto, la modificación de view-ui-plus en vue3

4.1, método de escritura iview Model upgrade vue3

4.2, iview table upgrade vue3 render método de escritura

4.3, casilla de verificación iview

5. Vue3 usa la versión china de monaco-editor


Esto se actualizará continuamente, todos son bienvenidos a discutir juntos 

Si no tiene una base de vue2, primero puede ver la URL de vue2

Si no entiende la diferencia entre vue2 y vue3, primero puede ver la diferencia que he compilado.La diferencia entre vue3 y vue2 y cómo actualizar (básico para vue2)

O mira el sitio web oficial de vue3  sitio web oficial de vue3 

La estructura del directorio es la siguiente 

1. vue3

1.2 Componentes de referencia en main.js

Método de escritura Vue2.x

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ViewUI from 'view-design';
import 'view-design/dist/styles/iview.css';
import UrlPath from "./axiosConfig/path"

Vue.prototype.GlobalUrl = UrlPath;

Vue.use(ViewUI);

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

Método de escritura Vue3.x

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

const Vue = createApp(App)

import ViewUIPlus from "view-ui-plus"
import "view-ui-plus/dist/styles/viewuiplus.css"
import UrlPath from "./axiosConfig/path"

Vue.config.globalProperties.GlobalUrl = UrlPath;

Vue.use(store).use(router).use(ViewUIPlus).mount('#app')

el lugar necesita cambiar

import Vue from 'vue' 
import { createApp } from 'vue' 
const Vue = createApp(App)

Vue.prototype 改成 Vue.config.globalProperties

Dos, modificación del enrutador vue3

Método de escritura Vue2.x

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
export default new VueRouter({
  linkExactActiveClass: "active",
  mode: 'history',
  base: process.env.VUE_APP_URL_BASE_PATH,
  routes: [
    {
      path: '/',
      redirect: '/versionManagement',
      component: Home,
      children: [
        {
          path: '/versionManagement',
          name: 'versionManagement',
          component: () => import('@/views/versionManagement/versionManagement.vue'),
          meta: {
            title: '版本管理',
            parentId: "versionManagement",
          },
        },
      ]
    },
  ]
})

Método de escritura Vue3.x

import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
const routes = [
  {
    path: '/',
    redirect: '/versionManagement',
    component: Home,
    children: [
      {
        path: '/versionManagement',
        name: 'versionManagement',
        component: () => import(`@/views/versionManagement/versionManagement.vue`),
        meta: {
          title: '版本管理',
          parentId: "versionManagement",
        },
      },
    ]
  },
]
const router = createRouter({
  history: createWebHistory(process.env.VUE_APP_URL_BASE_PATH),
  linkExactActiveClass: "active",
  routes
})

export default router

el lugar necesita cambiar

1,

import VueRouter from 'vue-router'

cambiado a 

import { createRouter, createWebHistory } from 'vue-router'

2, 

la historia es el modo anterior  

historial => crearHistorialWeb、

hash => crearWebHashHistory、

memory =>createMemoryHistory

Por ejemplo

 mode: 'history',
  base: process.env.VUE_APP_URL_BASE_PATH,
const router = createRouter({
  history: createWebHistory(process.env.VUE_APP_URL_BASE_PATH),
  linkExactActiveClass: "active",
  routes
})

3. la base puede estar directamente en createWebHistory (base)

3. Referencia en vue3 vuex

3.1 configuración de vue3 vuex

tienda/index.js

import { createStore } from 'vuex'
import state from './state'
import mutations from './mutations'
import modules from './modules'
import getters from './getter'


export default createStore({
    state,
    getters,
    mutations,
    modules,
})

store/state.js es lo mismo que en vue2

export default{
    datasetData: null,
}

store/mutations.js es lo mismo que en vue2

export default {
    setDatasetData: function (state, value) {
        state.datasetData = value;
    },
}

store/getter.js es lo mismo que en vue2

export default {
    getDatasetData: state => state.datasetData,
}

3.2 valor de acceso vue3.x en vuex

en vue2. 

取值

import { mapGetters, mapMutations } from "vuex";
 
methods: {
    ...mapGetters(["getCodeTreeData"]),
}

let codeTreeData = this.getCodeTreeData()


存值

this.$store.commit("setCodeTreeData", _treeData);

En vue3.x

取值

let codeTreeData = this.$store.getters.getCodeTreeData

存值

this.$store.commit("setCodeTreeData", _treeData);


La diferencia es que los mapGetters se usan en vue 2.x  

3.3 Ver los datos en vuex en vue3 mostrará Proxy

Cuando imprimimos y mostramos a Jiangzi, entra en pánico, es solo un azúcar gramatical de vue3

 

 Si queremos ver sus datos

El primer método se puede ver después de hacer referencia a su toRaw

import { toRaw } from "@vue/reactivity";
toRaw(this.$store.getters.getCodeTreeData)

Nota: El segundo método generará una copia, dejando los datos anteriores, 

//第二种获取target值的方式,通过json序列化之后可获取值
JSON.parse(JSON.stringify(this.$store.getters.getCodeTreeData))

Cuarto, la modificación de view-ui-plus en vue3

4.1, método de escritura iview Model upgrade vue3

Método de escritura de la versión Vue2.x

<Modal :value="modal2" width="500" draggable sticky :mask="false">
      <p slot="header">
        <span> {
   
   { keyTitle }} </span>
      </p>
        
      <div slot="footer">
        <Button @click="modal2 = false">取消</Button>
        <Button type="primary" @click="SubmitForm('formItems')">确定</Button>
      </div>
    </Modal>
  </div>

Método de escritura de la versión Vue3.x

<Modal v-model="modal2" width="500" draggable sticky :mask="false">
      <template #header>
        <p>
          <span> {
   
   { keyTitle }} </span>
        </p>
      </template>
      

      <template #footer>
        <div>
          <Button @click="modal2 = false">取消</Button>
          <Button type="primary" @click="SubmitForm('formItems')">确定</Button>
        </div>
      </template>
    </Modal>

el lugar necesita cambiar 

1. Cambiar: valor a v-modelo

2. La ranura debe estar en la plantilla

4.2, iview table upgrade vue3 render método de escritura

Método de escritura Vue2.x

{
                    title: "更新内容",
                    key: "content",
                    align: "left",
                    render: (h, params) => {
                        return h("div", [
                            h("span", {
                                domProps: {
                                    innerHTML: params.row.content,
                                },
                            }),
                        ]);
                    },
                },
                {
                    title: "操作",
                    key: "action",
                    align: "center",
                    width: 140,
                    render: (h, params) => {
                        return h("div", [
                            h("Icon", {
                                props: {
                                    size: "20",
                                    type: "ios-create",
                                },
                                style: {
                                    marginRight: "5px",
                                    cursor: "pointer",
                                },
                                on: {
                                    click: () => {
                                        this.jumpDetail(params.row);
                                    },
                                },
                            }),
                           
                        ]);
                    },
                },

Método de escritura Vue3.x

{
          title: "更新内容",
          key: "content",
          align: "left",
          render: (h, params) => {
            return h("div", [
              h("span", {
                innerHTML: params.row.content,
              }),
            ]);
          },
        },
        {
          title: "操作",
          key: "action",
          align: "center",
          width: 140,
          render: (h, params) => {
            return h("div", [
              h(
                "i",
                {
                  class: "ivu-icon ivu-icon-ios-create",
                  style: {
                    marginRight: "5px",
                    fontSize: "20px",
                    cursor: "pointer",
                  },
                  onClick: () => {
                    this.jumpDetail(params.row);
                  },
                },
                {
                  default() {
                    return "";
                  },
                }
              ),
              
            ]);
          },
        },
{
          title: "操作",
          key: "action",
          align: "center",
          width: 80,
          render: (h, params) => {
            return h("div", [
              h(
                "div",
                {
                  class: "ivu-btn ivu-btn-default ivu-btn-small ivu-btn-ghost",
                  style: {
                    marginRight: "5px",
                    cursor: "pointer",
                  },
                  onClick: () => {
                    this.sendMail(params.row);
                  },
                },
                {
                  default() {
                    return "发送邮件";
                  },
                }
              ),
            ]);
          },
        },

el lugar necesita cambiar

1. Cuando el tipo es innerHTML, no se usa

 domProps: { innerHTML: params.row.content, }, pero direct innerHTML: params.row.content,

2. Vue3 usa la tabla para mostrar el ícono de operación

En lugar de usar su ícono después de h, use la clase directamente (puede discutir otras formas de escribir esto)

4.3, casilla de verificación iview

vista2.x 

<Checkbox :value="getIsPublic" @on-change="getCheckboxStatus">设置为公共代码</Checkbox>

ver3.x

<Checkbox v-model="getIsPublic" @on-change="getCheckboxStatus">设置为公共代码</Checkbox>

Diferencia: cambiar el valor a v-model

5. Vue3 usa la versión china de monaco-editor

Presta atención a la configuración de la versión.

npm install [email protected] --save
npm install [email protected] --save 

 usar

<template>
  <div :style="myEditorStyle" ref="pieMyEditor" style="height: 100%">
    <div style="height: 100%; width: 100%" ref="pieMyContainer"></div>
  </div>
</template>
<script>
import { setLocaleData } from "monaco-editor-nls";
import zh_CN from "monaco-editor-nls/locale/zh-hans";
setLocaleData(zh_CN);
const monaco = require("monaco-editor/esm/vs/editor/editor.api");

export default {
  props: {
    codes: {
      type: String,
      default: "",
    },
    language: {
      type: String,
      default: "javascript",
    },
  },
  data() {
    return {
      theme: "vs",
      fontSize: 14,
      suggestionsList: [],
      myEditorStyle: {},
      minimapEnabled: false,
    };
  },
  beforeUnmount() {
    // 销毁编辑器
    this.monacoEditor.dispose();
  },
  mounted() {
    this.initEditor();
  },
  methods: {
    initEditor() {
      this.$refs.pieMyContainer.innerHTML = "";
      this.monacoEditor = monaco.editor.create(this.$refs.pieMyContainer, {
        value: this.codes,
        language: this.language,
        theme: this.theme, //vs, hc-black, or vs-dark
        fontSize: this.fontSize,
        selectOnLineNumbers: true,
        roundedSelection: false,
        cursorStyle: "line", //光标样式
        glyphMargin: true, //字形边缘
        useTabStops: false,
        autoIndent: false, //自动布局
        quickSuggestionsDelay: 500, //代码提示延时
        folding: true, // 是否折叠
        foldingHighlight: true, // 折叠等高线
        foldingStrategy: "indentation", // 折叠方式  auto | indentation
        showFoldingControls: "always", // 是否一直显示折叠 always | mouseover
        disableLayerHinting: true, // 等宽优化
        emptySelectionClipboard: false, // 空选择剪切板
        selectionClipboard: false, // 选择剪切板
        automaticLayout: true, // 自动布局
        codeLens: false, // 代码镜头
        scrollBeyondLastLine: false, // 滚动完最后一行后再滚动一屏幕
        colorDecorators: true, // 颜色装饰器
        accessibilitySupport: "off", // 辅助功能支持  "auto" | "off" | "on"
        lineNumbers: "on", // 行号 取值: "on" | "off" | "relative" | "interval" | function
        lineNumbersMinChars: 5, // 行号最小字符   number
        enableSplitViewResizing: false,
        readOnly: false, //是否只读  取值 true | false
        minimap: { enabled: true },
      });
      this.monacoEditor.onDidChangeModelContent((event) => {
        //编辑器内容change事件
        this.$emit("onCodeChange", this.monacoEditor.getValue(), event);
      });
      this.$emit("onMounted", this.monacoEditor); //编辑器创建完成回调
      window.monacoEditor = this.monacoEditor;
      this.monacoEditor.addCommand(
        monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_S,
        () => {
          this.$emit("onSaveCode");
        }
      );
      this.monacoEditor.addCommand(
        monaco.KeyMod.WinCtrl | monaco.KeyCode.KEY_S,
        () => {
          this.$emit("onSaveCode");
        }
      );
    },
    getSuggestions() {
      this.suggestionsList.length = 0;
      pieAPI.forEach((item) => {
        if (item.length > 0) {
          this.getSuggestionsList(item);
        }
      });
    },
    getSuggestionsList(item) {
      item.forEach((ele) => {
        this.suggestionsList.push({
          label: ele.name,
          kind: monaco.languages.CompletionItemKind.Function,
          insertText: ele.name,
          insertTextRules:
            monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
          detail: ele.description ? ele.description : ele.name,
        });

        if (ele.children && ele.children.length > 0) {
          this.getSuggestionsList(ele.children);
        }
      });
    },
  },
};
</script>
<style scoped>
</style>

Configurar en vue.config.js

Nota: asegúrese de prestar atención a la versión de monaco-editor, de lo contrario no se ejecutará

const MonacoWebpackPlugin = require('monaco-editor-esm-webpack-plugin');

 plugins: [
                    new MonacoWebpackPlugin({
                        output: './static/js/monaco-editor',
                        languages: ['javascript', 'css']
                    })
                ]

Supongo que te gusta

Origin blog.csdn.net/xm_w_xm/article/details/126013210
Recomendado
Clasificación