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吗?
Feb 24 Javascript
js正则表达式的使用详解
Jul 09 Javascript
jquery利用ajax调用后台方法实例
Aug 23 Javascript
表单元素与非表单元素刷新区别详细解析
Nov 06 Javascript
javascript中typeof的使用示例
Dec 19 Javascript
jQuery EasyUI Dialog拖不下来如何解决
Sep 28 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
May 10 Javascript
javascript深拷贝和浅拷贝详解
Feb 14 Javascript
Vue2 使用 Echarts 创建图表实例代码
May 18 Javascript
JS开发中基本数据类型具体有哪几种
Oct 19 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
Aug 31 Javascript
vue如何实现自定义底部菜单栏
Jul 01 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
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
destoon二次开发入门示例
2014/06/20 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
python根据unicode判断语言类型实例代码
2018/01/17 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
学习Python需要哪些工具
2020/09/04 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
中学门卫岗位职责
2013/12/26 职场文书
2014年中班元旦活动方案
2014/02/14 职场文书
啤酒节策划方案
2014/05/28 职场文书
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
家长评语怎么写
2014/12/30 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
Python之基础函数案例详解
2021/08/30 Python