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使用手册之一
Mar 24 Javascript
JavaScript监测ActiveX控件是否已经安装过的代码
Sep 02 Javascript
传递参数的标准方法(jQuery.ajax)
Nov 19 Javascript
公共js在页面底部加载的注意事项介绍
Jul 18 Javascript
简洁Ajax函数处理(示例代码)
Nov 15 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
Mar 10 Javascript
javasctipt如何显示几分钟前、几天前等
Apr 30 Javascript
Javascript操作表单实例讲解(下)
Jun 20 Javascript
教你JS中的运算符乘方、开方及变量格式转换
Aug 09 Javascript
微信小程序动态显示项目倒计时效果
Jun 13 Javascript
weebox弹出窗口不居中显示的解决方法
Nov 27 Javascript
浅谈在react中如何实现扫码枪输入
Jul 04 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
zf框架的registry(注册表)使用示例
2014/03/13 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
php中array_fill函数的实例用法
2021/03/02 PHP
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
vue实现放大镜效果
2020/09/17 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
浅谈MySQL中的触发器
2015/05/05 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
在scrapy中使用phantomJS实现异步爬取的方法
2018/12/17 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
python的pstuil模块使用方法总结
2019/07/26 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
应聘编辑职位自荐信范文
2014/01/05 职场文书
奥巴马演讲稿
2014/01/08 职场文书
素食餐饮项目创业计划书
2014/02/02 职场文书
商超业务员岗位职责
2014/03/12 职场文书
委托证明模板
2014/09/16 职场文书
员工自我评价范文
2015/03/11 职场文书
javascript对象3个属性特征
2021/11/17 Javascript