vue中slot的使用

在使用element-ui的table进行自定义渲染的时候。经常会看到这样的写法:

  <el-table
    :data="tableData"
>
    <el-table-column
      fixed="right"
      label="操作"
      width="100">
      <template slot-scope="scope">
        <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>
        <el-button type="text" size="small">编辑</el-button>
      </template>
    </el-table-column>
  </el-table>

注意这里的slot-scope="scope",<template slot-scope="scope"></template >,我们只是给table传入一个数据。那他是怎么最后渲染在了table的行和列中的?

其实这就是用到了vue的作用域插槽。它能把子组件插槽的数据,在父组件中展示。

我们先聊一聊vue作用域插槽的具体用法:

(1)具名插槽:

//父组件
<template>
    <div>
        <Dcomp >
          <template #head>
               这里可以自定义head中的内容      
           </template>
           <template #body>
                  这里可以自定义body中的内容
           </template>
           <template #foot>
                这里可以自定义foot中的内容
           </template>
        </Dcomp >
    </div>
</template>
<script>
import Dcomp from "@/components/d"
export default{
    name:"" ,
    components:{Dcomp},   
    
}

</script>

//插槽组件
<template>
    <div>
        <div>
               <slot class="head" name="head" >我是默认head</slot>
        </div>
        <div>
            <slot class="body" name="body" >我是默认body</slot>
        </div>
        <div>
            <slot class="body" name="footer" >我是默认footer</slot>
        </div>


    </div>
</template>

在插槽组件中通过给slot标签添加name来对应具体的内容。这样父组件Dcomp中就默认暂时分别展示slot的内容。而如果父组件中自定义了内容,则会替换掉slot中的默认的内容

(2)作用域插槽

想想element-ui中table组件自定义内容时,通过scope.row.name就能获取到当前name的值

 <template slot-scope="scope">
        <span>{{scope.row.name}}</span>
 </template>

而name的具体数据明显是在插槽中的。这就是作用域插槽的具体应用。

还是通过上面的例子。来看看如何实现。

//父组件
<template>
    <div>
        <Dcomp >
               <template v-slot:head="scope">
                  <h2> head---</h2>
                  <div class="err">{{scope.data.name}}</div>
              </template>
               <template v-slot:body="scope">
                  <h2> body---</h2>
                  <div class="err">{{scope.data.name}}</div>
              </template>
                <template v-slot:foot="scope">
                  <h2> footer---</h2>
                 <div class="err">{{scope.data.name}}</div>
              </template>
        </Dcomp >
     // v-slot可以简写成#,等价于以下写法
      <!--  <Dcomp >
               <template #head="scope">
                  <h2> head---</h2>
                  <div class="err">{{scope.data.name}}</div>
              </template>
               <template #body="scope">
                  <h2> body---</h2>
                  <div class="err">{{scope.data.name}}</div>
              </template>
                <template #foot="scope">
                  <h2> footer---</h2>
                 <div class="err">{{scope.data.name}}</div>
              </template>
        </Dcomp >    
        <--!>
    </div>
</template>
<script>
import Dcomp from "@/components/d"
export default{
    name:"" ,
    components:{Dcomp},   
}

</script>

//插槽组件
<template>
    <div>
        <div>
            <slot class="head" name="head" :data="itemData.head">
                {{itemData.head.gender}}
            </slot>
        </div>
        <div>
            <slot class="body" name="body" :data="itemData.body">
                {{itemData.body.gender}}
            </slot>
        </div>
        <div>
            <slot class="foot" name="foot" :data="itemData.footer">
                {{itemData.footer.gender}}
            </slot>
        </div>
    </div>
</template>
<script>

export default{

    name:"slotcomp",
    data() {
        return {
            itemData:{
                head:{
                    name:"head",
                    age:32,
                    gender:"male"
                },
                body:{
                    name:"body",
                    age:24,
                    gender:"formale"
                },
                footer:{
                    name:"footer",
                    age:34,
                    gender:"male"
                }
            
            },
        };
    },

}



</script>

最后页面效果展示如下:

vue中slot的使用

(1) 注意这里名称的对应关系:在slot中我们给head、body、footer分别绑定了一个data,那在父组件中自定义内容获取数据的时候。scope其实就是我们绑定的data:

(2)v-slot的书写规则是 v-slot:(slot对应的名称,比如这里的head。body,foot)=“scope“,这里的scope就是在solt组件中绑定的数据名称,比如上面实例中的data。

(3) v-slot:(slotname)="slot-data" 只能卸载template中。

 <template v-slot:head="scope">

                  <h2> head---</h2>

                  <div class="err">{{scope.data}}</div>

  </template>

上一篇:LiuShuaiDong:vue语法


下一篇:pygame小游戏开发 - 贪吃蛇