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 第三章章节总结的例子
Mar 23 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
Nov 17 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
Mar 05 Javascript
使用javascript实现Iframe自适应高度
Dec 24 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
Mar 03 Javascript
jquery表单验证需要做些什么
Nov 17 Javascript
JS使用JSON作为参数实例分析
Jun 23 Javascript
移动端点击态处理的三种实现方式
Jan 12 Javascript
获取当前按钮或者html的ID名称实例(推荐)
Jun 23 Javascript
浅谈angular4 ng-content 中隐藏的内容
Aug 18 Javascript
vue 实现LED数字时钟效果(开箱即用)
Dec 08 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
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
js 浮动层菜单收藏
2009/01/16 Javascript
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
JavaScript 一道字符串分解的题目
2011/08/03 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
react native与webview通信的示例代码
2017/09/25 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
Python中IPYTHON入门实例
2015/05/11 Python
python自带的http模块详解
2016/11/06 Python
Python将多份excel表格整理成一份表格
2018/01/03 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
应届生自荐信
2014/06/30 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
检察院起诉意见书
2015/05/20 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle