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 相关文章推荐
ext 代码生成器
Aug 07 Javascript
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
Nov 21 Javascript
JS实现图片无间断滚动代码汇总
Jul 30 Javascript
JS简单循环遍历json数组的方法
Apr 22 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
May 14 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
Jun 08 Javascript
React组件的三种写法总结
Jan 12 Javascript
深入理解angular2启动项目步骤
Jul 15 Javascript
基于jQuery的左滑出现删除按钮的示例
Aug 29 jQuery
vue读取本地的excel文件并显示在网页上方法示例
May 29 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
May 26 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中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
php中将数组存到文件里的实现代码
2012/01/19 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
jquery获取input表单值的代码
2010/04/19 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
node事件循环和process模块实例分析
2020/02/14 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
python读取oracle函数返回值
2016/07/18 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
公司员工的自我评价范例
2013/11/01 职场文书
自荐书封面下载
2013/11/29 职场文书
同学聚会主持词
2014/03/18 职场文书
党支部换届选举方案
2014/05/08 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
学生打架检讨书
2014/10/20 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
感谢信格式范文
2015/01/22 职场文书
给领导的感谢信范文
2015/01/23 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
辞职信格式范文
2015/05/13 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python
python实现局部图像放大
2021/11/17 Python