首页 > 其他分享 >Vue CLI 系列之(十八)插槽

Vue CLI 系列之(十八)插槽

时间:2024-02-29 20:06:21浏览次数:34  
标签:Category Vue CLI 插槽 App 默认 组件 结构

插槽

结构在哪【结构的代码在哪个组件】,样式就写在哪【样式就写在哪个组件中】

这里的App组件是Category组件的父组件

<!-- Category组件 -->
<h3>{{title}}分类</h3>
<!-- 定义一个插槽,相当于提前挖了个坑 -->
<!-- slot标签的作用相当于占位符,用于告诉Vue组件标签的标签体内容应该放的位置,slot标签在哪,标签体就放在哪 -->
<slot></slot>

<!-- App组件 -->
<Category title="食物">
  	<!-- 组件标签的标签体内容:用于传递动态结构-->
	<!-- 组件的标签体内容就相当于往组件的坑里填土 -->
	<img src="https://img1.baidu.com/it/u=3009731526,373851691&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500" >
</Category>
<Category title="游戏">
	<ul>
		<li v-for="(game,index) in games" :key="index">{{game}}</li>
	</ul>
</Category>

注:Category组件的标签体内容是在App组件中解析完成后,传入到Category组件中的,所以标签体内容中的样式完全可以写在App组件中

Category组件的标签体内容中的样式写在App组件中和Category组件中有什么不同?

App组件中:标签体内容在App组件中解析完成后带着样式传到了Category组件中

Category组件中:App组件直接将标签体内容传到了Category组件中,然后应用的样式

插槽分为默认插槽、具名插槽、作用域插槽

1. 默认插槽

<!-- Category组件 -->
<h3>{{title}}分类</h3>
<!-- 定义插槽时可以设置默认结构 -->
<slot>我是默认结构,如果没往插槽中放东西,我就会显示,传了结构就不会显示</slot>

2. 具名插槽

具名插槽:具有名字的插槽

应用场景:一个组件中定义多个不同的插槽时

<!-- Category组件 -->
<h3>{{title}}分类</h3>
<!-- 组件中有多个坑【插槽】就要给每个坑【插槽】起个名 -->
<slot name="center"><h1>我是默认内容,如果没传结构,我就会显示,传了结构就不会显示</h1></slot>
<slot name="footer"><h1>我是默认内容,如果没传结构,我就会显示,传了结构就不会显示2</h1></slot>

<!-- App组件 -->
<Category title="食物">
	<!-- slot属性:填坑的时候告诉Vue要给哪个坑【插槽】填东西,Vue会将slot属性所在的元素放到坑里   -->
	<img slot="center" src="https://img1.baidu.com/it/u=3009731526,373851691&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500" >
	<a slot="footer" href="http://www.baidu.com">点击跳转</a>
</Category>
<Category title="游戏">
	<ul slot="center" >
		<li v-for="(game,index) in games" :key="index">{{game}}</li>
	</ul>
	<!-- 往同一个坑里填多个东西,只会追加,不会覆盖 -->
	<!-- <a slot="footer" href="http://www.baidu.com">点击跳转</a> -->
	<!-- <a slot="footer" href="http://www.baidu.com">点击跳转2</a> -->
	
	<!-- 往同一个坑里填多个东西时,如果每个东西分开写,slot属性要写多次 -->
	<!-- 如果用div包裹,在最终的结构中会多出一层div结构,使用template则不会 -->
    <!-- template:能够包裹元素,自身最终又不生成真实的DOM元素 -->
	<!-- <template slot="footer"> -->
		<!-- <a href="http://www.baidu.com">点击跳转</a> -->
		<!-- <a href="http://www.baidu.com">点击跳转2</a> -->
	<!-- </template> -->
	
	<!-- 如果使用template,slot标签会有一种新的写法,v-slot:插槽名, Vue 2.6+ 才支持 -->
	<template v-slot:footer>
		<a href="http://www.baidu.com">点击跳转</a>
		<a href="http://www.baidu.com">点击跳转2</a>
	</template>
</Category>

3. 作用域插槽

js中的作用域

<!-- Category组件 -->
<h3>{{title}}分类</h3>
<!-- 通过slot标签传递的数据传给了该插槽的使用者 -->
<slot :games="games"><h1>我是默认内容,如果没传结构,我就会显示,传了结构就不会显示</h1></slot>

data(){
	return {
		games: ['红色警戒','cf','cs','超级玛丽'],
	}
}

<!-- App组件 -->
<Category title="游戏">
	<!-- 要想收到Category组件中插槽传过来的数据,必须使用template标签 -->
	<!-- scope属性的属性值任意,会接收所有来自插槽的数据封装为一个对象 -->
	<template scope="data">
		<ul>
			<li v-for="(game,index) in data.games" :key="index">{{game}}</li>
		</ul>
	</template>
</Category>

