如下图:
1、定义了一个类似下拉的组件 myselect , 然后里面有自定义的组件 myoptions
2、有很多时候,我们希望, myselect 组件内部的子组件,只能是 myoptions 。 不应该有 <div>666</div>
3、在myselect 里面做一层过滤,去掉不需要的组件
下面先看看
myoptions.vue 组件代码
<template> <div class="options"> <div>这里是 options</div> </div> </template> <script> // @ is an alias to /src export default { name: 'myoptions', data(){ return {} }, created(){ }, mounted(){ } } </script>
接下来是 myselect 的代码:
<template> <div class="select"> <div>这里是 select</div> <slot></slot> </div> </template> <script> // @ is an alias to /src export default { name: "myselect", data(){ return { _children:[] } }, created(){ console.log(this.$children) // 输出为 [] console.log(this.$slots.default) //输出为 [vnode, vnode, vnode] var arr = this.$slots.default || [] var res = []; for(var i = 0; i < arr.length; i++){ var item = arr[i]; if(item.componentoptions && item.componentoptions.tag == "myoptions"){ res.push(item); } } this._children = res; this.$slots.default = res; }, mounted(){ console.log(this.$slots.default) //[vnode, vnode] console.log(this.$children)//因为过滤掉了一个,所以为 [vuecomponent, vuecomponent] } } </script>
在 myselect 的 created 和 mounted 里面,分别查看
this.$slots.default和 this.$children
就会发现内部的子组件渲染,与这个有很大关系,只需要过滤一下 slots 就可以了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问, 点击进行留言回复!!
selenium + ajax抓取英雄联盟全部英雄的详细信息及多线程保存全部皮肤图片到本地
网友评论