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读取ASP设定的COOKIE
Nov 24 Javascript
jquery HotKeys轻松搞定键盘事件代码
Aug 30 Javascript
JavaScript URL参数读取改进版
Jan 16 Javascript
javascript 写的一个简单的timer
Jul 30 Javascript
js实现幻灯片效果(基于jquery插件)
Nov 05 Javascript
js this函数调用无需再次抓获id,name或标签名
Mar 03 Javascript
探讨JavaScript语句的执行过程
Jan 28 Javascript
实现一个简单的vue无限加载指令方法
Jan 10 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 Javascript
详解微信小程序Radio选中样式切换
Jul 06 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
Jul 11 Javascript
详解小程序BackgroundAudioManager踩坑之旅
Dec 08 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警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
Zend Guard使用指南及问题处理
2015/01/07 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
PHP webshell检查工具 python实现代码
2009/09/15 Python
浅谈dataframe中更改列属性的方法
2018/07/10 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
骆驼官方商城:CAMEL
2016/11/22 全球购物
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
数据库面试要点基本概念
2013/10/31 面试题
业务主管岗位职责范本
2013/12/25 职场文书
20年同学聚会感言
2014/02/03 职场文书
20年同学聚会邀请函
2014/02/04 职场文书
小学国庆节活动方案
2014/02/11 职场文书
在职员工证明书
2014/09/19 职场文书
舞蹈社团活动总结
2015/05/07 职场文书