Vue.js的动态组件模板的实现


Posted in Javascript onNovember 26, 2018

组件并不总是具有相同的结构。有时需要管理许多不同的状态。异步执行此操作会很有帮助。

实例:

组件模板某些网页中用于多个位置,例如通知,注释和附件。让我们来一起看一下评论,看一下我表达的意思是什么。
评论现在不再仅仅是简单的文本字段。您希望能够发布链接,上传图像,集成视频等等。必须在此注释中呈现所有这些完全不同的元素。如果你试图在一个组件内执行此操作,它很快就会变得非常混乱。

Vue.js的动态组件模板的实现

处理方式

我们该如何处理这个问题?可能大多数人会先检查所有情况,然后在此之后加载特定组件。像这样的东西:

<template>
 <div class="comment">
  // comment text 
  <p>...</p>
  // open graph image
  <link-open-graph v-if="link.type === 'open-graph'" />
  // regular image
  <link-image v-else-if="link.type === 'image'" />
  // video embed
  <link-video v-else-if="link.type === 'video'" />
  ...
 </div>
</template>

但是,如果支持的模板列表变得越来越长,这可能会变得非常混乱和重复。在我们的评论案例中 - 只想到支持Youtube,Twitter,Github,Soundcloud,Vimeo,Figma的嵌入......这个列表是无止境的。

动态组件模板

另一种方法是使用某种加载器来加载您需要的模板。这允许你编写一个像这样的干净组件:

<template>
 <div class="comment">
  // comment text 
  <p>...</p>
 
  // type can be 'open-graph', 'image', 'video'...
  <dynamic-link :data="someData" :type="type" />
 </div>
</template>

看起来好多了,不是吗?让我们看看这个组件是如何工作的。首先,我们必须更改模板的文件夹结构。

Vue.js的动态组件模板的实现

就个人而言,我喜欢为每个组件创建一个文件夹,因为可以在以后添加更多用于样式和测试的文件。当然,您希望如何构建结构取决于你自己。

接下来,我们来看看如何<dynamic-link />构建此组件。

<template>
 <component :is="component" :data="data" v-if="component" />
</template>
<script>
export default {
 name: 'dynamic-link',
 props: ['data', 'type'],
 data() {
  return {
   component: null,
  }
 },
 computed: {
  loader() {
   if (!this.type) {
    return null
   }
   return () => import(`templates/${this.type}`)
  },
 },
 mounted() {
  this.loader()
   .then(() => {
    this.component = () => this.loader()
   })
   .catch(() => {
    this.component = () => import('templates/default')
   })
 },
}
</script>

那么这里发生了什么?默认情况下,Vue.js支持动态组件。问题是您必须注册/导入要使用的所有组件。

<template>
 <component :is="someComponent"></component>
</template>
<script>
import someComponent from './someComponent'
export default {
 components: {
  someComponent,
 },
}
</script>

这里没有任何东西,因为我们想要动态地使用我们的组件。所以我们可以做的是使用Webpack的动态导入。与计算值一起使用时,这就是魔术发生的地方 - 是的,计算值可以返回一个函数。超级方便!

computed: {
 loader() {
  if (!this.type) {
   return null
  }
  return () => import(`templates/${this.type}`)
 },
},

安装我们的组件后,我们尝试加载模板。如果出现问题我们可以设置后备模板。也许这对向用户显示错误消息很有帮助。

mounted() {
 this.loader()
  .then(() => {
   this.component = () => this.loader()
  })
  .catch(() => {
   this.component = () => import('templates/default')
  })
},

结论

如果您有一个组件的许多不同视图,则可能很有用。

  • 易于扩展。
  • 它是异步的。模板仅在需要时加载
  • 。保持代码干净。

基本上就是这样!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js实现简单登录功能的实例代码
Nov 09 Javascript
表格奇偶行设置不同颜色的核心JS代码
Dec 24 Javascript
jquery插件jquery倒计时插件分享
Dec 27 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
Aug 20 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
Jan 25 Javascript
JavaScript的instanceof运算符学习教程
Jun 08 Javascript
Jquery根据浏览器窗口改变调整大小的方法
Feb 07 Javascript
jquery仿ps颜色拾取功能
Mar 08 Javascript
jQuery实现可兼容IE6的滚动监听功能
Sep 20 jQuery
详解性能更优越的小程序图片懒加载方式
Jul 18 Javascript
详解Vue CLI3 多页应用实践和源码设计
Aug 30 Javascript
使用next.js开发网址缩短服务的方法
Jun 17 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
Nov 26 #Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
Nov 26 #Javascript
electron制作仿制qq聊天界面的示例代码
Nov 26 #Javascript
Vuex的初探与实战小结
Nov 26 #Javascript
微信小程序页面间值传递的两种方法
Nov 26 #Javascript
Vue中的methods、watch、computed的区别
Nov 26 #Javascript
vue-router懒加载速度缓慢问题及解决方法
Nov 25 #Javascript
You might like
第1次亲密接触PHP5(2)
2006/10/09 PHP
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
php操作redis缓存方法分享
2015/06/03 PHP
php实现zip文件解压操作
2015/11/03 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
js输出列表实现代码
2010/09/12 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
Javascript继承机制的设计思想分享
2011/08/28 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
一个炫酷的Bootstrap导航菜单
2016/12/28 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
python使用udp实现聊天器功能
2018/12/10 Python
python 调试冷知识(小结)
2019/11/11 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
2015社区精神文明建设工作总结
2015/04/21 职场文书
一文搞懂php的垃圾回收机制
2021/06/18 PHP
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript