前端vue入门(纯代码)19

不管何时何地,永远保持热爱,永远积极向上!!!

21.Vue中的插槽slot

  • 父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

  • 一个不带 name 的 会带有隐含的名字name=“default”

  • 问题:插槽(slot)是什么?兄弟们也可以点这里去看这位兄弟的博客,写的比我详细!!!

    • 【理解1】:插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签。简单理解就是子组件中留下个“坑”,父组件可以使用指定内容来补“坑”。
    • 【理解2】:插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性。插槽显不显示、怎样显示是由父组件来控制的;而插槽在哪里显示就由子组件来进行控制。
  • 问题:三种插槽(slot):

    • 1、默认插槽

      <slot>slot>
      
    • 2、具名插槽

       <slot name="名称">slot>
      
    • 3、作用域插槽

      <slot :自定义 name = data 中的属性对象>slot>
      
1.默认插槽slot
  • 【父组件:App;子组件:Category】
  • 在子组件:Category中定义一个默认插槽。
<template>
  <div class="about">
    <h1>这里是子组件Categoryh1>
    
    <slot>slot>
  div>
template>
  • 在App父组件中的子组件--这里东西放入子组件的插槽中--
<template>
  <div class="container">
    <h1>这里是父组件h1>
    <category title="美食">
        <img src="http://rwt9uxba6.hd-bkt.clouddn.com/9999.png" />
    category>
  div>
template>
  • 但是,如果在子组件:Category中定义多个默认插槽【比如:两个默认插槽】。

那么,就会把要放入插槽中的东西复制几份【比如:两个默认插槽就复制两份】

<template>
  <div class="about">
    <h1>这里是子组件Categoryh1>
    
    <slot>slot>
    <slot>slot>
  div>
template>
  • 自己的例子展示:

前端vue入门(纯代码)19_第1张图片
我们看一下:不是动态的数据,即静态的数据,怎么从父组件传递给子组件的【依旧可以使用props

子组件:category.vue

<template>
	<div class="category">
		<h3>{{ title }}分类h3>
		
		<slot>我是一些默认值,当使用者没有传递具体结构时,我会出现slot>
	div>
template>

<script>
export default {
	name: 'Category',
	// 父组件给子组件传递数据:props
	props: ['title'],
};
script>

父组件:app.vue

//静态的数据		title不是变量,是个常量
   	<category title="美食">
   		<img src="http://rwt9uxba6.hd-bkt.clouddn.com/9999.png" />
   	category>

//动态的数据		 data是变量,不是常量
   	<category  :data="data">
   		<img src="http://rwt9uxba6.hd-bkt.clouddn.com/9999.png" />
   	category>

上面案例完整代码:

main.js

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//引入vue-resource插件
// import vueResource from 'vue-resource';
//关闭Vue的生产提示
Vue.config.productionTip = false
//使用插件
// Vue.use(vueResource)

//创建vm
new Vue({
	el:'#app',
	render: h => h(App),
    // 生命周期钩子beforeCreate中模板未解析,且this是vm
    beforeCreate() {
    // this:指的是vm
		Vue.prototype.$bus = this  //安装全局事件总线$bus
	}
})

App.vue

<template>
	<div class="container">
		<category title="美食">
			<img src="http://rwt9uxba6.hd-bkt.clouddn.com/9999.png" />
		category>
		<category title="游戏">
			<ul>
				<li v-for="(g, index) in games" :key="index">{{ g }}li>
			ul>
		category>
		<category title="电影">
			<video
				src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"
			>video>
		category>
	div>
template>

<script>
import Category from './components/Category';
export default {
	name: 'App',
	components: { Category },
	data() {
		return {
			foods: ['火锅', '烧烤', '小龙虾', '牛排'],
			games: ['红色警戒', '穿越火线', '劲舞团', '超级玛丽'],
			films: [
				'《教父》',
				'《拆弹专家》',
				'《你好,李焕英》',
				'《尚硅谷》',
			],
		};
	},
};
script>
<style scoped>
.container {
	/* 弹性布局 */
	display: flex;
	/* 弹性项目平均分布在该行上,两边留有一半的间隔空间。 */
	justify-content: space-around;
}
style>

Category.vue

<template>
	<div class="category">
		<h3>{{ title }}分类h3>
		
		<slot>我是一些默认值,当使用者没有传递具体结构时,我会出现slot>
	div>
template>

<script>
export default {
	name: 'Category',
	// 父组件给子组件传递数据:props
	props: ['title'],
};
script>

<style scoped>
.category {
  background-color: aquamarine;
  width: 200px;
  height: 300px;
}
h3{
  background-color: orange;
  /* 为文本或img标签等一些内联对象(或与之类似的元素)的居中。 */
  text-align: center;
}
img {
  /* 占父元素的比例 */
	width: 100%;
}
video {
   /* 占父元素的比例 */
	width: 100%;
}
style>
2.具名插槽slot
  • 什么是具名插槽?

其实就是在子组件中定义插槽时,给对应的插槽分别起个名字,方便后边插入父组件将根据name来填充对应的内容。

<slot name="one">slot>
<slot name="two">slot>
  • 【父组件:App;子组件:Category】

  • 在子组件:Category中定义两个具名插槽。

<template>
  <div class="about">
    <h1>T这里是子组件Categoryh1>
    
    <slot name="one">slot>
    <slot name="two">slot>
  div>
template>
  • 在App父组件中:【这里东西放入子组件的插槽中,有插槽名的一一对应放入】
<category title="美食">
    <template slot="one">
       <p>one插槽p>
    template>
    <template  slot="two">
       two插槽
    template>
category>
  • 【注意】:要放入具名插槽的结构,最好用包裹起来,好处是:不渲染真实DOM,结构少了一层,并且还可以用这种写法【v-slot:插槽名】: