【发布时间】:2020-04-27 16:01:16
【问题描述】:
我有一个 Vue 组件,它有一个 contenteditable div 允许用户输入消息。当用户第一次尝试创建消息时,我使用 jQuery 将文本包装在 <p> 标记中。我无法理解如何单独使用 Vue.js 来实现...
Vue.js 组件
<template>
<div id="Message" contenteditable="true" @focus="formatMessage" @keydown="formatMessage" @keyup="formatMessage" @keypress="formatMessage">
</div>
</template>
<script>
import $ from 'jquery'
formatMessage: function(event) {
if ($("#Message > p").length === 0) { // if no <p> element when user interacts with div
$("#Message").contents().eq(0).wrap("<p />"); // then wrap a <p> tag around the first child content
}
}
是否可以仅使用 Vue.js 来执行此操作,这样我就不必加载 jQuery 库来进行简单的 DOM 操作(这可能会导致 Vue 的虚拟 DOM 与 jQuery 的更改不同步)?
formatMessage()之前:
<div id="Message" contenteditable="true">
I started typing here
</div>
formatMessage()之后:
<div id="Message" contenteditable="true">
<p>I started typing here</p>
</div>
尝试使用 Vue 的虚拟 DOM 是否可能/更好?我可以以某种方式使用createElement 创建一个新的p 标签,然后用用户输入的内容更新其内容吗?也许这不是 Virtual DOM 的工作方式,我不确定。
【问题讨论】:
-
发布一些相同的标记,也像调用
formatMessage之前的HTML标记以及之后的样子?另外,它是否会将每个文本都包含在#Message中? -
@palaѕн 我只是在代码前后添加了一些。这有帮助吗?它会立即发生,因此只要您
keydown文本被包裹在<p> -
@palash 虽然它与 jQuery 完美配合。一旦
<p>在keydown后渲染,所有字符都输入到<p>标签中
标签: javascript jquery vue.js