[干货]关于vue作用域插槽的新的深入理解

Posted lsc-boke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[干货]关于vue作用域插槽的新的深入理解相关的知识,希望对你有一定的参考价值。

父级组件

<template>
  <div class="wrapper">
    <son1 title="标题3" :content="listData3" @father="teClick">
      <template v-slot="scope">
        <b class="qianz">scope.item.prefix ? ‘有前缀‘ : ‘无前缀‘</b>
      </template>
    </son1>
    </son1>
  </div>
</template>

<script>
import son1 from ‘./1_son.vue‘;

export default 
  components: 
    son1
  ,
  props: ,
  data() 
    return 
      listData1: [‘列表项1‘, ‘列表项2‘, ‘列表项3‘],
      listData2: [ text: ‘第二个列表的列表项1‘, img: ‘example.png‘ ,  text: ‘第二个列表的列表项2‘, img: ‘example.png‘ ,  text: ‘第二个列表的列表项3‘, img: ‘example.png‘ ],
      listData3: [
         text: ‘第三个列表的列表项1‘, prefix: true, remark: ‘附加的备注1‘ ,
         text: ‘第三个列表的列表项2‘, prefix: false, remark: ‘附加的备注2‘ ,
         text: ‘第三个列表的列表项3‘, prefix: true, remark: ‘附加的备注3‘ 
      ],
      list: [
        
          name: ‘tate‘,
          age: 26,
          single: true,
          stu: false,
          state: 1
        ,
        
          name: ‘kevin‘,
          age: 23,
          single: true,
          stu: true,
          state: 2
        ,
        
          name: ‘harden‘,
          age: 28,
          single: false,
          stu: false,
          state: 3
        ,
        
          name: ‘Jimmy‘,
          age: 29,
          single: false,
          stu: true,
          state: 4
        
      ]
    ;
  ,
  watch: ,
  computed: ,
  methods: 
    teClick(vl) 
      console.log(‘我是‘, vl);
    
  ,
  created() ,
  mounted() 
;
</script>
<style  scoped>
.wrapper 

.qianz 
  color: green;

</style>

子级组件

<template>
  <div class="wrapper">
    <div class="list">
      <div class="list-title">title</div>
      <ul class="list-content">
        <li v-for="(item ,index) in content" :key="index">
          <div class="texheader">
            <div class="tximg"></div>
            <div @click="listD(item.text)">item.text</div>
          </div>
          <slot :item="item">item</slot>
          <div>我是页眉我是页眉我是页眉我是页眉我是页眉</div>
          <!-- <slot :item="item">item</slot> -->
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default 
  components: ,
  props: 
    content: 
      type: Array
    ,
    title: 
      type: String,
      required: true
    
  ,
  data() 
    return ;
  ,
  watch: ,
  computed: ,
  methods: 
    listD(data) 
      this.$emit(‘father‘, data);
    
  ,
  created() ,
  mounted() 
    console.log(this.content);
  
;
</script>
<style  scoped>
.wrapper 
  width: 600px;

.tximg 
  width: 50px;
  height: 50px;
  background: green;

.texheader 
  display: flex;
  flex-direction: row;
  align-items: center;

.list-content 
  color: blue;
  list-style: none;
  display: flex;
  flex-direction: row;

.list-content li 
  width: 33.33%;

.list-title 
  color: orange;

/* .list 
  width: 200px;
  height: 200px;
  border: 1px solid #cacaca;
 */
</style>

总结:

最重要的展现是:

在子组件当中,有一条<slot :item="item">item</slot>,它的作用有2条:

1>把从父组件通过props传到子组件的值传到了父组件的 

v-slot="scope" 通过scope.item就可以获取到相对应的数组对象
2>子组件其实已经有一定的结构了,当什么时候需求改变了,又需要在以前的组件中重新扩展一些内容的时候,这个时候就能体现出作用域插槽的作用了
子组件的
<slot :item="item">item</slot>插在原来子组件位置的哪里;父组件通过
<template v-slot="scope">
        <b class="qianz">scope.item.prefix ? ‘有前缀‘ : ‘无前缀‘</b>
      </template>

就会把相对应的新样式结构加入到原来的组件之中,非常的方便与灵活



以上是关于[干货]关于vue作用域插槽的新的深入理解的主要内容,如果未能解决你的问题,请参考以下文章

vue插槽slot理解

vue 2.6 插槽更新 v-slot 用法总结

新版vue作用域插槽的使用

Vue插槽理解

436 vue slot:插槽基本使用,具名插槽,作用域插槽

[vue3进阶] 4.slot插槽1——基本用法和默认值