Vue集成Excalidraw实现在线画板功能

简介: Excalidraw是一款开源在线绘图工具,适用于白板、思维导图、原型设计等场景。支持手绘风格、多种图形元素、导出功能及多人协作,深受开发者喜爱。本文档介绍了如何在Vue项目中集成Excalidraw,包括安装依赖、配置文件修改、页面添加等步骤,帮助开发者快速上手。

Excalidraw概述

‌Excalidraw‌是一款开源的在线绘图工具,主要用于白板、思维导图、原型草图设计、流程图等场景。它基于Vite + React + TypeScript + Yarn + Husky的技术栈开发,目前开源star数量已经超过86k,深受开发者喜爱‌。
tips:体验地址 https://excalidraw.com

功能特点

  • 手绘风格‌:Excalidraw支持手绘风格的草图设计,使得绘制过程更加自然和亲切‌。
  • 多种图形元素‌:支持基本的几何形状如方框、圆、菱形等,并可以绘制连接线‌。
  • 导出功能‌:支持将图形内容导出为图片或SVG格式,方便在其他设备上导入编辑‌。
  • ‌多人协作‌:支持多人协同工作,可以通过分享链接让其他人加入同一个白板进行创作‌。
  • ‌自定义主题‌:用户可以自定义主题风格,满足不同的业务场景需求‌。

    使用场景

    Excalidraw可以应用于多种场景,包括但不限于:
  • 草图设计‌:用于绘制手绘风格的草图。
  • ‌思维导图和流程图‌:支持创建复杂的思维导图和流程图。
  • ‌会议白板‌:适合在会议中使用,支持激光笔标注等功能。
  • 知识管理‌:在Obsidian笔记应用中嵌入Excalidraw插件,用于组织和表达复杂信息‌

VUE集成

tips:官方文档 https://docs.excalidraw.com/docs

1. 引入依赖

npm install react react-dom @excalidraw/excalidraw
# 或
yarn add react react-dom @excalidraw/excalidraw

2. 添加配置

修改vite.config.js,添加如下配置:

export default defineConfig({
  ...,
  define: {
    'process.env': {}
  },
})

2. 添加页面

tips:GitHub解决办法仅能初始化画板,不能获取浏览器缓存信息,需要在初始化进行处理

<template>
  <div class="container">
    <div class="excalidraw" id="excalidraw"></div>
  </div>
</template>

<script>
import React from 'react'
import { createRoot } from 'react-dom/client'
import { Excalidraw } from '@excalidraw/excalidraw'

let root = null
let app = null
export default {
  data() {
    return {
      appState: {
        // 默认的 appState 配置
        viewBackgroundColor: '#fff', // 画布背景颜色
        currentItemStrokeColor: '#000000', // 当前绘画工具颜色
        currentItemBackgroundColor: '#ffffff', // 当前工具填充颜色
        activeTool: 'selection', // 默认工具为选择工具
        zoom: 1 // 缩放比例
      }
    }
  },
  mounted() {
    // 组件挂载时恢复绘画数据和 appState
    this.initializeExcalidraw()
  },
  unmounted() {
    // 组件卸载时销毁 Excalidraw 实例
    if (root) {
      root.unmount()
    }
  },
  methods: {
    initializeExcalidraw() {
      const savedElements = localStorage.getItem('excalidrawElements')
      const savedAppState = localStorage.getItem('appState')

      const initialData = savedElements
        ? JSON.parse(savedElements)
        : { elements: [], appState: this.appState }
      const appState = savedAppState ? JSON.parse(savedAppState) : this.appState

      const excalidrawElement = React.createElement(Excalidraw, {
        initialData: initialData,
        onChange: this.handleDrawingChange,
        excalidrawAPI: this.excalidrawAPI,
        langCode: 'zh-CN'
      })

      root = createRoot(document.getElementById('excalidraw'))
      root.render(excalidrawElement)
    },

    handleDrawingChange(elements, newAppState) {
      let state = app.getAppState()
      console.log(state, 'state')

      let { collaborators, ...appState } = state
      console.log(appState, 'appState')

      // delete state.collaborators;
      localStorage.setItem(
        'excalidrawElements',
        JSON.stringify({ elements, appState: appState })
      )
    },

    excalidrawAPI(e) {
      app = e
      window.app = e
    }
  }
}
</script>

