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 相关文章推荐
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
Oct 12 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
Nov 11 Javascript
查询json的数据结构的8种方式简介
Mar 10 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
Aug 23 Javascript
vue实现文章内容过长点击阅读全文功能的实例
Dec 28 Javascript
vue中锚点的三种方法
Jul 06 Javascript
基于vue中对鼠标划过事件的处理方式详解
Aug 22 Javascript
Vue常用的几个指令附完整案例
Nov 06 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
May 14 Javascript
vue+element实现表格新增、编辑、删除功能
May 28 Javascript
详解如何在Javascript和Sass之间共享变量
Nov 13 Javascript
原生JS实现烟花效果
Mar 10 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
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
一个选择最快的服务器转向代码
2009/04/27 Javascript
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
vue用BMap百度地图实现即时搜索功能
2019/09/26 Javascript
详解Angular Karma测试的持续集成实践
2019/11/15 Javascript
[27:39]Ti4 循环赛第二日 LGD vs Fnatic
2014/07/11 DOTA
python实现随机密码字典生成器示例
2014/04/09 Python
复习Python中的字符串知识点
2015/04/14 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
python中set常用操作汇总
2016/06/30 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
Html5实现iPhone开机界面示例代码
2013/06/30 HTML / CSS
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
演讲比赛获奖感言
2014/02/02 职场文书
数控专业毕业生自荐信范文
2014/03/04 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
小学语文教学反思范文
2016/03/03 职场文书
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python