b-code-editor通过$nextTick方法清除数据

文章讲述了作者在使用Vue的jsonEditor组件时遇到数据清除问题,发现可能是因为DOM节点创建延迟导致的。通过使用Vue的$nextTick方法确保在DOM更新后执行清除操作,解决了这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击修改按钮json数据正常显示出来

但是点击新增我发现数据没有被清空

我在这做清除操作竟然没有作用

我又做了一个按钮触发

this.$refs['jsonEditor'].getEditor().setValue('')

我发现有用了

奇怪了,我怀疑是dom节点没有创建,导致清除不成功

所有我使用$nextTick方法

这个回调函数会在下一次DOM更新循环结束后被执行。
在上面的代码中,我将设置编辑器值的逻辑放在了this.$nextTick的回调函数中。这样可以确保在下一次DOM更新循环结束后再尝试设置编辑器的值,从而避免在组件mounted时就立即设置值导致的问题。

this.$nextTick(() => {
  this.$refs['jsonEditor'].getEditor().setValue('')
})
### Vue.js 中集成富文本编辑器并实现打印功能 #### 集成 TinyMCE 富文本编辑器 TinyMCE 是一款功能强大的富文本编辑器,适用于多种 Web 开发场景。为了在 Vue 项目中集成 TinyMCE 并实现其基本功能,可以按照以下方式操作。 安装所需依赖: ```bash npm install @tinymce/tinymce-vue tinymce --save ``` 创建组件 `TinymceEditor.vue` 来封装 TinyMCE 编辑器实例化逻辑: ```vue <template> <editor v-model="content" :init="editorInit"/> </template> <script setup lang="ts"> import { ref } from 'vue'; import Editor from '@tinymce/tinymce-vue'; const content = ref(''); // 初始化配置项 const editorInit = { height: 500, menubar: false, plugins: [ 'advlist autolink lists link image charmap print preview anchor', 'searchreplace visualblocks code fullscreen', 'insertdatetime media table paste code help wordcount' ], toolbar: 'undo redo | formatselect | bold italic backcolor | \ alignleft aligncenter alignright alignjustify | \ bullist numlist outdent indent | removeformat | help', }; </script> ``` 此代码片段展示了如何初始化 TinyMCE 的插件列表和工具栏按钮集[^2]。 #### 处理图片上传 当用户尝试向富文本区域粘贴或拖拽图片时,需自定义 `images_upload_handler` 函数来处理文件上传流程,并最终返回图片 URL 给编辑器用于显示插入的图像资源[^1]。 更新上述脚本中的 `editorInit` 对象如下所示: ```javascript const editorInit = { ... images_upload_handler(blobInfo, success, failure) { const formData = new FormData(); formData.append('file', blobInfo.blob(), blobInfo.filename()); fetch('/api/upload-image', { method: 'POST', body: formData }).then(response => response.json()) .then(result => result.url ? success(result.url) : failure('Failed to upload')) .catch(() => failure('Network error')); } } ``` 这段 JavaScript 负责构建表单数据并通过 HTTP POST 请求发送至服务器端接口 `/api/upload-image` 进行实际存储;成功响应后会调用 `success()` 方法传入远程路径作为参数完成图片加载过程。 #### 添加打印支持 为了让页面具备导出当前文档为 PDF 或者直接调起浏览器默认打印机对话框的能力,在模板部分增加相应按钮控件即可满足需求: ```html <button type="button" class="btn btn-primary me-2" @click="printContent">Print Content</button> <!-- ... --> ``` 接着补充对应的事件处理器方法于 `<script>` 块内: ```typescript methods: { async printContent() { let iframeId = "printing-frame"; // 创建隐藏 iFrame 容器装载 HTML 版面结构 var iframeElement = document.createElement("iframe"); iframeElement.id = iframeId; iframeElement.name = iframeId; iframeElement.style.position = "absolute"; iframeElement.style.top = "-1px"; iframeElement.style.left = "-1px"; iframeElement.style.width = "1px"; iframeElement.style.height = "1px"; iframeElement.setAttribute("aria-hidden", true); document.body.appendChild(iframeElement); try { await this.$nextTick(); // 确保 DOM 更新完毕再继续执行 // 获取编辑区内的纯文本内容转换为标准 HTML 字符串形式 const htmlString = ` <!DOCTYPE html> <html> <head><title>Document Printout</title></head> <body>${this.content}</body> </html>`; // 将生成好的静态网页注入到新窗口对象里去渲染呈现出来准备打印输出 iframeElement.srcdoc = htmlString; setTimeout(function () { window.frames[iframeId].focus(); window.frames[iframeId].print(); // 清除临时使用的 DOM 元素防止内存泄漏 setTimeout(() => { document.body.removeChild(document.getElementById(iframeId)); }, 60 * 1e3); // 半分钟后销毁容器节点 }); } catch (error) { console.error(error.message || error.toString()); } }, }, ``` 该段 TypeScript/JavaScript 主要负责动态构造一个不可见的 IFRAME 标签用来承载待打印的内容副本,并利用浏览器内置 API (`window.print`) 发送指令给操作系统级服务程序启动硬件设备选择界面供用户确认具体设置选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值