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与函数式编程解释
Apr 27 Javascript
仿迅雷焦点广告效果(JQuery版)
Nov 19 Javascript
IE innerHTML,outerHTML所引起的问题
Jun 04 Javascript
eval的两组性能测试数据
Aug 17 Javascript
用js闭包的方法实现多点标注冒泡示例
May 29 Javascript
JavaScript 匿名函数和闭包介绍
Apr 13 Javascript
Position属性之relative用法
Dec 14 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
Jun 30 Javascript
各式各样的导航条效果css3结合jquery代码实现
Sep 17 Javascript
解决前端跨域问题方案汇总
Nov 20 Javascript
浅谈pc端rem字体设置的问题
Aug 03 Javascript
vue实现计算器功能
Feb 22 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开发的8个技巧小结
2010/12/17 PHP
php 文件上传类代码
2011/08/06 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
php获取参数的几种方法总结
2014/02/18 PHP
PHP中的use关键字概述
2014/07/23 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
JS实现的驼峰式和连字符式转换功能分析
2016/12/21 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
Python循环语句之break与continue的用法
2015/10/14 Python
详解python时间模块中的datetime模块
2016/01/13 Python
Python多线程实现同步的四种方式
2017/05/02 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
Python更新数据库脚本两种方法及对比介绍
2017/07/27 Python
python回调函数中使用多线程的方法
2017/12/25 Python
python通过配置文件共享全局变量的实例
2019/01/11 Python
利用Python优雅的登录校园网
2020/10/21 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
病媒生物防治方案
2014/05/13 职场文书
会计求职信
2014/05/29 职场文书
升学宴学生答谢词
2015/01/05 职场文书
学习十八大的感悟
2015/08/11 职场文书
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript