vue项目怎么生成html页面,vue给组件传html,如何将 html 模板作为道具传递给 Vue 组件

 2023-09-23 阅读 14 评论 0

摘要:Vue 渲染器将组件视为静态组件,因此在将它们放入 DOM 后,它们根本不会改变(这就是为什么如果您检查 DOM,您会在.但即使他们真的改变了,那也无济于事。只是因为s 中的HTML 元素不会成为它们的值。您必须设置TextArea 元素的value属性才能使其工作。

Vue 渲染器将组件视为静态组件,因此在将它们放入 DOM 后,它们根本不会改变(这就是为什么如果您检查 DOM,您会在.

但即使他们真的改变了,那也无济于事。只是因为s 中的HTML 元素不会成为它们的值。您必须设置TextArea 元素的value属性才能使其工作。

总之,不要绝望。这是可行的,解决上述问题所需的一切就是使用一个小的辅助组件。

有许多可能的方法来实现这一点,下面显示了两种。它们的主要区别在于您希望原始组件的模板如何。

解决方案:改成组件

vue项目怎么生成html页面,您的组件模板现在将变为:

v-model="myContent"

:name="name"

:id="id">

如您所见,除了替换为已更改之外别无他物。这足以克服 Vue 给. 的完整实现在下面的演示中。

vue组件中引入js文件并使用。替代解决方案:保留但通过组件获取的 HTML

解决方案是创建一个辅助组件(vnode-to-html如下所述),将插槽的VNode转换为 HTML 字符串。然后,您可以设定HTML字符串作为value你的。您的组件模板现在将变为:

:value="valForMyTextArea"

:name="name"

:id="id">

vue兄弟组件传值。在这两种选择中...

的用法my-component保持不变:

hello world

完整的工作演示:

Vue.component('my-component', {

props: ["content", "name", "id"],

template: `

vue动态加载组件。

v-model="myContent"

:name="name"

:id="id">

:value="valueForMyTextArea"

vue单文件组件、:name="name"

:id="id">

`,

data() { return {valueForMyTextArea: '', myContent: null} }

});

Vue.component('textarea-slot', {

vue输出html?props: ["value", "name", "id"],

render: function(createElement) {

return createElement("textarea",

{attrs: {id: this.$props.id, name: this.$props.name}, on: {...this.$listeners, input: (e) => this.$emit('input', e.target.value)}, domProps: {"value": this.$props.value}},

[createElement("template", {ref: "slotHtmlRef"}, this.$slots.default)]

);

vue异步组件?},

data() { return {defaultSlotHtml: null} },

mounted() {

this.$emit('input', [...this.$refs.slotHtmlRef.childNodes].map(n => n.outerHTML).join('\n'))

}

});

vue ui组件,Vue.component('vnode-to-html', {

props: ['vnode'],

render(createElement) {

return createElement("template", [this.vnode]);

},

mounted() {

vue 动态组件。this.$emit('html', [...this.$el.childNodes].map(n => n.outerHTML).join('\n'));

}

});

new Vue({

el: '#app'

})

hell

vue props。o world1

hello world2

分解:Vue 将s解析为VNodes 并使它们在this.$slots.SLOTNAME属性中可用。默认插槽自然进入this.$slots.default.

因此,在运行时,您可以使用已传递的内容(如 中的 VNode this.$slots.default)。现在的挑战变成了如何将这些 VNode 转换为 HTML 字符串?这是一个复杂的、仍然悬而未决的问题,将来可能会得到不同的解决方案,但是,即使有,也很可能需要一段时间。

上面 (template-slot和vnode-to-html)两种解决方案都使用 Vue 的 render 函数将 VNode 渲染到 DOM,然后获取渲染的 HTML。

由于提供的插槽可能具有任意的 HTML,我们将 VNode 渲染为一个HTML 模板元素,它不执行任何标签。

两种解决方案之间的区别在于它们如何“处理”从渲染函数生成的 HTML。在vnode-to-html返回作为应该由父(被拾起的事件my-component),其使用所传递的值来设置data将被设置为属性:value的textarea。

vue中嵌套一个html页面?该textarea-slot声明本身,父不就得了。这是一个更简洁的解决方案,但需要更加小心,因为您必须指定要向下传递到created inside 的属性textarea-slot。

总结和现成的替代品

不管怎样,重要的是要知道 Vue 在将声明的内容解析为s 时,会去除一些格式信息,例如顶级组件之间的空格。同样,它会去除标签(因为它们不安全)。这些是使用s 的任何解决方案所固有的警告(此处是否提供)。所以要注意。

典型的 Vue 富文本编辑器通过使用v-model(或value)属性将代码传递到组件中来完全解决这个问题。

众所周知的例子包括:

他们的网站上都有很好的文档(上面链接),所以我在这里重复它们没什么用,但作为一个例子,看看 codemirror 如何使用valueprop 来传递代码:

vue怎么封装一个组件?

:value="code"

:options="cmOptions"

@ready="onCmReady"

@focus="onCmFocus"

@input="onCmCodeChange">

vue动态引入css文件,所以他们就是这样做的。当然,如果s - 及其警告 - 适合您的用例,它们也可以使用。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/88177.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息