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 相关文章推荐
JavaScript 动态添加表格行 使用模板、标记
Oct 24 Javascript
JS文本获得焦点清除文本文字的示例代码
Jan 13 Javascript
jstree的简单实例
Dec 01 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
Apr 05 Javascript
JQuery实现图片轮播效果
May 08 jQuery
详解tween.js 中文使用指南
Jan 05 Javascript
Vue中computed、methods与watch的区别总结
Apr 10 Javascript
Vue项目中如何使用Axios封装http请求详解
Oct 23 Javascript
JS实现网页端猜数字小游戏
Mar 06 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
Mar 26 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
Sep 28 Javascript
Vue实现一种简单的无限循环滚动动画的示例
Jan 10 Vue.js
解决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
PHP4实际应用经验篇(7)
2006/10/09 PHP
PHP $_SERVER详解
2009/01/16 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
PHP count()函数讲解
2019/02/03 PHP
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
让html页面不缓存js的实现方法
2014/10/31 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
Node连接mysql数据库方法介绍
2017/02/07 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
公司合作意向书
2014/04/01 职场文书
运动会拉拉队口号
2014/06/09 职场文书
洗手间标语
2014/06/23 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
Python源码解析之List
2021/05/21 Python