Vue.js组件间的循环引用方法示例


Posted in Javascript onDecember 27, 2017

什么是组件:

众所周知组件是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能。在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展。下面话不多说了,来一起看看本文的正文内容。

引言

写了大大小小不少基于vue的项目,但是基本没用到过组件循环引用的知识。

为了查缺补漏,照着官方文档撸一个DEMO:组件之间的循环引用

本人的运行版本为 vue-cli@2.8.1,启用项目后,将以下 js 文件和 vue 文件放置在相应的目录中运行。

main.js

import Vue from 'vue'
import App from './App'
new Vue({
 el: '#app',
 template: '<App/>',
 components: { App }
})

main.js 导入 App 组件,并在 components 中注册 App 组件。

App.vue

<template>
 <div id="app">
 <li v-for="folder in folders">
 <tree-folder v-bind:folder="folder"></tree-folder>
 </li>
 </div>
</template>
<script>
 import TreeFolder from './components/tree-folder'
 export default {
 data: function () {
 return {
 folders: [
  {
  name: 'folder1',
  children: [{
  name: 'folder1 - folder1',
  children: [{
  name: 'folder1 - folder1 - folder1'
  }]
  }, {
  name: 'folder1 - folder2',
  children: [{
  name: 'folder1 - folder2 - folder1'
  }, {
  name: 'folder1 - folder2 - folder2'
  }]
  }]
  },
  {
  name: 'folder 2',
  children: [{
  name: 'folder2 - folder1',
  children: [{
  name: 'folder2 - folder1 - folder1'
  }]
  }, {
  name: 'folder2 - folder2',
  children: [{
  name: 'folder2-content1'
  }]
  }]
  },
  {
  name: 'folder 3',
  children: [{
  name: 'folder3 - folder1',
  children: [{
  name: 'folder3 - folder1 - folder1'
  }]
  }, {
  name: 'folder3 - folder2',
  children: [{
  name: 'folder3-content1'
  }]
  }]
  }
 ]
 }
 },
 components: {
 TreeFolder
 }
 }
</script>

App 组件导入 TreeFolder 组件,并在 components 中注册 TreeFolder 组件。

components/tree-folder.vue

<template>
 <p>
 <span>{{ folder.name }}</span>
 <tree-folder-contents :children="folder.children"></tree-folder-contents>
 </p>
</template>
<script>
 // 官方文档:「在我们的例子中,将 tree-folder 组件做为切入起点。我们知道制造矛盾的是 tree-folder-contents 子组件,所以我们在 tree-folder 组件的生命周期钩子函数 beforeCreate 中去注册 tree-folder-contents 组件」
 export default {
 props: ['folder'],
 data: function () {
  return {}
 },
 beforeCreate: function () {
 // 官方文档给出的是require
 // this.$options.components.TreeFolderContents = require('./tree-folder-contents.vue')
 // 在基于vue-cli@2.8.1按照上面的写法还是会报错
 // Failed to mount component: template or render function not defined.
 // 所以我们应该改为基于es6的写法异步加载一个组件如下
  this.$options.components.TreeFolderContents = () => import('./tree-folder-contents.vue')
 }
 }
</script>

TreeFolder 组件导入 TreeFolderContents 组件,并在 components 中注册 TreeFolderContents 组件。

components/tree-folder-contents.vue

<template>
 <ul>
 <li v-for="child in children">
  <tree-folder v-if="child.children" :folder="child"></tree-folder>
  <span v-else>{{ child.name }}</span>
 </li>
 </ul>
</template>
<script>
 import TreeFolder from './tree-folder'
 export default {
 props: ['children'],
 components: {
  TreeFolder
 }
 }
</script>

TreeFolderContents 组件又导入 TreeFolder 组件,并在 components 中注册 TreeFolder 组件,产生了循环引用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Javascript调用C#代码
Jan 17 Javascript
js显示时间 js显示最后修改时间
Jan 02 Javascript
node.js中的url.format方法使用说明
Dec 10 Javascript
jquery删除指定子元素代码实例
Jan 13 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
浅谈EasyUI常用控件的禁用方法
Nov 09 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
Sep 21 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 Javascript
详解ES6中的Map与Set集合
Mar 22 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
May 20 Javascript
vue解决花括号数据绑定不成功的问题
Oct 30 Javascript
小程序实现背景音乐播放和暂停
Jun 19 Javascript
全面介绍vue 全家桶和项目实例
Dec 27 #Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
Dec 27 #jQuery
使用jQuery 操作table 完成单元格合并的实例
Dec 27 #jQuery
浅谈vue-router 路由传参的方法
Dec 27 #Javascript
关于laydate.js加载laydate.css路径错误问题解决
Dec 27 #Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 #Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
Dec 27 #Javascript
You might like
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
twig模板常用语句实例小结
2016/02/04 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
python 调用HBase的简单实例
2016/12/18 Python
Python写一个基于MD5的文件监听程序
2019/03/11 Python
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
创造美妙香氛体验:Aera扩散器和香水
2018/11/25 全球购物
财务工作个人求职的自我评价
2013/12/19 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
个人委托书范本汇总
2014/10/01 职场文书
全陪导游词
2015/02/04 职场文书
党支部意见范文
2015/06/02 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python
基于docker安装zabbix的详细教程
2022/06/05 Servers