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 相关文章推荐
Linux下使用jq友好的打印JSON技巧分享
Nov 18 Javascript
Bootstrap基础学习
Jun 16 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
Mar 02 Javascript
jQuery的ajax下载blob文件
Jul 21 Javascript
canvas实现动态小球重叠效果
Feb 06 Javascript
JS在浏览器中解析Base64编码图像
Feb 09 Javascript
JavaScript表单验证完美代码
Mar 02 Javascript
angular中的cookie读写方法
Aug 02 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
Feb 28 Javascript
JavaScript实现与使用发布/订阅模式详解
Jan 19 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
May 06 Javascript
vue实现可移动的悬浮按钮
Mar 04 Vue.js
全面介绍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守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
javascript使用eval或者new Function进行语法检查
2010/10/16 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
JavaScript的Backbone.js框架的一些使用建议整理
2016/02/14 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
python中MySQLdb模块用法实例
2014/11/10 Python
分享Python字符串关键点
2015/12/13 Python
Python入门之三角函数全解【收藏】
2017/11/08 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
个性大学生自我评价
2013/12/04 职场文书
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
2014年党支部承诺书
2014/05/30 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书