<Category title="游戏">
	<!-- 此处的scope还可以写成slot-scope,作用相同,只不过这个是新的API写法 -->
	<template slot-scope="data">
		<ol>
			<li v-for="(game,index) in data.games" :key="index">{{game}}</li>
		</ol>
	</template>
</Category>

<Category title="游戏">
	<!-- 此处支持ES6中的解构赋值 -->
	<template slot-scope="{games}">
		<h4 v-for="(game,index) in games" :key="index">{{game}}</h4>
	</template>
</Category>

App组件在使用Category组件的同时,数据也是在App组件中的

Category组件的使用者使用Category组件的同时,数据也在Category组件的使用者中

数据是相同的,但根据数据生成的结构是由使用者决定的

数据在Category组件中,但根据数据生成的结构要由Category组件的使用者App组件决定

使用子组件中的数据生成不同的结构

解构赋值

数据是在子组件【定义插槽的组件】中的,父组件【插槽的使用者】可以拿到子组件中的数据,使用数据生成不同的结构。【数据由子组件决定,结构由父组件决定】

4. 总结

  1. 作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信【这里传递的数据是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>
        

标签:Category,Vue,CLI,插槽,App,默认,组件,结构
From: https://www.cnblogs.com/wzzzj/p/18040006

相关文章

  • Vue Router系列之(四)嵌套路由
    嵌套(多级)路由展示区中包含了新的导航区和展示区配置路由规则,使用children配置项:routes:[ //routes中直接配置的是一级路由 { path:'/about', component:About, }, { path:'/home', component:Home, children:[//通过children配置子级路由 { path:'n......
  • Vue Router系列之(三)几个注意点
    几个注意点路由组件通常存放在pages文件夹,一般组件通常存放在components文件夹。通过组件的使用方式不同将组件划分为不同的分类:路由组件和一般组件路由组件:靠路由规则匹配出来,由路由器帮我们渲染的组件【我们没有亲自写过这种组件标签】一般组件:我们亲自写的组件标签路由......
  • Vue Router系列之(二)Vue Router的使用步骤
    使用步骤安装vue-router,命令:npmivue-router导入并应用插件//main.jsimportVueRouterfrom'vue-router'Vue.use(VueRouter)创建src/router/index.js,该文件专门用于创建整个应用的路由器//引入VueRouterimportVueRouterfrom'vue-router'//引入About、Home组......
  • Vue Router系列之(八)router-link 标签的replace属性
    <router-link>的replace属性作用:控制路由跳转时操作浏览器历史记录的模式浏览器的历史记录有两种写入方式:分别为push和replace,push是追加历史记录,不破坏栈中的任何一条数据,不断的压入数据,replace是替换掉当前栈顶的那一条记录。路由跳转时候默认为push注:浏览器的历史记录实......
  • Vue Router系列之(七)路由的props配置项
    路由的props配置项​ 路由组件读取其他组件传递的参数时,是通过$route.params.id这种方式读取的,$route.params部分代码冗余度高,如何能够降低这种冗余?props配置项可以做到​ 作用:让路由组件更方便的收到参数{ name:'xiangqing', path:'detail/:id', component:Detail,/......
  • Vue Router系列之(六)命名路由
    命名路由命名路由:给你的路由规则起个名字作用:可以简化路由的跳转【路由层级比较多时】。如何使用给路由规则命名:{ path:'/demo', component:Demo, children:[ { path:'test', component:Test, children:[ {name:'hello'//通......
  • Vue Router系列之(五)路由传参
    路由传参如何给路由组件传递参数点击导航区的时候将数据带给路由组件,展示区根据数据渲染组件,渲染的都是同一个组件,只不过数据不同路由组件可以接收两种参数:query参数和params参数这两种参数的写法与Ajax中query参数和params参数的写法是一样的1.query参数传递参数<!--......
  • Vue Router系列之(十一)两个新的生命周期钩子
    两个新的生命周期钩子​ 缓存路由组件和定时器一起使用时,如果进行了路由跳转,本应触发在beforeDestroy钩子中清除定时器方法,但因为缓存了路由组件,就导致原来的路由组件的beforeDestroy钩子不会被触发,定时器也就不会清除作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态......
  • Vue Router系列之(十)缓存路由组件
    缓存路由组件完善路由的技巧作用:让不展示的路由组件保持挂载,不被销毁。​ 正常情况下,进行了路由跳转后,之前的组件会被销毁,如果之前的组件中存在input框之类的表单类组件,输入的内容也就消失了,也就是说,要保证路由跳转后不销毁之前的组件具体编码://缓存的对象:并不是所有路......
  • 答应我,在vue中不要滥用watch好吗?
    前言上周五晚上8点,开开心心的等着产品验收完毕后就可以顺利上线。结果产品突然找到我说要加需求,并且维护这一块业务的同事已经下班走了,所以只有我来做。虽然内心一万头草泥马在狂奔,但是嘴里还是一口答应没问题。由于这一块业务很复杂并且我也不熟悉,加上还饿着肚子,在梳理代码逻辑......