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 面向对象编程(1) 基础
May 18 Javascript
如何用js控制frame的隐藏或显示的解决办法
Mar 20 Javascript
JavaScript 实现类的多种方法实例
May 01 Javascript
js+html5操作sqlite数据库的方法
Feb 02 Javascript
由浅入深剖析Angular表单验证
Jul 14 Javascript
详解Angular路由 ng-route和ui-router的区别
May 22 Javascript
jquery+css3实现熊猫tv导航代码分享
Feb 12 jQuery
JS实现字符串中去除指定子字符串方法分析
May 17 Javascript
ES6 Promise对象的含义和基本用法分析
Jun 14 Javascript
vue获取form表单的值示例
Oct 29 Javascript
JS document文档的简单操作完整示例
Jan 13 Javascript
微信小程序实现日历签到
Sep 21 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与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
jQuery的deferred对象使用详解
2011/08/20 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
JavaScript学习心得之概述
2015/01/20 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
jquery简单实现纵向的无缝滚动代码实例
2019/04/01 jQuery
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python开发之thread线程基础实例入门
2015/11/11 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
python 实现简单的FTP程序
2019/12/27 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
基于Python实现天天酷跑功能
2021/01/06 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
个人催款函范文
2015/06/24 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书