09-文章分类
1.1-页面布局(可以CV)
<template>
<div>
<el-card class="box-card">
<div slot="header" class="clearfix header-box">
<span>文章分类</span>
<el-button type="primary" size="mini">添加分类</el-button>
</div>
暂无数据
</el-card>
</div>
</template>
<script>
export default {
name: 'ArtCate'
}
</script>
<style lang="less" scoped>
.header-box {
display: flex;
justify-content: space-between;
align-items: center;
}
</style>
1.2-查询分类列表
需求:页面一加载,请求分类列表
-
为什么不直接在created钩子中发送ajax请求分类列表呢?
- 1.因为一个组件created钩子只会在加载时执行一次
- 2.而这个页面需要多次请求分类数据(当我们添加分类,或者删除分类都需要重新请求分类列表)
- 3.把发送ajax放到methods中, 这样任何地方都能主动调用。
<script>
export default {
name: "ArtCate",
data() {
return {
// 文章的分类列表
cateList: []
};
},
methods: {
async initCateList() {
const { data: res } = await this.$axios.get("/my/cate/list");
if (res.code === 0) {
this.cateList = res.data;
}
}
},
created() {
this.initCateList();
}
};
</script>
1.3-添加分类
(1)dialog对话框布局
-
dialog对话框:element.eleme.cn/#/zh-CN/com…
- 对话框内部嵌套el-form表单
<!-- 添加分类对话框 -->
<el-dialog title="添加文章分类" :visible.sync="addVisible" width="35%">
<!-- 添加的表单 -->
<el-form ref="addFormRef" label-width="100px">
<el-form-item label="分类名称">
<el-input
minlength="1"
maxlength="10"
></el-input>
</el-form-item>
<el-form-item label="分类别名">
<el-input minlength="1" maxlength="15"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="mini" @click="$refs.addFormRef.resetFields()">取 消</el-button>
<el-button size="mini" type="primary" @click="doAddCat">添 加</el-button>
</span>
</el-dialog>
(2)el-form双向绑定与表单校验
-
1.在data()中声明表单数据 与 校验规则
- 属性名一般与接口文档保持一致
data() {
return {
// 文章的分类列表
cateList: [],
// 对话框显示隐藏
addVisible:false,
// 表单的数据对象
addForm: {
cate_name: "",
cate_alias: ""
},
// 表单的验证规则对象
addRules: {
cate_name: [
{ required: true, message: "请输入分类名称", trigger: "blur" },
{
pattern: /^\S{1,10}$/,
message: "分类名必须是1-10位的非空字符",
trigger: "blur"
}
],
cate_alias: [
{ required: true, message: "请输入分类别名", trigger: "blur" },
{
pattern: /^[a-zA-Z0-9]{1,15}$/,
message: "分类别名必须是1-15位的字母数字",
trigger: "blur"
}
]
}
};
},
- 2.配置校验规则
(3)完成添加分类
methods: {
//1.获取分类列表
async initCateList() {
const { data: res } = await this.$axios.get("/my/cate/list");
if (res.code === 0) {
this.cateList = res.data;
}
},
//2.添加分类
doAddCat() {
// 表单校验结果
this.$refs.addFormRef.validate(async valid => {
//校验成功,发送ajax请求
if (valid) {
const { data: res } = await this.$axios.post(
"/my/cate/add",
this.addForm
);
if (res.code === 0) {
this.$message.success("添加分类成功!");
// 关闭对话框
this.addVisible = false;
// 重新请求列表数据
this.initCateList();
} else {
this.$message.error(res.message);
}
}
});
}
},
1.4-el-table渲染分类列表
<!-- 表格区域 -->
<el-table stype="width: 100%;" :data="cateList" border stripe>
<el-table-column
label="序号"
type="index"
width="100"
></el-table-column>
<el-table-column label="分类名称" prop="cate_name"></el-table-column>
<el-table-column label="分类别名" prop="cate_alias"></el-table-column>
<el-table-column label="操作">
<el-button type="primary" size="mini">修改</el-button>
<el-button type="danger" size="mini">删除</el-button>
</el-table-column>
</el-table>
1.5-删除分类
-
1.将el-table中的编辑和删除按钮放入template中
- 因为作用域插槽v-slot指令只能写在template标签中
作用域插槽
(1)elementui子组件内部给我们传递两个固定属性(固定的,不能改) row:当前组件渲染的元素item (就是el-table的data数组里面的元素) $index : 当前组件渲染的元素下标
(2)使用v-slot="对象名" 接收子组件传递的插槽,这里对象名是可以自定义的 底层: 对象名 = { row:数组元素, $index:数组下标 }
<el-table-column label="操作">
<!-- 作用域插槽
(1)elementui子组件内部给我们传递两个固定属性(固定的,不能改)
row:当前组件渲染的元素item (就是el-table的data数组里面的元素)
$index : 当前组件渲染的元素下标
(2)使用v-slot="对象名" 接收子组件传递的插槽,这里对象名是可以自定义的
底层: 对象名 = { row:数组元素, $index:数组下标 }
-->
<template v-slot="obj">
<!-- 按钮 -->
<el-button type="primary" size="mini" @click="doEdit(obj.row)"
>修改</el-button
>
<el-button type="danger" size="mini" @click="doDelete(obj.row.id)"
>删除</el-button
>
</template>
</el-table-column>
-
2.删除分类点击事件
- messageBox会返回一个promise对象,因此也可以使用异步函数
//3.删除分类
async doDelete(id) {
//(1)弹出确认框
const confirm = await this.$confirm(
"此操作将永久删除该分类, 是否继续?",
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}
).catch(err=>{})
//(2)点击确定发送ajax请求
if (confirm) {
const { data: res } = await this.$axios({
method: "delete",
url: "/my/cate/del",
params: { id }
});
//删除成功
if (res.code === 0) {
this.$message.success("删除分类成功!");
//重新加载分类列表
this.initCateList();
} else {
this.$message.error(res.message);
}
}
}
文章列表