vue给组件传html,如何将 html 模板作为道具传递给 Vue 组件
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 组件相关推荐
- vue 修改模板{{}}标签_详解Vue 动态添加模板的几种方法
以下方法只适用于 Vue1.0 版本,推荐系数由高到低排列. 通常我们会在组件里的 template 属性定义模板,或者是在*.vue文件里的 template 标签里写模板.但是有时候会需要动态生成 ...
- 上传EXCEL,并下载模板
上传EXCEL,并下载模板 假如上传EXCEL为这个格式. 就是这种样式,下面为源码. TYPE-POOLS:icon,abap. TABLES sscrfields. DATA:lv_sl TYPE ...
- rails 共享变量_如何将Rails实例变量传递给Vue组件
rails 共享变量 by Gareth Fuller 由Gareth Fuller 如何将Rails实例变量传递给Vue组件 (How to pass Rails instance variable ...
- 【Vue】组件间传值的三种方式:父传子,子传父,非父子传值
引用官网的一句话:父子组件的关系可以总结为 prop 向下传递,事件向上传递.父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息,如下图所示: 1,父组件传值给子组件 代码: &l ...
- Vue——05-02组件的数据、为什么data要使用函数、父组件给子组件传递数据的三种写法、父传子以及传两种以上的值、默认值以及父传子的引用类型
目录 在组件中获取数据 二.组件中的data为什么必须要是函数? 父组件给子组件传递数据--props属性 第一种写法: 第二种写法: 第三种写法: 传默认值 : 父组件传子组件数据--引用类型的两种 ...
- .vue文件_Spring Boot 2.x(十六):玩转vue文件上传
为什么使用Vue-Simple-Uploader 最近用到了Vue + Spring Boot来完成文件上传的操作,踩了一些坑,对比了一些Vue的组件,发现了一个很好用的组件--Vue-Simple- ...
- app头像上传vue_当前GitHub上排名前十的热门Vue项目
1. ElemeFE/element tag:vue javascript components star:15.8k link:https://github.com/ElemeFE/element ...
- antd vue form表单 子组件调用父组件的方法没反应_前几天推了Vue,今天给React疯狂打call...
在主流前端框架里,因为React的入门难度高而果断投入Vue怀抱的人绝不在少数.但我要告诉大家,如果你有一定的js基础,其实React没你想象中那么困难 任何库都要在「概念简洁」(自由度高)和「使用便 ...
- vue+videojs视频播放、视频切换、视频断点分段上传
"本次需求是做一个视频列表,点击视频列表播放对应视频:同时要求实现断点分段上传大文件(视频)的功能 . videojs文档:Getting Started with Video.js - V ...
最新文章
- (原创)Linux下一定要4字节地址对齐操作
- linux sed给空文件首行插入_Sed命令高级功能,学好了工作不愁
- 3种Java工厂模式深入理解分析
- 干货:排名前16的Java工具类
- oracle+数据到+mysql数据库乱码_oracle数据mysql数据库乱码
- java swing 窗口事件_Javaswing多类窗口怎么写按钮事件呢?
- java图片滚动特效_js图片各种滚动效果
- [译] Promise A+ 标准
- LLC谐振电路(一) 整流电路总结
- datadog的数据流转
- 周鸿祎360新手机真的会免费吗?
- 使用 Go 语言进行并发编程的实践方法
- java 文件移动文件夹_java移动文件到另一个文件夹中
- 软件测试题目某市电话,软件测试题
- 图片滤镜——GPUImage
- 面试题 之 数据库部分 八
- 【python】简单实现打开浏览器并自动点击跳转
- python创意项目设计方案-基于MicroPython软件相结合的无线设计方案
- 十几分钟学会搭建动态网站
- 转载博客 htm5l实现滚动播放