<style scoped lang="scss">
.container {
  width: 100%;
  height: 100vh;
  overflow: hidden;
  display: flex;
  flex-direction: column;

  .header {
    height: 3rem;
    line-height: 3rem;
    padding: 0 1rem;
    font-size: 1.2rem;
    background-color: #038fe5;
    color: white;
  }

  .footer {
    height: 2rem;
    line-height: 2rem;
    text-align: center;
    background-color: #038fe5;
    color: white;
  }

  .excalidraw {
    flex-grow: 1; /* 占满剩余空间 */
    height: 100%;
  }
}
</style>

3.实现效果

image.png

相关文章
|
7月前
|
XML 前端开发 JavaScript
前端图形学实战: 从零实现编辑器的图层管理面板和实时缩略图(vue3 + vite版)
前端图形学实战: 从零实现编辑器的图层管理面板和实时缩略图(vue3 + vite版)
114 0
vue2实现markdown编辑器,实现同步滚动,实时预览等功能
vue2实现markdown编辑器,实现同步滚动,实时预览等功能
|
2月前
|
移动开发 JSON 数据可视化
精选八款包括可视化CMS,jquery可视化表单,vue可视化拖拉,react可视化源码
精选八款包括可视化CMS,jquery可视化表单,vue可视化拖拉,react可视化源码
53 0
|
7月前
|
缓存 JavaScript 测试技术
Vue 3实战:打造交互丰富的任务管理应用
Vue 3实战:打造交互丰富的任务管理应用
178 0
|
前端开发 JavaScript API
React Echarts 使用教程 - 如何在 React 中加入图表(内附数据看板实战搭建案例)
Ehcarts 作为数据展示的组件,应用场景丰富,所以在 React 里引入 Echarts 图表是每个前端必会技能。而 Echarts配置项多且复杂,每个配置项都会细分很多个配置小项,并且还对外暴露了一套 API,包括图表实例,事件监听等,还是有一定的上手难度。本文手把手教大家如何在 React 里使用 Echarts,并结合实际使用场景,分享我是如何处理图表自适应等具体问题。 最后来一个实战教学,教大家如何结合 ant-design React UI 框架,开发企业级的「数字币走势数据看板」,帮助大家加深对 Echarts 的理解。
|
JavaScript 前端开发 数据可视化
Vue 引入高德地图:实现地图展示与交互
本文将介绍如何在Vue项目中引入高德地图,以及如何实现地图的展示和交互功能。我们将从安装依赖开始,然后配置高德地图的密钥和相关插件,最后演示如何在Vue组件中使用地图组件和实现基本的交互功能。通过本文的指导,您将能够轻松地在Vue项目中集成高德地图,实现地图的展示与交互。
618 1
|
JavaScript
【Vue 开发实战】实战篇 # 45:如何构建可交互的组件文档让代码高亮的显示在页面
【Vue 开发实战】实战篇 # 45:如何构建可交互的组件文档让代码高亮的显示在页面
205 0
【Vue 开发实战】实战篇 # 45:如何构建可交互的组件文档让代码高亮的显示在页面
|
小程序 前端开发 开发者
TDesign小程序组件库体验
书山有路勤为径,学海无涯苦做舟
744 0
TDesign小程序组件库体验
|
定位技术 API 开发工具
【Vue3.0移动端项目--旅游网】-- 集成百度地图以及底部模块
【Vue3.0移动端项目--旅游网】-- 集成百度地图以及底部模块
324 0
【Vue3.0移动端项目--旅游网】-- 集成百度地图以及底部模块
|
JavaScript 前端开发 数据可视化
最好用的 6 款 Vue 拖拽组件库推荐 - 卡拉云
Vue 拖拽组件库(drag-and-drop)组件在使用 Vue 框架开发中非常常见的需求,做个内容行排序,拖拽小组件到网页上这类都需要用到拖拽组件。本文记录了我自己用过的 6 款 Vue 拖拽组件库,它们各有各的特点,推荐给大家。
1349 0