Vue与原生JS动态生成自定义组件示例及原理
97 浏览量
更新于2024-08-31
收藏 65KB PDF 举报
本文档探讨了如何在Vue框架中结合原生JavaScript实现自定义组件的动态生成,以便在不预先确定挂载点的情况下创建多个组件实例。在传统的前端开发中,使用Vue、Angular或React等数据驱动框架时,开发者通常需要预先定义组件的挂载位置,如HTML元素标签。然而,如果试图通过动态方式生成这些组件,比如在页面加载后根据数据变化动态添加,可能会遇到DOM操作问题,例如`Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'`这样的错误。
造成这个问题的原因是,浏览器只允许对符合W3C标准的元素执行DOM操作,动态生成的自定义组件如果没有被正确地注册为浏览器可识别的自定义元素,就会引发此类错误。为了解决这个问题,文章建议修改`HTMLElement.prototype`的原型,并且实现自定义元素的注册,使得动态生成的组件能够在浏览器中得到支持。
尽管数据驱动框架的核心目标是减少DOM操作,但在实际应用中,尤其是动态组件生成的情况下,某些DOM操作可能是不可避免的。作者给出的一个示例代码片段展示了如何使用Vue和原生JavaScript创建一个名为`fuhao-com`的自定义组件,并将其动态添加到页面上的`#main`区域:
```html
<!DOCTYPE html>
<html>
<head>
...
<script src="js/vue.js" type="text/javascript"></script>
</head>
<body>
<div id="main" class="mui-content">
<!-- 这里原本可能预留的挂载点 -->
</div>
<script src="js/fuhao-com" type="text/javascript"></script>
<script>
// 动态生成自定义组件
Vue.component('fuhao-com', {
template: '<div class="fuhao-component">Hello, Fuhao!</div>',
mounted() {
// 避免直接使用innerHTML,这里需要确保元素是合法的Node类型
let parent = document.getElementById('main');
if (parent && parent.nodeType === Node.ELEMENT_NODE) {
let component = this.$mount();
parent.appendChild(component.$el);
}
}
});
// 在适当的时候,根据数据动态创建和添加组件
// 示例:data里有一个数组,每个元素对应一个组件实例
let data = [
{name: 'Component 1'},
{name: 'Component 2'}
];
data.forEach(item => {
new Vue({
el: '#main',
components: {'fuhao-com': {}},
data: {item}
});
});
</script>
</body>
</html>
```
总结来说,这篇文章介绍了如何利用Vue框架与原生JavaScript的交互,在动态场景下实现自定义组件的生成,关键在于正确处理组件的挂载和注册,以及在必要时进行符合W3C标准的DOM操作。通过以上方法,开发者可以在保持数据驱动的优势的同时,灵活地处理组件的动态生成和管理。
2021-05-25 上传
2021-01-07 上传
点击了解资源详情
2020-10-15 上传
2022-06-25 上传
点击了解资源详情
2020-10-16 上传
2020-08-31 上传
weixin_38622983
- 粉丝: 5
- 资源: 959
最新资源
- JHU荣誉单变量微积分课程教案介绍
- Naruto爱好者必备CLI测试应用
- Android应用显示Ignaz-Taschner-Gymnasium取消课程概览
- ASP学生信息档案管理系统毕业设计及完整源码
- Java商城源码解析:酒店管理系统快速开发指南
- 构建可解析文本框:.NET 3.5中实现文本解析与验证
- Java语言打造任天堂红白机模拟器—nes4j解析
- 基于Hadoop和Hive的网络流量分析工具介绍
- Unity实现帝国象棋:从游戏到复刻
- WordPress文档嵌入插件:无需浏览器插件即可上传和显示文档
- Android开源项目精选:优秀项目篇
- 黑色设计商务酷站模板 - 网站构建新选择
- Rollup插件去除JS文件横幅:横扫许可证头
- AngularDart中Hammock服务的使用与REST API集成
- 开源AVR编程器:高效、低成本的微控制器编程解决方案
- Anya Keller 图片组合的开发部署记录