Vue(第三弹) slot插槽

在使用组件时,我们常常要像这样组合它们:

<app>
  <app-header></app-header>
  <app-footer></app-footer>
</app>

单个插槽
假定 my-component 组件有如下模板:

<div>
  <h2>我是子组件的标题</h2>
  <slot>
    只有在没有要分发的内容时才会显示。
  </slot>
</div>

父组件模板

<div>
  <h1>我是父组件的标题</h1>
  <my-component>
    <p>这是一些初始内容</p>
    <p>这是更多的初始内容</p>
  </my-component>
</div>

结果

<div>
  <h1>我是父组件的标题</h1>
  <div>
    <h2>我是子组件的标题</h2>
    <p>这是一些初始内容</p>
    <p>这是更多的初始内容</p>
  </div>
</div>

具名插槽
有时我们需要多个插槽。例如,假定我们有一个 app-layout 组件:

<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>

slot 元素有一个特殊的特性:name。这个特性可以用来定义额外的插槽:

父组件模板

<app-layout>
  <h1 slot="header">这里可能是一个页面标题</h1>
  <p>主要内容的一个段落。</p>
  <p>另一个主要段落。</p>
  <p slot="footer">这里有一些联系信息</p>
</app-layout>
结果为:
<div class="container">
  <header>
    <h1>这里可能是一个页面标题</h1>
  </header>
  <main>
    <p>主要内容的一个段落。</p>
    <p>另一个主要段落。</p>
  </main>
  <footer>
    <p>这里有一些联系信息</p>
  </footer>
</div>
一个不带 name 的 出口会带有隐含的名字“default”

案例

在这里插入图片描述

  <!DOCTYPE html>
  

								(html)

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>*{margin:0;padding: 0;}</style>
		<link rel="stylesheet" href="../components/modal/modal.css"><script src="../js/vue.js" type="text/javascript" charset="utf-8"></script></head>
	<body>
		<div id="app">
			<h1>弹框组件</h1>
			<!-- 通过单击  flag设置为true,显示弹框 -->
			<button @click="flag=true">弹框</button>
			<button @click="flag2=true">弹框2</button>
			<!-- visible 控制弹框是否显示 flag默认是false 默认不显示 -->
			<!-- <modal :visible="flag" @update:visible="flag=$event"></modal> -->
			<modal :visible.sync="flag" :title="'编辑对象'"></modal>
			<!-- :visible.sync="flag" 是一个简写形式 等同于 
			:visible="flag" 和@update:visible="flag=$event"  -->
			<!-- :visible="flag" 给子组件传递一个visible属性 值是flag -->
			<!--@update:visible="flag=$event" 监听子组件的update事件visible参数 设置flag为值为事件对象 -->
			<modal :visible.sync="flag2" :title="'创建对象'"></modal>
			
		</div>
		<script type="module">
		// 单击x关闭
		// 告诉父元素把visible属性值改成false
		// $emit("update:visble",false)
		
		import modal from '../components/modal/modal.js';⭐导入
		
		new Vue({
			components:{modal},
			el:"#app",
			data:{
				flag:false,//控制弹框是否显示
				flag2:false
			}
			 
		})
		</script>
	</body>
</html>

							(css)
.modal {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	top: 0;
	z-index: 500;
	background-color: rgba(0, 0, 0, .4);
}

.modal-content {
	position: absolute;
	left: 0;
	top: 0;
	right: 0;
	bottom: 0;
	width: 400px;
	height: 300px;
	margin: auto;
	background-color: #fff;
	border-radius: 12px;
	overflow: hidden;
	box-shadow: 0 0 12px rgba(0, 0, 0, .2);
}

.modal-title {
	line-height: 44px;
	padding: 0 15px;
	display: flex;
	font-size: 1.2em;
	background-color: #f0f0f0;
	justify-content: space-between;
}

.modal .close {
	display: inline-block;
	line-height: 44px;
	color: #ff0000;
	cursor: pointer;
}

								(js)
const modal = {
			template:`<div class="modal" v-if="visible">
				<div class="modal-content">
					<div class="modal-title">{{title}}
					<span class="close" 
					@click="$emit('update:visible',false)">
					&times;</span>
					</div>
					<div class="modal-body">
						<slot></slot>
					</div>
				</div>
			</div>`,
			props:{
				// 通过属性来接收
				"visible":{type:Boolean,default:false},
				"title":{type:String,default:''}
			}
		}

export default modal;//⭐导出
可以参考以下代码实现: ```vue <template> <div> <el-table :data="tableData"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column label="操作"> <template #default="{ row }"> <el-button @click="editRow(row)">编辑</el-button> </template> </el-table-column> </el-table> <el-dialog :visible.sync="dialogVisible" v-if="editData"> <el-form ref="form" :model="editData"> <el-form-item label="姓名" prop="name"> <el-input v-model="editData.name"></el-input> </el-form-item> <el-form-item label="年龄" prop="age"> <el-input v-model.number="editData.age"></el-input> </el-form-item> </el-form> <div slot="footer"> <el-button @click="dialogVisible = false">取 消</el-button> <el-button type="primary" @click="saveEdit">确 定</el-button> </div> </el-dialog> </div> </template> <script> import { ref } from 'vue' import { ElTable, ElTableColumn, ElButton, ElDialog, ElForm, ElFormItem, ElInput } from 'element-plus' export default { components: { ElTable, ElTableColumn, ElButton, ElDialog, ElForm, ElFormItem, ElInput }, setup() { const tableData = ref([ { name: '张三', age: 20 }, { name: '李四', age: 25 }, { name: '王五', age: 30 } ]) const editData = ref(null) const dialogVisible = ref(false) const editRow = (row) => { editData.value = Object.assign({}, row) } const saveEdit = () => { const index = tableData.value.findIndex(item => item === editData.value) tableData.value.splice(index, 1, editData.value) editData.value = null dialogVisible.value = false } return { tableData, editData, dialogVisible, editRow, saveEdit } } } </script> ``` 以上代码中,我们使用了 vue3 和 element-plus 提供的组件和 API,来实现编辑表格的功能。具体实现步骤如下: 1. 在 setup 函数中使用 ref 创建响应式变量 tableData、editData 和 dialogVisible,分别用于存储表格数据、编辑数据和编辑对话框的显示状态。 2. 在模板中使用 el-table 组件渲染表格,并使用 el-table-column 组件定义表格列,其中第三列使用了插槽和 el-button 组件来实现编辑按钮。 3. 在表格的编辑按钮点击事件中,调用 editRow 方法,并将当前行的数据保存到 editData 变量中。 4. 在编辑对话框中使用 el-dialog、el-form 和 el-form-item 组件来定义表单项,然后使用 el-input 组件和 v-model 指令来绑定编辑数据。 5. 在编辑对话框的确定按钮点击事件中,调用 saveEdit 方法,更新表格数据并关闭编辑对话框。 6. 在 el-dialog 组件上使用 v-if 指令来判断是否显示编辑对话框,只有在编辑数据存在时才显示对话框。 需要注意的是,我们在 el-input 组件上使用了 v-model.number 指令来将年龄属性绑定为数字类型,这样在保存数据时才能正确计算年龄的值。另外,我们还使用了 Object.assign 方法来复制当前行的数据,避免直接修改原始数据造成不必要的副作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值