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 相关文章推荐
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
May 23 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
Apr 26 Javascript
详解JavaScript中this关键字的用法
May 26 Javascript
javascript 面向对象function详解及实例代码
Feb 28 Javascript
详解原生js实现offset方法
Jun 15 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
Jan 08 jQuery
基于vue.js中事件修饰符.self的用法(详解)
Feb 23 Javascript
JS中验证整数和小数的正则表达式
Oct 08 Javascript
vue路由跳转传参数的方法
May 06 Javascript
layui table 列宽百分比显示的实现方法
Sep 28 Javascript
JavaScript实现图片轮播特效
Oct 23 Javascript
JavaScript的垃圾回收机制与内存管理
Aug 06 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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
9个比较实用的php代码片段
2016/03/15 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
JavaScript window.document的属性、方法和事件小结
2012/10/24 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
用Python实现一个简单的线程池
2015/04/07 Python
Python变量作用范围实例分析
2015/07/07 Python
Python中join函数简单代码示例
2018/01/09 Python
Numpy之文件存取的示例代码
2018/08/03 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
python实现高斯投影正反算方式
2020/01/17 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
机械设计专业应届生求职信
2013/11/21 职场文书
公证书格式
2015/01/23 职场文书
学习雷锋精神活动总结
2015/02/06 职场文书
教师工作表现自我评价
2015/03/05 职场文书
会计入职心得体会
2016/01/22 职场文书
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server