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 相关文章推荐
用jquery实现动画跳到顶部和底部(这个比较简单)
Sep 01 Javascript
javascript实现鼠标拖动改变层大小的方法
Apr 30 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
Jun 19 Javascript
jquery实现页面虚拟键盘特效
Aug 08 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
Feb 17 Javascript
老生常谈JQuery data方法的使用
Sep 09 Javascript
js生成随机数方法和实例
Jan 17 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
Jan 19 Javascript
BootStrap表单宽度设置方法
Mar 10 Javascript
微信小程序 动态绑定数据及动态事件处理
Mar 14 Javascript
详解vue几种主动刷新的方法总结
Feb 19 Javascript
vuex刷新后数据丢失的解决方法
Oct 18 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
基于PHP+MySQL的聊天室设计
2006/10/09 PHP
php MessagePack介绍
2013/10/06 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
javaScript复制功能调用实现方案
2012/12/13 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
IE8中动态创建script标签onload无效的解决方法
2014/12/22 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
详解ES6 export default 和 import语句中的解构赋值
2019/05/28 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
Python实现拼接多张图片的方法
2014/12/01 Python
Python文件处理
2016/02/29 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
Python读写zip压缩文件的方法
2018/08/29 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
python 实现兔子生兔子示例
2019/11/21 Python
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
大学毕业感言
2014/01/10 职场文书
《盲人摸象》教学反思
2014/02/16 职场文书
关于抽烟的检讨书
2014/02/25 职场文书
解除合同协议书
2014/04/17 职场文书
作风建设整改方案
2014/10/27 职场文书
2015元旦节寄语
2014/12/08 职场文书
举起手来观后感
2015/06/09 职场文书
高中地理教学反思
2016/02/19 职场文书
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android