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,jquery闭包概念分析
Jun 19 Javascript
Js放到HTML文件中的哪个位置有什么区别
Aug 21 Javascript
借助javascript代码判断网页是静态还是伪静态
May 05 Javascript
Node.js中创建和管理外部进程详解
Aug 16 Javascript
avalonjs实现仿微博的图片拖动特效
May 06 Javascript
小巧强大的jquery layer弹窗弹层插件
Dec 06 Javascript
Bootstrap表单布局
Jul 19 Javascript
全站最详细的Vuex教程
Apr 13 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 Javascript
基于Web Audio API实现音频可视化效果
Jun 12 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
Jun 19 Javascript
浅谈javascript如何获取文件后缀名
Aug 07 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
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
jQuery中$原理实例分析
2018/08/13 jQuery
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
vue.js实现图书管理功能
2019/09/24 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
浅析Python中的join()方法的使用
2015/05/19 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
中专自荐信
2013/10/13 职场文书
化学专业毕业生自荐信
2013/11/15 职场文书
入党积极分子评语
2014/05/04 职场文书
环保倡议书500字
2014/05/15 职场文书
小区推广策划方案
2014/06/06 职场文书
实验室标语
2014/06/21 职场文书
交通事故代理词范文
2015/05/23 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
MySQL 全文检索的使用示例
2021/06/07 MySQL
Go语言并发编程 sync.Once
2021/10/16 Golang