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中的常见排序算法
Mar 27 Javascript
javascript 必知必会之closure
Sep 21 Javascript
javascript中length属性的探索
Jul 31 Javascript
在浏览器窗口上添加遮罩层的方法
Nov 12 Javascript
jQuery写的日历(包括日历的样式及功能)
Apr 23 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
Jan 26 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
Jan 02 Javascript
jQuery.each使用详解
Jul 07 Javascript
JavaScript字符串常用的方法
Mar 10 Javascript
jQuery联动日历的实例解析
Dec 02 Javascript
React-Native使用Mobx实现购物车功能
Sep 14 Javascript
JS实现左边列表移到到右边列表功能
Mar 28 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的输入输出流
2007/02/14 PHP
php 上传功能实例代码
2010/04/13 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
PHP利用Mysql锁解决高并发的方法
2018/09/04 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
[01:11]辉夜杯战队访谈宣传片—CDEC.Y
2015/12/26 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
python实现保存网页到本地示例
2014/03/16 Python
wxPython窗口的继承机制实例分析
2014/09/28 Python
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
深入分析python数据挖掘 Json结构分析
2018/04/21 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
环境卫生工作汇报材料
2014/10/28 职场文书
公务员年终个人总结
2015/02/12 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL