在Vue.js中如何实现组件间循环引用

核心提示组件(Component)是 Vue.js 最强大的功能之一。 组件可以扩展 HTML 元素,封装可重用的代码。下面这篇文章主要给大家介绍了关于Vue.js组件间循环引用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。什么

组件(Component)是 Vue.js 最强大的功能之一。 组件可以扩展 HTML 元素,封装可重用的代码。下面这篇文章主要给大家介绍了关于Vue.js组件间循环引用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。

什么是组件:

众所周知组件是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>

<p id="app">

<li v-for="folder in folders">

<tree-folder v-bind:folder="folder"></tree-folder>

</li>

</p>

</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 组件,产生了循环引用。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在Node.js中如何搭建小程序后台服务

在js中有关文件加载优化方面的问题

使用nodejs+mongodb+vue如何配置ueditor

Vue 可以通过全局注册来实现全局组件的功能,比如有这么一个组件 exampleComponent ,如果想把它注册成全局组件的话,只需要在引入 Vue 的文件里调用 Vue.component('example-component',exampleComponent) 来实现,又或者如同大部分 Vue 的 ui框架 那样,直接调用 Vue.use() 来实现。

Vue.use() 方法比 Vue.component() 要复杂些,其大致用法如下:

这两种全局注册组件的方法在注册成功后都是通过使用标签名如 <example-component></example-component> 来使用的。使用过 element 、 iview 等UI框架的朋友肯定会注意到这么一种比较特殊的组件,如 loading 和 message ,这类组件的使用场景大部分是在js执行环境时要用到,比如请求发送前要出现一个 loading 遮罩层防止用户重复请求,请求成功后这个遮罩层又要消失掉。这种需求若是也用预先在 html 中放置对应组件标签的形式的话,未免显得太过麻烦。所以,为了解决这个问题,有这么一种通过调用 Vue 原型方法来调用组件的方式。如 element 中 this.$message('这是一条消息提示'); 这样调用后在页面上显示一条消息提示的js方法。

不管什么组件,其本质都是操作DOM,只不过因为直接原生操作 DOM 会对浏览器的开销比较大, Vue 里面使用了一种虚拟dom的技术来尽可能的减少这种开销,而且操作dom虽然是一种很直观的改变显示效果的形式,但操作太过于繁琐。种种原因, Vue 的基本思想就是 数据驱动DOM ,尽量不要去亲手修改 DOM 。但凡事无绝对,上面所说的就是一种不操作 DOM 就难以绕开的一种便捷功能的实现。

那如何实现全局js方法调用组件的功能呢?

要实现这个目的,必须先了解两个东西: vm.$mount 、 Vue.extend() 。

翻看官方文档,找出了这两者的用法如下:

上面两个东西,简单理解就是用 Vue 自身的方法定义一个 html 标签,然后又用 Vue 的方法找到某个特定id的标签,将其内容替换掉。

那么用这两个特性,我们来创建一个能够自定义入参内容的 fullName 组件,它的功能是调用时,页面出现一个半透明遮罩层,页面中间显示入参内容。

步骤如下:

 
友情链接
鄂ICP备19019357号-22