fix(markdown): resolving markdown exceptions

修复markdown组件的异常以及不能正确设置value的问题
This commit is contained in:
无木 2021-07-13 15:28:10 +08:00
parent 0a3683a186
commit d95815b503
3 changed files with 54 additions and 27 deletions

View File

@ -21,6 +21,7 @@
- 修复顶栏菜单在显示包含需要隐藏的菜单项目时出错的问题 - 修复顶栏菜单在显示包含需要隐藏的菜单项目时出错的问题
- 修复悬停触发模式下左侧混合菜单会在没有子菜单且被激活时直接跳转路由 - 修复悬停触发模式下左侧混合菜单会在没有子菜单且被激活时直接跳转路由
- **Breadcrumb** 修复带有重定向的菜单点击无法跳转的问题 - **Breadcrumb** 修复带有重定向的菜单点击无法跳转的问题
- **Markdown** 修复初始化异常以及不能正确地动态设置 value 的问题
- **其它** - **其它**
- 修复菜单默认折叠的配置不起作用的问题 - 修复菜单默认折叠的配置不起作用的问题
- 修复`safari`浏览器报错导致网站打不开 - 修复`safari`浏览器报错导致网站打不开

View File

@ -5,18 +5,19 @@
import { import {
defineComponent, defineComponent,
ref, ref,
onMounted,
unref, unref,
onUnmounted,
nextTick, nextTick,
computed, computed,
watch, watch,
onBeforeUnmount,
onDeactivated,
} from 'vue'; } from 'vue';
import Vditor from 'vditor'; import Vditor from 'vditor';
import 'vditor/dist/index.css'; import 'vditor/dist/index.css';
import { useLocale } from '/@/locales/useLocale'; import { useLocale } from '/@/locales/useLocale';
import { useModalContext } from '../../Modal'; import { useModalContext } from '../../Modal';
import { useRootSetting } from '/@/hooks/setting/useRootSetting'; import { useRootSetting } from '/@/hooks/setting/useRootSetting';
import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated';
type Lang = 'zh_CN' | 'en_US' | 'ja_JP' | 'ko_KR' | undefined; type Lang = 'zh_CN' | 'en_US' | 'ja_JP' | 'ko_KR' | undefined;
@ -26,7 +27,7 @@
height: { type: Number, default: 360 }, height: { type: Number, default: 360 },
value: { type: String, default: '' }, value: { type: String, default: '' },
}, },
emits: ['change', 'get'], emits: ['change', 'get', 'update:value'],
setup(props, { attrs, emit }) { setup(props, { attrs, emit }) {
const wrapRef = ref<ElRef>(null); const wrapRef = ref<ElRef>(null);
const vditorRef = ref<Nullable<Vditor>>(null); const vditorRef = ref<Nullable<Vditor>>(null);
@ -36,17 +37,16 @@
const { getLocale } = useLocale(); const { getLocale } = useLocale();
const { getDarkMode } = useRootSetting(); const { getDarkMode } = useRootSetting();
const valueRef = ref('');
watch( watch(
[() => getDarkMode.value, () => initedRef.value], [() => getDarkMode.value, () => initedRef.value],
([val]) => { ([val, inited]) => {
const vditor = unref(vditorRef); if (!inited) {
if (!vditor) {
return; return;
} }
const theme = val === 'dark' ? 'dark' : undefined; const theme = val === 'dark' ? 'dark' : 'classic';
vditor.setTheme(theme as 'dark'); instance.getVditor()?.setTheme(theme);
}, },
{ {
immediate: true, immediate: true,
@ -54,6 +54,16 @@
} }
); );
watch(
() => props.value,
(v) => {
if (v !== valueRef.value) {
instance.getVditor()?.setValue(v);
valueRef.value = v;
}
}
);
const getCurrentLang = computed((): 'zh_CN' | 'en_US' | 'ja_JP' | 'ko_KR' => { const getCurrentLang = computed((): 'zh_CN' | 'en_US' | 'ja_JP' | 'ko_KR' => {
let lang: Lang; let lang: Lang;
switch (unref(getLocale)) { switch (unref(getLocale)) {
@ -72,54 +82,59 @@
return lang; return lang;
}); });
function init() { function init() {
const wrapEl = unref(wrapRef); const wrapEl = unref(wrapRef) as HTMLElement;
if (!wrapEl) return; if (!wrapEl) return;
const bindValue = { ...attrs, ...props }; const bindValue = { ...attrs, ...props };
vditorRef.value = new Vditor(wrapEl, { vditorRef.value = new Vditor(wrapEl, {
theme: 'classic', theme: getDarkMode.value === 'dark' ? 'dark' : 'classic',
lang: unref(getCurrentLang), lang: unref(getCurrentLang),
mode: 'sv', mode: 'sv',
preview: { preview: {
actions: [], actions: [],
}, },
input: (v) => { input: (v) => {
// emit('update:value', v); valueRef.value = v;
emit('update:value', v);
emit('change', v); emit('change', v);
}, },
after: () => {
nextTick(() => {
modalFn?.redoModalHeight?.();
initedRef.value = true;
});
},
blur: () => { blur: () => {
unref(vditorRef)?.setValue(props.value); //unref(vditorRef)?.setValue(props.value);
}, },
...bindValue, ...bindValue,
cache: { cache: {
enable: false, enable: false,
}, },
}); });
initedRef.value = true;
} }
const instance = { const instance = {
getVditor: (): Vditor => vditorRef.value!, getVditor: (): Vditor => vditorRef.value!,
}; };
onMounted(() => { function destroy() {
nextTick(() => {
init();
setTimeout(() => {
modalFn?.redoModalHeight?.();
}, 200);
});
emit('get', instance);
});
onUnmounted(() => {
const vditorInstance = unref(vditorRef); const vditorInstance = unref(vditorRef);
if (!vditorInstance) return; if (!vditorInstance) return;
try { try {
vditorInstance?.destroy?.(); vditorInstance?.destroy?.();
} catch (error) {} } catch (error) {}
vditorRef.value = null;
}
onMountedOrActivated(() => {
nextTick(() => {
init();
});
emit('get', instance);
}); });
onBeforeUnmount(destroy);
onDeactivated(destroy);
return { return {
wrapRef, wrapRef,
...instance, ...instance,

View File

@ -1,7 +1,13 @@
<template> <template>
<PageWrapper title="MarkDown组件示例"> <PageWrapper title="MarkDown组件示例">
<a-button @click="toggleTheme" class="mb-2" type="primary"> 黑暗主题 </a-button> <a-button @click="toggleTheme" class="mb-2" type="primary"> 黑暗主题 </a-button>
<MarkDown :value="value" @change="handleChange" ref="markDownRef" /> <a-button @click="clearValue" class="mb-2" type="default"> 清空内容 </a-button>
<MarkDown
v-model:value="value"
@change="handleChange"
ref="markDownRef"
placeholder="这是占位文本"
/>
</PageWrapper> </PageWrapper>
</template> </template>
<script lang="ts"> <script lang="ts">
@ -30,11 +36,16 @@
valueRef.value = v; valueRef.value = v;
} }
function clearValue() {
valueRef.value = '';
}
return { return {
value: valueRef, value: valueRef,
toggleTheme, toggleTheme,
markDownRef, markDownRef,
handleChange, handleChange,
clearValue,
}; };
}, },
}); });