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

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

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

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

解决方案:改成组件

您的组件模板现在将变为:

v-model="myContent"

:name="name"

:id="id">

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

替代解决方案:保留但通过组件获取的 HTML

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

:value="valForMyTextArea"

:name="name"

:id="id">

在这两种选择中...

的用法my-component保持不变:

hello world

完整的工作演示:

Vue.component('my-component', {

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

template: `

v-model="myContent"

:name="name"

:id="id">

:value="valueForMyTextArea"

:name="name"

:id="id">

`,

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

});

Vue.component('textarea-slot', {

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)]

);

},

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

mounted() {

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

}

});

Vue.component('vnode-to-html', {

props: ['vnode'],

render(createElement) {

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

},

mounted() {

this.$emit('html', [...this.$el.childNodes].map(n => n.outerHTML).join('\n'));

}

});

new Vue({

el: '#app'

})

hell

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。

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

总结和现成的替代品

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

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

众所周知的例子包括:

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

:value="code"

:options="cmOptions"

@ready="onCmReady"

@focus="onCmFocus"

@input="onCmCodeChange">

所以他们就是这样做的。当然,如果s - 及其警告 - 适合您的用例,它们也可以使用。

vue给组件传html,如何将 html 模板作为道具传递给 Vue 组件相关推荐

  1. vue 修改模板{{}}标签_详解Vue 动态添加模板的几种方法

    以下方法只适用于 Vue1.0 版本,推荐系数由高到低排列. 通常我们会在组件里的 template 属性定义模板,或者是在*.vue文件里的 template 标签里写模板.但是有时候会需要动态生成 ...

  2. 上传EXCEL,并下载模板

    上传EXCEL,并下载模板 假如上传EXCEL为这个格式. 就是这种样式,下面为源码. TYPE-POOLS:icon,abap. TABLES sscrfields. DATA:lv_sl TYPE ...

  3. rails 共享变量_如何将Rails实例变量传递给Vue组件

    rails 共享变量 by Gareth Fuller 由Gareth Fuller 如何将Rails实例变量传递给Vue组件 (How to pass Rails instance variable ...

  4. 【Vue】组件间传值的三种方式:父传子,子传父,非父子传值

    引用官网的一句话:父子组件的关系可以总结为 prop 向下传递,事件向上传递.父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息,如下图所示: 1,父组件传值给子组件 代码: &l ...

  5. Vue——05-02组件的数据、为什么data要使用函数、父组件给子组件传递数据的三种写法、父传子以及传两种以上的值、默认值以及父传子的引用类型

    目录 在组件中获取数据 二.组件中的data为什么必须要是函数? 父组件给子组件传递数据--props属性 第一种写法: 第二种写法: 第三种写法: 传默认值 : 父组件传子组件数据--引用类型的两种 ...

  6. .vue文件_Spring Boot 2.x(十六):玩转vue文件上传

    为什么使用Vue-Simple-Uploader 最近用到了Vue + Spring Boot来完成文件上传的操作,踩了一些坑,对比了一些Vue的组件,发现了一个很好用的组件--Vue-Simple- ...

  7. app头像上传vue_当前GitHub上排名前十的热门Vue项目

    1. ElemeFE/element tag:vue javascript components star:15.8k link:https://github.com/ElemeFE/element ...

  8. antd vue form表单 子组件调用父组件的方法没反应_前几天推了Vue,今天给React疯狂打call...

    在主流前端框架里,因为React的入门难度高而果断投入Vue怀抱的人绝不在少数.但我要告诉大家,如果你有一定的js基础,其实React没你想象中那么困难 任何库都要在「概念简洁」(自由度高)和「使用便 ...

  9. vue+videojs视频播放、视频切换、视频断点分段上传

    "本次需求是做一个视频列表,点击视频列表播放对应视频:同时要求实现断点分段上传大文件(视频)的功能 . videojs文档:Getting Started with Video.js - V ...

最新文章

  1. (原创)Linux下一定要4字节地址对齐操作
  2. linux sed给空文件首行插入_Sed命令高级功能,学好了工作不愁
  3. 3种Java工厂模式深入理解分析
  4. 干货:排名前16的Java工具类
  5. oracle+数据到+mysql数据库乱码_oracle数据mysql数据库乱码
  6. java swing 窗口事件_Javaswing多类窗口怎么写按钮事件呢?
  7. java图片滚动特效_js图片各种滚动效果
  8. [译] Promise A+ 标准
  9. LLC谐振电路(一) 整流电路总结
  10. datadog的数据流转
  11. 周鸿祎360新手机真的会免费吗?
  12. 使用 Go 语言进行并发编程的实践方法
  13. java 文件移动文件夹_java移动文件到另一个文件夹中
  14. 软件测试题目某市电话,软件测试题
  15. 图片滤镜——GPUImage
  16. 面试题 之 数据库部分 八
  17. 【python】简单实现打开浏览器并自动点击跳转
  18. python创意项目设计方案-基于MicroPython软件相结合的无线设计方案
  19. 十几分钟学会搭建动态网站
  20. 转载博客 htm5l实现滚动播放

热门文章

  1. 云和恩墨大讲堂丨PostgreSQL逻辑复制案例分享
  2. 基于PostgreSQL流复制的容灾库架构设想及实现
  3. 见证中国技术成长 数据技术嘉年华的别样十年
  4. 高考还没结束,这份试卷已经流出,你能拿多少分?
  5. 专家视角 | 小荷的 Oracle Database 18c 新特性快速一瞥
  6. 基于一款 wk2168芯片的串口扩展
  7. 解密GaussDB(for Influx)时序洞察
  8. 这次,甘肃的老百姓办理就医再也不用等了
  9. 一文带你熟悉Pytorch->Caffe->om模型转换流程
  10. C++调用Go方法的字符串传递问题及解决方案