101 lines
2.2 KiB
Vue
101 lines
2.2 KiB
Vue
<template>
|
|
<div class="demo">
|
|
<input v-model="value.subject" class="field" placeholder="通知主题" />
|
|
|
|
<notify-editor
|
|
ref="editorRef"
|
|
:model-value="value"
|
|
:upload-image="uploadMedia"
|
|
:upload-video="uploadMedia"
|
|
@change="onChange"
|
|
@update:model-value="onChange"
|
|
/>
|
|
|
|
<div class="footer">
|
|
<button type="button" class="btn primary" @click="submit" v-text="'提交'" />
|
|
<span class="status" v-text="status" />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { ref } from "vue";
|
|
import { NotifyEditor } from "timi-tdesign-mobile";
|
|
import type { NotifyDetail, NotifyEditorExpose, UploadResult } from "timi-tdesign-mobile";
|
|
|
|
const value = ref<NotifyDetail>({
|
|
subject: "编辑器通知演示",
|
|
contentType: "TIP_TAP",
|
|
content: `<h2>通知内容</h2>
|
|
<p>通知复用文章编辑器,同时保留自己的元数据字段(如 <code>subject</code>)。</p>`,
|
|
attachmentList: []
|
|
});
|
|
|
|
const status = ref("等待提交");
|
|
const editorRef = ref<NotifyEditorExpose>();
|
|
|
|
function onChange(detail: NotifyDetail) {
|
|
value.value = detail;
|
|
}
|
|
|
|
async function submit() {
|
|
const detail = await editorRef.value?.submit();
|
|
if (detail) {
|
|
value.value = detail;
|
|
status.value = `已提交,正文 ${detail.content?.length || 0} 个字符`;
|
|
}
|
|
}
|
|
|
|
async function uploadMedia(file: File): Promise<UploadResult> {
|
|
return {
|
|
id: `demo-${Date.now()}-${file.name}`,
|
|
name: file.name,
|
|
url: URL.createObjectURL(file)
|
|
};
|
|
}
|
|
</script>
|
|
|
|
<style lang="less" scoped>
|
|
.demo {
|
|
.field {
|
|
width: 100%;
|
|
padding: .375rem .5rem;
|
|
margin-bottom: .75rem;
|
|
box-sizing: border-box;
|
|
font-size: .8125rem;
|
|
border: 1px solid var(--vp-c-divider);
|
|
border-radius: .375rem;
|
|
color: var(--vp-c-text-1);
|
|
background: var(--vp-c-bg);
|
|
}
|
|
|
|
.footer {
|
|
display: flex;
|
|
gap: .75rem;
|
|
align-items: center;
|
|
margin-top: .75rem;
|
|
}
|
|
|
|
.btn {
|
|
padding: .25rem .75rem;
|
|
font-size: .75rem;
|
|
cursor: pointer;
|
|
border: 1px solid var(--vp-c-divider);
|
|
border-radius: .375rem;
|
|
color: var(--vp-c-text-1);
|
|
background: var(--vp-c-bg-soft);
|
|
|
|
&.primary {
|
|
color: #fff;
|
|
border-color: var(--vp-c-brand-1);
|
|
background: var(--vp-c-brand-1);
|
|
}
|
|
}
|
|
|
|
.status {
|
|
font-size: .75rem;
|
|
color: var(--vp-c-text-2);
|
|
}
|
|
}
|
|
</style>
|