1.定义页面的结构
使用了Element UI的el-form表单、el-table表格、el-input输入框以及el-button按钮等组件。这些组件可以像普通HTML元素一样使用,并且可以通过v-model指令进行双向数据绑定。其中如果需要为 元素的属性动态绑定属性值 ,则需要用到 v-bind 属性绑定指令,英文简写为:
源代码如下:
<template>
<div class="mod-product">
<el-form :inline="true" :model="formInline" @keyup.enter.native="search()">
<el-form-item>
<el-input v-model="formInline.name" placeholder="产品名称"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="search()">查询</el-button>
<el-button
v-if="isAuth('product:product:save')"
type="primary"
@click="addOrUpdateHandle()"
>新增</el-button
>
<el-button
v-if="isAuth('product:product:delete')"
type="danger"
@click="deleteHandle()"
:disabled="dataListSelections.length <= 0"
>批量删除</el-button
>
</el-form-item>
</el-form>
<el-table
:data="dataList"
border
v-loading="dataListLoading"
@selection-change="selectionChangeHandle"
style="width: 100%"
>
<el-table-column
type="selection"
header-align="center"
align="center"
width="50"
>
</el-table-column>
<el-table-column
prop="id"
label="ID"
header-align="center"
align="center"
width="100"
>
</el-table-column>
<el-table-column
prop="dateAdded"
label="日期"
header-align="center"
align="center"
width="250"
>
</el-table-column>
<el-table-column
prop="name"
label="产品名称"
header-align="center"
align="center"
width="250"
>
</el-table-column>
<el-table-column
prop="price"
label="产品价格"
header-align="center"
align="center"
width="250"
>
</el-table-column>
<el-table-column
prop="available"
label="产品是否可用"
header-align="center"
align="center"
width="250"
>
<template slot-scope="scope">
<!-- el-tag> 组件,用于显示用户状态 -->
<el-tag
v-if="scope.row.available === false"
size="small"
type="danger"
>false</el-tag
>
<el-tag v-else size="small">true</el-tag>
</template>
</el-table-column>
<el-table-column
prop="stock"
align="center"
header-align="center"
label="产品库存数量"
width="250"
>
</el-table-column>
<el-table-column
fixed="right"
header-align="center"
align="center"
label="操作"
>update
<!-- 自定义表格中每一行的操作按钮 -->
<template slot-scope="scope">
<el-button
v-if="isAuth('product:product:update')"
type="text"
size="small"
@click="addOrUpdateHandle(scope.row.id)"
>修改</el-button
>
<el-button
v-if="isAuth('product:product:delete')"
type="text"
size="small"
@click="deleteHandle(scope.row.id)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[5, 10, 20, 50]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper"
>
</el-pagination>
<!-- 弹窗, 新增 / 修改 -->
<add-or-update
v-if="addOrUpdateVisible"
ref="addOrUpdate"
@refreshDataList="getDataList"
></add-or-update>
</div>
</template>
2.处理交互行为
脚本(script)是Vue.js组件的另一个核心部分,它负责处理组件的业务逻辑和数据。在脚本中,我们可以定义组件的属性、方法、生命周期钩子函数等。
在<script>标签中,我们通常会编写JavaScript代码,其中必须包含一个export default对象,用于导出了一个包含了组件的数据、方法等配置的对象,使得其他组件或文件可以引入并使用这个组件。这个对象中一般要有methods:一个对象,用于定义组件的方法,data():用于定义组件的数据。
源代码如下:
<script>
import AddOrUpdate from "./product-add-or-update";
export default {
data() {
return {
formInline: {
name: "",
},
dataList: [],
pageIndex: 1,
pageSize: 5,
totalPage: 0,
//dataListLoading:一个布尔值,表示数据列表是否正在加载中,初始值为 false
dataListLoading: false,
//dataListSelections:一个数组,用于存储数据列表中被选中的条目,初始值为空数组
dataListSelections: [],
//一个布尔值,表示添加或更新操作的模态框是否可见,初始值为 false。
addOrUpdateVisible: false,
};
},
components: {
AddOrUpdate,
},
activated() {
this.getDataList();
},
methods: {
onSubmit() {
console.log("submit!");
},
// 查询
search() {
this.pageIndex = 1;
this.getDataList();
},
//新增 / 修改
addOrUpdateHandle(id) {
this.addOrUpdateVisible = true;
//
this.$nextTick(() => {
//
this.$refs.addOrUpdate.init(id);
});
},
// 获取数据列表
getDataList() {
this.dataListLoading = true;
this.$http({
url: this.$http.adornUrl("/product/product/list"),
method: "get",
params: this.$http.adornParams({
page: this.pageIndex,
limit: this.pageSize,
name: this.formInline.name,
}),
}).then(({ data }) => {
if (data && data.code === 0) {
this.dataList = data.page.list;
this.totalPage = data.page.totalCount;
} else {
this.dataList = [];
this.totalPage = 0;
}
this.dataListLoading = false;
});
},
// 每页数
sizeChangeHandle(val) {
// val 就是用户选择的新的分页大小
this.pageSize = val;
this.pageIndex = 1;
this.getDataList();
},
// 当前页
//在用户改变当前页码时,重新获取对应页的数据并更新界面
currentChangeHandle(val) {
//将 pageIndex 设置为新的页码 val
this.pageIndex = val;
this.getDataList();
},
// 多选
selectionChangeHandle(val) {
//这里的 val 应该是用户选择的新的数据项的集合
this.dataListSelections = val;
},
//删除
deleteHandle(id) {
var userIds = id
? [id]
: this.dataListSelections.map((item) => {
return item.id;
});
this.$confirm(
`确定对[id=${userIds.join(",")}]进行[${id ? "删除" : "批量删除"}]操作?`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
this.$http({
url: this.$http.adornUrl("/product/product/delete"),
method: "post",
data: this.$http.adornData(userIds, false),
}).then(({ data }) => {
//这个条件语句检查 data 对象是否存在,并且其中的 code 字段是否为 0。
if (data && data.code === 0) {
this.$message({
message: "操作成功",
type: "success",
duration: 1500,
onClose: () => {
//this.getDataList();
this.currentChangeHandle();
},
});
} else {
this.$message.error(data.msg);
}
});
})
.catch(() => {});
},
},
};
</script>