在 Vue 中整合

如果你正在尋找使用 Vue 元件作為自訂元件的方法,請參閱此處。

將 Univer 整合到 Vue 專案前,請先閱讀安裝與基本使用章節,並了解 Vue 元件與生命週期鉤子。

Vue 3.x

整合前須知

  • 應避免對 Univer 與 FUniver 的實例進行代理,否則可能會引發不可預期的錯誤或效能問題。

整合步驟

  1. 在 onMounted 鉤子中初始化 Univer
  2. 在 onBeforeUnmount 鉤子中銷毀 Univer

範例程式碼

Vue
<script lang="ts" setup>import type { Univer } from '@univerjs/presets'import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'import UniverPresetSheetsCoreZhTW from '@univerjs/preset-sheets-core/locales/zh-TW'import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'import { onBeforeUnmount, onMounted, ref } from 'vue'import '@univerjs/preset-sheets-core/lib/index.css'const container = ref<HTMLElement | null>(null)let univerInstance: Univer | null = nullonMounted(() => {  const { univer, univerAPI } = createUniver({    locale: LocaleType.ZH_TW,    locales: {      [LocaleType.ZH_TW]: mergeLocales(        UniverPresetSheetsCoreZhTW,      ),    },    presets: [      UniverSheetsCorePreset({        container: container.value as HTMLElement,      }),    ],  })  univerAPI.createWorkbook({})  univerInstance = univer})onBeforeUnmount(() => {  univerInstance?.dispose()  univerInstance = null})</script><template>  <div ref="container" style="height: 600px" /></template>

Vue 2.x

整合前須知

  • 使用 pnpm 安裝 @univerjs/presets 時,可能會出現需要手動安裝 react 與 react-dom 的情況。
  • 如果在開發環境遇到 ResizeObserver loop limit exceeded 警告,可忽略,或參考下面的程式碼片段解決:
TypeScript
if (process.env.NODE_ENV === 'development') {  const _ResizeObserver = window.ResizeObserver  function debounce(fn, delay) {    let timer = null    return function () {      if (timer) {        clearTimeout(timer)      }      timer = setTimeout(() => {        fn.apply(this, arguments)      }, delay)    }  }  window.ResizeObserver = class ResizeObserver extends _ResizeObserver {    constructor(callback) {      callback = debounce(callback, 50)      super(callback)    }  }}
  • 如果使用 Vue CLI 3.x/4.x (基於 Webpack 4.x) 作為構建工具,你需要手動將映射的路徑修改為實際的路徑:
JavaScript
// vue.config.jsconst path = require('node:path')module.exports = {  transpileDependencies: ['@wendellhu/redi'],  configureWebpack: {    resolve: {      alias: {        '@univerjs/core/facade': path.resolve(__dirname, 'node_modules/@univerjs/core/lib/facade.js'),        '@univerjs/engine-formula/facade': path.resolve(__dirname, 'node_modules/@univerjs/engine-formula/lib/facade.js'),        '@univerjs/preset-sheets-core/lib/index.css': path.resolve(__dirname, 'node_modules/@univerjs/preset-sheets-core/lib/index.css'),        '@univerjs/preset-sheets-core/locales/zh-TW': path.resolve(__dirname, 'node_modules/@univerjs/preset-sheets-core/lib/es/locales/zh-TW.js'),        '@univerjs/design/locale/zh-TW': path.resolve(__dirname, 'node_modules/@univerjs/design/lib/es/locale/zh-TW.js'),        '@univerjs/docs-ui/locale/zh-TW': path.resolve(__dirname, 'node_modules/@univerjs/docs-ui/lib/es/locale/zh-TW.js'),        '@univerjs/sheets-formula-ui/locale/zh-TW': path.resolve(__dirname, 'node_modules/@univerjs/sheets-formula-ui/lib/es/locale/zh-TW.js'),        '@univerjs/sheets-formula/locale/zh-TW': path.resolve(__dirname, 'node_modules/@univerjs/sheets-formula/lib/es/locale/zh-TW.js'),        '@univerjs/sheets-numfmt-ui/locale/zh-TW': path.resolve(__dirname, 'node_modules/@univerjs/sheets-numfmt-ui/lib/es/locale/zh-TW.js'),        '@univerjs/sheets-ui/locale/zh-TW': path.resolve(__dirname, 'node_modules/@univerjs/sheets-ui/lib/es/locale/zh-TW.js'),        '@univerjs/sheets/facade': path.resolve(__dirname, 'node_modules/@univerjs/sheets/lib/facade.js'),        '@univerjs/sheets/locale/zh-TW': path.resolve(__dirname, 'node_modules/@univerjs/sheets/lib/es/locale/zh-TW.js'),        '@univerjs/ui/locale/zh-TW': path.resolve(__dirname, 'node_modules/@univerjs/ui/lib/es/locale/zh-TW.js'),        '@wendellhu/redi/react-bindings': path.resolve(__dirname, 'node_modules/@wendellhu/redi/dist/esm/react-bindings/index.js'),        // ...      },    },  },}

整合步驟

  1. 在 mounted 鉤子中初始化 Univer
  2. 在 beforeDestroy 鉤子中銷毀 Univer

範例程式碼

Vue
<script>import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'import UniverPresetSheetsCoreZhTW from '@univerjs/preset-sheets-core/locales/zh-TW'import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'import '@univerjs/preset-sheets-core/lib/index.css'export default {  mounted() {    const { univer, univerAPI } = createUniver({      locale: LocaleType.ZH_TW,      locales: {        [LocaleType.ZH_TW]: mergeLocales(          UniverPresetSheetsCoreZhTW,        ),      },      presets: [        UniverSheetsCorePreset({          container: this.$refs.container,        }),      ],    })    univerAPI.createWorkbook({})    this.univerInstance = univer  },  beforeDestroy() {    this.univerInstance?.dispose()    this.univerInstance = null  },}</script><template>  <div ref="container" style="height: 600px" /></template>

你覺得這篇文檔如何?

© 2026 DreamNum Co., Ltd.