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实现代码
Oct 01 Javascript
jQuery中unbind()方法用法实例
Jan 19 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
May 09 Javascript
JQuery给网页更换皮肤的方法
May 30 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
Jul 29 Javascript
JavaScript对象数组排序实例方法浅析
Jun 15 Javascript
JS实现的手机端精简幻灯片效果
Sep 05 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
Oct 08 Javascript
对angular4子路由&amp;辅助路由详解
Oct 09 Javascript
Vue+Express实现登录状态权限验证的示例代码
May 05 Javascript
JavaScript实现的开关灯泡点击切换特效示例
Jul 08 Javascript
vue+springboot图片上传和显示的示例代码
Feb 14 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
大师制作的中短波矿石收音机
2020/04/02 无线电
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
prototype 1.5 &amp; scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
微信小程序实现手势滑动卡片效果
2019/08/26 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
使用Vue生成动态表单
2019/11/26 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
python Django框架实现自定义表单提交
2016/03/25 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
django 模型字段设置默认值代码
2020/07/15 Python
媒矿安全生产承诺书
2014/05/23 职场文书
教师求职自荐书
2014/06/14 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技