11-Vue技术栈之插槽的使用

命运对每个人都是一样的,不一样的是各自的努力和付出不同,付出的越多,努力的越多,得到的回报也越多,在你累的时候请看一下身边比你成功却还比你更努力的人,这样,你就会更有动力。

导读:本篇文章讲解 11-Vue技术栈之插槽的使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1、作用

  • 让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 父组件 ===> 子组件

2、分类

  • 默认插槽、具名插槽、作用域插槽

3、使用方式

  1. 默认插槽:

    父组件中:
            <Category>
               <div>html结构1</div>
            </Category>
    子组件中:
            <template>
                <div>
                   <!-- 定义插槽 -->
                   <slot>插槽默认内容...</slot>
                </div>
            </template>
    
  2. 具名插槽:

    父组件中:
            <Category>
                <template slot="center">
                  <div>html结构1</div>
                </template>
    
                <template v-slot:footer>
                   <div>html结构2</div>
                </template>
            </Category>
    子组件中:
            <template>
                <div>
                   <!-- 定义插槽 -->
                   <slot name="center">插槽默认内容...</slot>
                   <slot name="footer">插槽默认内容...</slot>
                </div>
            </template>
    
  3. 作用域插槽:

    1. 理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。(games数据在Category组件中,但使用数据所遍历出来的结构由App组件决定)

    2. 具体编码:

      父组件中:
      		<Category>
      			<template scope="scopeData">
      				<!-- 生成的是ul列表 -->
      				<ul>
      					<li v-for="g in scopeData.games" :key="g">{{g}}</li>
      				</ul>
      			</template>
      		</Category>
      
      		<Category>
      			<template slot-scope="scopeData">
      				<!-- 生成的是h4标题 -->
      				<h4 v-for="g in scopeData.games" :key="g">{{g}}</h4>
      			</template>
      		</Category>
      子组件中:
              <template>
                  <div>
                      <slot :games="games"></slot>
                  </div>
              </template>
      		
              <script>
                  export default {
                      name:'Category',
                      props:['title'],
                      //数据在子组件自身
                      data() {
                          return {
                              games:['红色警戒','穿越火线','劲舞团','超级玛丽']
                          }
                      },
                  }
              </script>
      

4、插槽的应用

  • 实现效果:

在这里插入图片描述

  • 结构目录
    在这里插入图片描述
    App组件
<template>
  <div class="container">
    <Category title="美食">
      <template slot="slots" slot-scope="infos">
        <ul>
          <li v-for="(f, index) in infos.info.foods" :key="index">{{ f }}</li>
        </ul>
        <img
          src="https://ts1.cn.mm.bing.net/th/id/R-C.75121d5ce24b24e3f2403acd7685bccd?rik=IytdeQxEz5B9gg&riu=http%3a%2f%2fimg95.699pic.com%2fphoto%2f50099%2f7143.jpg_wh860.jpg&ehk=deNF%2fD9bPTLPy9YYfehgbZlj5cTQfCN0E9RGcHGiQY8%3d&risl=&pid=ImgRaw&r=0"
          alt=""
        />
      </template>
    </Category>

    <Category title="游戏">
      <template slot="slots" slot-scope="infos">
        <ul>
          <li v-for="(g, index) in infos.info.games" :key="index">{{ g }}</li>
        </ul>
        <img
          src="https://ts1.cn.mm.bing.net/th/id/R-C.7bf18c5358339bf8e43c98c72a3d7a47?rik=6qvk8oHOKHsCMg&riu=http%3a%2f%2fsc.68design.net%2fphotofiles%2f201809%2fiWxCxnbfIL.jpg&ehk=NmYVwSMeRcl%2byDa7nGmn%2bN%2bkMWoNlq3ZClFBEMyu9e0%3d&risl=&pid=ImgRaw&r=0"
          alt=""
        />
      </template>
    </Category>

    <Category title="电影">
      <template slot="slots" slot-scope="infos">
        <ul slot="slots">
          <li v-for="(f, index) in infos.info.films" :key="index">{{ f }}</li>
        </ul>
        <video
          controls
          src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"
        ></video>
      </template>
    </Category>
  </div>
</template>

<script>
import Category from "./components/Category";
export default {
  name: "App",
  components: { Category },
};
</script>

<style scoped>
.container {
  display: flex;
  justify-content: space-around;
}
</style>

Category组件

<template>
  <div class="category">
    <h3>{{ title }}分类</h3>
    <!-- 定义一个插槽(挖个坑,等着组件的使用者进行填充) -->
    <slot name="slots" :info="info"
      >我是一些默认值,当使用者没有传递具体结构时,我会出现</slot
    >
  </div>
</template>

<script>
export default {
  name: "Category",
  props: ["title"],
  data() {
    return {
      info: {
        foods: ["火锅", "烧烤", "小龙虾", "牛排"],
        games: ["红色警戒", "穿越火线", "劲舞团", "超级玛丽"],
        films: [
          "《教父》",
          "《拆弹专家》",
          "《你好,李焕英》",
          "《仙剑奇侠传》",
        ],
      },
    };
  },
};
</script>

<style scoped>
.category {
  background-color: rgb(192, 197, 199);
  width: 200px;
  height: 298px;
  border-radius: 5px;
}
h3 {
  text-align: center;
  background-color: rgb(235, 114, 15);
}
video {
  width: 100%;
  margin-top: 22px;
  border-radius: 5px;
}
img {
  width: 100%;
  height: 110px;
  border-radius: 5px;
  margin-top: 24px;
}
</style>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/144041.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!