接续上一篇文章,向下探索
大致项目架构如下图所示:
由于我们初始化创建的项目框架是最为基础的所以接下来我们将进行一步步拓展:
通过命令:
npm install vue-router@4
安装路由
创建路由配置文件:
在 src
目录下创建 router
文件夹,并在其中创建 index.js
文件:
// src/router/index.js import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue' // 需创建该组件 const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', // 路由懒加载 component: () => import('../views/About.vue') } ] const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes }) export default router
创建视图文件夹“views”,并在里面添加视图组件
在 src/views
目录下创建组件文件(如 Home.vue
、About.vue
):
示例代码:首页
在主应用中挂载路由
修改 src/main.js
文件:
// src/main.js import { createApp } from 'vue' import App from './App.vue' import router from './router' createApp(App) .use(router) .mount('#app')
还有一种写法:
// src/main.js import { createApp } from 'vue' import App from './App.vue' import router from './router' const app = createApp(App); app.use(router); app.mount('#app');
个人而言,更喜欢第二种写法(hahahah)
正如以上第2点创建路由配置文件所示,因为有该界面的路由导航路径所以我们就在Home.vue组件中进行导入功能组件
在标签中添加以下代码: import Design_layout from '../components/Design_layout.vue';
注意:组件路径要根据你项目架构的实际情况来:
有种方法:配置别名:
配置 Vite 别名
在 vite.config.js
中添加 resolve.alias
配置:
lve.alias
配置:
// vite.config.js import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import path from 'path' // 需要安装 @types/node:npm i @types/node -D export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': path.resolve(__dirname, 'src') // 将 @ 指向 src 目录 } } })
TypeScript 项目配置(可选)
如果使用 TypeScript,需在 tsconfig.json
中添加 compilerOptions.paths
配置:
// tsconfig.json { "compilerOptions": { "baseUrl": ".", "paths": { "@/*": ["src/*"] // 与 Vite 配置保持一致 } } }
使用绝对路径(别名)
配置完成后,可以使用 @
作为 src
目录的别名:
// 导入组件(绝对路径) import Home from '@/views/Home.vue' // 导入工具函数 import { formatDate } from '@/utils/date' // 导入样式 import '@/styles/main.css'
相对路径与绝对路径对比
相对路径:基于当前文件位置的路径,如 ../components/Button.vue
绝对路径:基于 src
目录的路径,如 @/components/Button.vue
示例对比:
// 相对路径(复杂) import Button from '../../components/Button.vue' // 绝对路径(简洁) import Button from '@/components/Button.vue'
CSS / 样式中的路径引用
在 CSS 中使用别名需要添加 ~
前缀(Vite 支持):
/* 使用绝对路径引入图片 */ .logo { background-image: url('~@/assets/logo.png'); }
温馨提示:
VScode中的智能提示:可使用以下命令:
npm install @types/node --save-dev
使用命令安装依赖:
npm install vue-konva konva
vue-konva
:Vue.js 的 Konva 包装器
konva
:核心绘图库(HTML5 Canvas API 的 JavaScript 实现)
全局注册组件
在组件中使用(局部注册)
若不想全局注册,可在组件中局部导入:
示例代码:
响应式更新
使用 ref
或 reactive
包装配置对象,确保数据变化时 Canvas 自动更新:
// 使用 ref 包装配置 const configRect = ref({ // 配置项... }) // 更新属性时触发重绘 const changeColor = () => { configRect.value.fill = 'red' }
事件绑定
通过 @事件名
绑定 Konva 对象的原生事件:
类型支持(TypeScript)
若使用 TypeScript,需安装类型定义:
npm install @types/konva --save-dev
参考示例
注意事项
安装配置完成后,你可以在项目中使用 vue-konva
创建交互式 Canvas 应用,如数据可视化、游戏、绘图工具等。
性能优化:大量动态图形时,使用 v-memo
或 v-show
避免不必要的重绘
生命周期:Canvas 对象在组件卸载时会自动销毁,无需手动处理
版本兼容:确保使用 [email protected]
版本以兼容 Vue3
我想要在页面上拖拽多个图标
如下所示:
顶部导入图标
import cameraIcon from '@/assets/icons/摄像头.png' import roomIcon from '@/assets/icons/房间.png' import areaIcon from '@/assets/icons/监测范围.png' ......(n个图片)
在 icons
中使用这些变量
const icons = ref([ { type: 'camera', name: '相机', src: cameraIcon, loaded: false }, { type: 'edit', name: '房间', src: roomIcon, loaded: false }, { type: 'setting', name: '监测范围', src: areaIcon, loaded: false } ])
小型项目可以直接将所需要的图片放入public文件夹中,中大型项目最好在assets文件夹中进行资源导入
使用 import.meta.glob
动态引入图标
你可以这样做:
第 1 步:自动导入 icons 目录下的所有图片
const iconModules = import.meta.glob('@/assets/icons/*.png', { eager: true, import: 'default' }) const icons = ref(Object.entries(iconModules).map(([path, src]) => { const name = path.split('/').pop().replace('.png', '') return { type: name, name: name, // 或自定义中文名映射 src, loaded: false } }))
如果你需要中文名:
你可以做个映射表:
js复制编辑const nameMap = { '摄像头': '相机', '房间': '房间', '监测范围': '监测范围' } const icons = ref(Object.entries(iconModules).map(([path, src]) => { const filename = path.split('/').pop().replace('.png', '') return { type: filename, name: nameMap[filename] || filename, src, loaded: false } }))
确保 vite.config.js
中未禁用 glob 功能(默认是启用的),并确保路径是 @/assets/...
这种形式,Vite 支持别名 @ -> src
。
HTML5 拖放 API:
draggable
属性使元素可拖拽
dragstart
事件设置拖拽数据
dragover
和drop
事件处理目标区域放置逻辑
Konva.js 集成:
使用v-image
组件渲染图标
通过ref
获取 Konva 舞台对象
计算鼠标坐标与舞台的相对位置
数据管理:
droppedIcons
数组保存所有放置的图标
每个图标对象包含位置、尺寸和图像数据
响应式更新确保视图同步
示例代码:
极简拖拽示例