feat: MarkdownEditor 组件的高度和宽度自适应

This commit is contained in:
Frankie Huang 2025-04-05 20:58:04 +08:00
parent 69ee6dfd4c
commit f832daa10e
2 changed files with 45 additions and 22 deletions

View File

@ -56,3 +56,9 @@ This template should help get you started developing with Tauri + Vue 3 in Vite.
2. 使用 <Split> 分割左右面板
3. 使用 <Tree> 树形控件渲染文件树
4. 联动 SelectFolder、FolderTree 和 MarkdownEditor 组件
## 监听并动态调整 MarkdownEditor 的高宽度
1. MarkdownEditor 加载完成后,重新自适应高度
2. 监听 Split 的数值变化,调整 MarkdownEditor 的宽度
3. 监听窗口 resize 事件,调整 MarkdownEditor 的高度和宽度

View File

@ -1,5 +1,5 @@
<script setup>
import { ref, watch, onMounted, onUnmounted } from "vue";
import { ref, watch, useTemplateRef, onMounted, onUnmounted } from "vue";
import { invoke } from "@tauri-apps/api/core";
import { readTextFile, writeTextFile } from '@tauri-apps/plugin-fs';
import MarkdownEditor from './components/MarkdownEditor.vue'
@ -16,31 +16,39 @@ async function greet() {
//
const split = ref(0.2)
const hiddenSplitRight = ref("")
const splitRight = useTemplateRef('splitRight')
watch(split, (newSplit, oldSplit) => {
// split
if (newSplit < 0.05) {
// TODO
if (hiddenSplitRight.value == "") {
hiddenSplitRight.value = "hidden"
}
} else {
if (hiddenSplitRight.value == "hidden") {
hiddenSplitRight.value = ""
}
}
// TODO MarkdownEditor
// let width = newSplit < 0.2 ? '1400px' : '1200px'
// markdownRef.value.resetWidth(width)
// markdownRef.value.resetHeight(window.innerHeight - 15)
// MarkdownEditor
const width = splitRight.value.offsetWidth
// reset reset CodeMirror
// 使 splitRight.value.offsetWidth 使 100%
markdownRef.value.resetWidth("100%")
})
// markdown
const windowWidth = ref(window.innerWidth)
const windowHeight = ref(window.innerHeight)
const handleResize = () => {
windowWidth.value = window.innerWidth
windowHeight.value = window.innerHeight
// console.log(windowWidth.value)
// console.log(windowHeight.value)
markdownRef.value.resetWidth(windowWidth.value - 15)
markdownRef.value.resetHeight(windowHeight.value - 15)
//
function reloadEditorHeight() {
markdownRef.value.resetHeight(window.innerHeight)
}
onMounted(() => window.addEventListener('resize', handleResize))
onUnmounted(() => window.removeEventListener('resize', handleResize))
// markdown
const handleWindowResize = () => {
markdownRef.value.resetWidth("100%")
markdownRef.value.resetHeight(window.innerHeight)
}
onMounted(() => window.addEventListener('resize', handleWindowResize))
onUnmounted(() => window.removeEventListener('resize', handleWindowResize))
// <SelectFolder> folderTreeData <FolderTree>
const folderTreeData = ref(null)
@ -80,16 +88,17 @@ async function writeFileContent() {
<Split v-model="split">
<template #left>
<div class="split-left">
<SelectFolder @folder-selected="showFileTree" />
<FolderTree :treeData="folderTreeData" @file-selected="loadFileContent" />
<SelectFolder :class="hiddenSplitRight" @folder-selected="showFileTree" />
<FolderTree :class="hiddenSplitRight" :treeData="folderTreeData" @file-selected="loadFileContent" />
</div>
</template>
<template #trigger>
<div class="split-trigger"></div>
</template>
<template #right>
<div class="split-right">
<MarkdownEditor ref="markdownRef" width='800px' height='500px' markdownCode="# hello tauri" />
<div ref="splitRight" class="split-right">
<MarkdownEditor ref="markdownRef" width="100%" height="100%" markdownCode="# hello tauri"
:onload="reloadEditorHeight" />
</div>
</template>
</Split>
@ -119,5 +128,13 @@ body {
.split-trigger:hover {
cursor: ew-resize;
}
.split-right {
margin-left: 5px;
}
.hidden {
display: none;
}
</style>
<style></style>