在 Vue 中集成
如果你正在寻找使用 Vue 组件作为自定义组件的方法,请参阅此处。
在集成 Univer 到 Vue 项目前,请确保你已经阅读了安装和基本使用章节,并了解 Vue 组件和生命周期钩子。
Vue 3.x
集成前须知
- 应避免对 Univer 和 FUniver 的实例进行代理,否则可能会引起不可预知的错误或性能问题。
集成步骤
- 在
onMounted钩子中初始化 Univer - 在
onBeforeUnmount钩子中销毁 Univer
示例代码
Vue
<script lang="ts" setup>import type { Univer } from '@univerjs/presets'import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'import UniverPresetSheetsCoreZhCN from '@univerjs/preset-sheets-core/locales/zh-CN'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_CN, locales: { [LocaleType.ZH_CN]: mergeLocales( UniverPresetSheetsCoreZhCN, ), }, 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-CN': path.resolve(__dirname, 'node_modules/@univerjs/preset-sheets-core/lib/es/locales/zh-CN.js'), '@univerjs/design/locale/zh-CN': path.resolve(__dirname, 'node_modules/@univerjs/design/lib/es/locale/zh-CN.js'), '@univerjs/docs-ui/locale/zh-CN': path.resolve(__dirname, 'node_modules/@univerjs/docs-ui/lib/es/locale/zh-CN.js'), '@univerjs/sheets-formula-ui/locale/zh-CN': path.resolve(__dirname, 'node_modules/@univerjs/sheets-formula-ui/lib/es/locale/zh-CN.js'), '@univerjs/sheets-formula/locale/zh-CN': path.resolve(__dirname, 'node_modules/@univerjs/sheets-formula/lib/es/locale/zh-CN.js'), '@univerjs/sheets-numfmt-ui/locale/zh-CN': path.resolve(__dirname, 'node_modules/@univerjs/sheets-numfmt-ui/lib/es/locale/zh-CN.js'), '@univerjs/sheets-ui/locale/zh-CN': path.resolve(__dirname, 'node_modules/@univerjs/sheets-ui/lib/es/locale/zh-CN.js'), '@univerjs/sheets/facade': path.resolve(__dirname, 'node_modules/@univerjs/sheets/lib/facade.js'), '@univerjs/sheets/locale/zh-CN': path.resolve(__dirname, 'node_modules/@univerjs/sheets/lib/es/locale/zh-CN.js'), '@univerjs/ui/locale/zh-CN': path.resolve(__dirname, 'node_modules/@univerjs/ui/lib/es/locale/zh-CN.js'), '@wendellhu/redi/react-bindings': path.resolve(__dirname, 'node_modules/@wendellhu/redi/dist/esm/react-bindings/index.js'), // ... }, }, },}集成步骤
- 在
mounted钩子中初始化 Univer - 在
beforeDestroy钩子中销毁 Univer
示例代码
Vue
<script>import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'import UniverPresetSheetsCoreZhCN from '@univerjs/preset-sheets-core/locales/zh-CN'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_CN, locales: { [LocaleType.ZH_CN]: mergeLocales( UniverPresetSheetsCoreZhCN, ), }, 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>你觉得这篇文档如何?