项目资源下载链接:
git clone http://git.itcast.cn/heimaqianduan/vue3-basic-project.git
复制下来,粘贴在小黑窗
App父组件代码如下:
<script setup>
import axios from 'axios';
import { onMounted, ref } from 'vue';
import Edit from './components/Edit.vue'
// TODO: 列表渲染
//实现功能需求思路:声明响应式list -> 调用接口获取数据 ->后端数据赋值给list -> 绑定到table组件
//1.获取响应式对象绑定到变量list
const list = ref([])
// 2.调用接口获取数据
//2.1声明方法 在方法体内写接口调用
const getList = async()=>{
//2.2接口调用 看README.md文档 同时使用async await 异步封装一下
const res = await axios.get('/list')
//3.交给list
list.value = res.data
}
// 在Mounted调用异步函数发起请求
onMounted(()=>getList())
// TODO: 删除功能
//具体实现功能思路:获取当前行的id -> 通过id调用删除接口 -> 更新最新的列表(重新渲染列表可调用getList)
const onDelete =async (id)=>{
console.log(id);
await axios.delete(`/del/${id}`)
getList()
}
// TODO: 编辑功能
// 具体实现功能思路: 打开弹窗 -> 回填数据 -> 更新数据
// 1.打开弹窗(获取Edit子组件的实例,调用方法修改属性)
//1.1使用ref获取响应式对象
const editRef = ref([null])
//声明一个回调函数
const onEdit = (row)=>{
//拿到子组件的实例对象之后
editRef.value.open(row)//2.回填数据(调用详情接口或者是当前行的静态数据)
}
</script>
<template>
<div class="app">
<el-table :data="list">
<el-table-column label="ID" prop="id"></el-table-column>
<el-table-column label="姓名" prop="name" width="150"></el-table-column>
<el-table-column label="籍贯" prop="place"></el-table-column>
<el-table-column label="操作" width="150">
<template #default="{row}"> <!--插槽知识点-->
<el-button type="primary" @click="onEdit(row)" link>编辑</el-button>
<el-button type="danger" @click="onDelete(row.id)" link>删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<Edit ref="editRef" @on-updata="getList"/>
</template>
<style scoped>
.app {
width: 980px;
margin: 100px auto 0;
}
</style>
Edit子组件代码如下:
<script setup>
// TODO: 编辑
import axios from 'axios';
// import { dialogVisible } from 'element-plus/es/components';
import { ref } from 'vue'
//2.弹框开关
const dialogVisible = ref(false)
//3.准备一个form
const form = ref({
name:'', //这两个数据要和父组件的表单控件prop一致
place:'',
id:''
})
//在父组件里面拿到子组件实例,定义子组件一个方法
const open = (row)=>{
console.log(row); //打印的是当前行的数据
form.value.name = row.name
form.value.place = row.place
form.value.id = row.id
dialogVisible.value = true
//此处完成之后要记住v-model的双向绑定
}
/*
此时open这个方法是不能直接被父组件调用的,因为在vue3里面
vue3的组件里面的属性和方法都是封闭的
需要通过defineExpose({})抛出才可以
*/
defineExpose({
open
})
//4.更新
const emit = defineEmits(['on-updata']) //调用编译器宏函数
const onUpdata =async ()=>{
//4.1收集表单数据 调用接口
await axios.patch(`/edit/${form.value.id}`,{
name:form.value.name,
place:form.value.place,
})
//4.2关闭弹框
dialogVisible.value = false
//4.3通知父组件做列表更新
emit('on-updata')
}
</script>
<template>
<el-dialog v-model="dialogVisible" title="编辑" width="400px">
<el-form label-width="50px">
<el-form-item label="姓名">
<el-input placeholder="请输入姓名" v-model="form.name"/>
</el-form-item>
<el-form-item label="籍贯">
<el-input placeholder="请输入籍贯" v-model="form.place"/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="onUpdata">确认</el-button>
</span>
</template>
</el-dialog>
</template>
<style scoped>
.el-input {
width: 290px;
}
</style>