【Vue学习】组件进阶

组件(Component)是 Vue.js 最强大的功能之一,之前的文章都只是用到了基本的封装功能,这次将介绍一些更强大的扩展。

一、基本用法

在使用 vue-cli 创建的项目中,组件的创建非常方便,只需要新建一个 .vue 文件,然后在 <template>中写好 HTML 代码,一个简单的组件就完成了

91f16332b43689b0648b5adcbc796a57.jpg

一个完整的组件,除了 <template>以外,还有 <script><style>

需要注意的是,<script>中的 data 必须是函数

88ba40ecf70da65a01c25eab9aa60d17.jpg

然后在其他文件的 js 里面引入并注册,就能直接使用这个组件了

43788b645b7f0cd8e664c1eb5e62da85.jpg

2b64840f050cd6984466701789e87a04.jpg

二、使用 slot 分发内容

开发过程中,常常需要在子组件内添加新的内容,这时候可以在子组件内部留一个或者多个插口 <slot>

d219f4fba691589b8997f4cd93b83f2d.jpg

然后在调用这个子组件的时候加入内容

686693c8e023d56165581526a7ce97c4.jpg

添加的内容就会分发到对应的 <slot>

<slot> 中还可以作为一个作用域,在子组件中定义变量,然后在父组件中自定义渲染的方式

d83b7d4e343fd31fd4cdda185d573a4c.jpg

66b9de4a1e26d5b3d2ea3c48d3e63413.jpg

这个示例中,首先在子组件中添加<slot>,并在子组件中定义了数组变量 navs

然后在父组件中以作用域 <template> 添加内容,其中 scope 是固有属性,它的值对应一个临时变量 props

而 props 将接收从父组件传递给子组件的参数 navs

75419a06fecd8bfe619a539df4ad8f59.jpg

三、动态组件

Vue 还可以将多个子组件,都挂载在同一个位置,通过变量来切换组件,实现 tab 菜单这样的效果

158e6790c73478064ed5653637d63ab5.gif

这样的功能可以通过路由 vue-router 实现,但路由更适合较大的组件,而且 url 会有相应的改变

Vue 自身保留的<component>元素,可以将组件动态绑定到 is 特性上,从而很方便的实现动态组件切换

6dabad2e673ea3881cf78e315e0367ca.jpg

上例中,当 tabView 的值改变,<component>就会渲染对应的组件,和路由的效果十分类似,但是地址栏并没有发生改变

但这样一来,每次切换组件都会重新渲染,无法保留组件上的数据。这时可以使用 keep-alive 将组件保留在内存中,避免重新渲染

dff32d54e24c76e569eb3095bc34bb4d.jpg

63e3c68b34afcd5342671f0eae9ebf0d.gif

四、递归组件

当组件拥有 name 属性的时候,就可以在它的模板内递归的调用自己,这在开发树形组件的时候十分有效

0833045722ae9fbbfc768d5e63a55b1c.jpg

上面是一个子组件,定义了 name 为 simple03,然后在模板中调用自身,结合 v-for 实现递归

为了防止出现死循环,在调用自身的时候,加入了 v-if 作为判定条件

父组件中调用的时候,需要通过 props 传入一个 tree:

394d794a105efcf84399723201f9d290.jpg

4f11fa792e83a784e8e78ada150d452a.jpg

最终渲染结果:

7dca23592423dcb0aa9e63acc8467a33.jpg

转载自:https://www.cnblogs.com/wisewrong/p/6380903.html