Vue组件化补充

1、父子组件访问方式

父访问子$children $refs

//在父组件中
    methods:{ 
        //使用$children 访问
        array(){
            //返回第一个子组件
            return this.$children\[0\]
            //因为父组件可能有很多子组件,所以返回的是数组,并且访问只能通过下标,不方便
        },
        //使用$refs访问,使用name访问指定子组件
        object(){
            //访问cpn子组件并且名字为aaa  <cpn ref="aaa">
            return this.$refs.aaa
        }
    
    }

子访问父 $parent

//子组件中
methods:{
    getParentCpn(){
        return this.$parent
        //只访问当前子组件的上层父组件
    },
     getRootCpn(){
        return this.$root
        //只访问当前子组件的根组件
    }      
}

2、插槽

基本使用:

<!--设置模板-->
<template id="cpn">
    <div>  
        <slot></slot>
        <input type="text" value="这是第一个插件">
    </div>
</template >
<!--slot相当于一个占位,当使用cpn组件时,在此位置上添加一个button标签-->
<!--使用-->
<div id="app">
    <cpn><button></cpn>
</div>
<!--相当于在slot位置添加了一个button标签-->
<!--显示为
    <div id="app">
        <button> 
        <input type="text" value="这是第一个插件">
    </div>
  -->

<!--可以设置默认模板-->
<template id="cpn">
    <div>  
        <slot><p>当使用的时候不在cpn里面添加标签则显示此P</p></slot> 
        <input type="text" value="这是第一个插件">
    </div>
</template >
<!--使用-->
<div id="app">
    <cpn></cpn>
</div>
<!--显示为
    <div id="app">
        <p>当使用的时候不在cpn里面添加标签则显示此P</p>
        <input type="text" value="这是第一个插件">
    </div>
  -->
  
<!--注意,当使用插件的时候,不指定插件,则会重复使用slot-->

使用指定slot,具名插槽

<!--设置模板-->
<template id="cpn">
    <div>  
        <slot name="center"></slot>
        <input type="text" value="这是第一个插件">
        <slot name="bottom"></slot>
    </div>
</template >
<!--使用-->
<div id="app">
    <cpn>
        <span slot="bottom"> 这是名为bottom的slot</span>
        <span slot="center"> 这是名为center的slot</span>
    </cpn>
</div>
<!--显示为
          这是名为center的slot
          这是第一个插件
     这是名为bottom的slot
  -->

3、编译作用域

父组件在自己的区域使用属于自己的属性

子组件在自己的区域使用属于自己的属性

<div id="app">
     <!--onClick一定是在父组件中的方法-->
     <span @click="onClick">
</div>

4、作用域插槽

父组件替换插槽标签,但是内容由子组件提供,就是身上绑定了数据data的slote。

//定义插槽的时候,把子组件的数据定义好,在父组件使用子组件的时候,把数据传给子组件的插槽
<!--设置模板-->
<template id="cpn">
    <div>  
        <slot :data="childrenData"></slot> 
    </div>
</template >
<!--使用,在vue2.5以下使用作用域插槽一定要用template标签
    2.5以上可以自定义标签,v2.6新增v-slot替代老方法, 就是在template标签上用v-slot:插槽名来绑定具名插槽。
   -->
<div id="app">
    <cpn>
       <template slot-scope="aaa">
           <!--aaa是自定义的,在此template标签使用,data也是自定义的,在子组件的slot :后定义-->
           <span>{{aaa.data}}</span>
       </template>
    </cpn>
</div>
<!--使用高版本-->
<div id="app">
    <cpn>
       <div v-slot="aaa">
           <!--aaa是自定义的,在此template标签使用,data也是自定义的,在子组件的slot :后定义-->
           <span>{{aaa.data}}</span>
       </div >
    </cpn>
</div>