使用bus
1. 创建一个公共js,然后在main.js中引用
// vueBus.js
import Bus from 'vue';
let install = function (Vue) {
Vue.prototype.$bus = new Bus()
}
export default { install };
2.直接在页面使用
A页面发送,B页面接收
A页面:
//step 与B页面要用的“参数”一致。
this.$bus.$emit("step", {
step: "monthCheck", //路由名称
data: {
//发送的数据
equipmentData: this.equipmentData,
ClickIdsList: ClickIdsListlength,
equipmentTable: datasDetail,
},
});
B页面 接收,并销毁
data() {
return {
activeName: "first", //页面默认打开第一页
step: "1",
equipTableData: {},
};
},
mounted() {
//在此组件想接收数据,定义this.$bus.$on和this.$bus.$off
//接收路由传过来的数据
this.$bus.$on("step", (data) => {
this.step = data.step;
if (data.data) {
this.equipTableData = data.data;
}
});
},
destroyed() {
//解绑当前组件所用的事件
this.$bus.$off("step");
},
简述
//发送
this.$bus.$emit('updateShowSide', false)
//接收
this.$bus.$on('updateShowSide', (data )=> {
this.showSide = data
})
//销毁
this.$bus.$off("updateShowSide");
下面的可以不用看,下面是记录自己写的页面。
完整代码:
B页面
<template>
<div
class="dyc30_Index"
animated
>
<!-- @tab-click="handleClick" -->
<el-tabs
v-model="activeName"
class="tabsStyle"
:before-leave="beforeHandle"
>
<el-tab-pane
label="yyds-30型_电源车周维护"
style="height: 100%; width: 100%"
name="first"
>
<indexSs title="周维护">
<!-- 具名插槽的写法一 -->
<template slot="one">
<dyc30_WeekyMainten
v-if="step == '1'"
class="cs02"
:data="equipTableData"
/>
<dyc30_weeklyCheck
v-if="step == 'weeklyCheck'"
:data="equipTableData"
/>
<dyc30_weeklyGZ
v-if="step == 'weeklyGZ'"
:data="equipTableData"
/>
</template>
</indexSs>
</el-tab-pane>
<el-tab-pane
label="yyds-30型_电源车月维护"
style="height: 100%; width: 100%"
name="second"
>
<indexSs title="月维护">
<template slot="one">
<dyc30Month
v-if="step == '1'"
class="cs02"
:data="equipTableData"
/>
<dyc30monthCheck
v-if="step == 'monthCheck'"
:data="equipTableData"
/>
<dyc30monthGZ
v-if="step == 'monthGZ'"
:data="equipTableData"
/>
</template>
</indexSs>
</el-tab-pane>
<el-tab-pane
label="yyds-30型_电源车季维护"
style="height: 100%; width: 100%"
name="third"
>
<indexSs title="季维护">
<template slot="one">
<dyc30Quarter
v-if="step == '1'"
class="cs02"
:data="equipTableData"
/>
<dyc30quarterCheck
v-if="step == 'quarterCheck'"
:data="equipTableData"
/>
<dyc30quarterGZ
v-if="step == 'quarterGZ'"
:data="equipTableData"
/>
</template>
</indexSs>
</el-tab-pane>
<el-tab-pane
label="YYSD-3型_年维护"
style="height: 100%; width: 100%"
name="fourth"
>
<indexSs title="年维护">
<template slot="one">
<dyc30Year
v-if="step == '1'"
class="cs02"
:data="equipTableData"
/>
<dyc30yearCheck
v-if="step == 'yearCheck'"
:data="equipTableData"
/>
<dyc30yearGZ
v-if="step == 'yearGZ'"
:data="equipTableData"
/>
</template>
</indexSs>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
//周;
import dyc30_WeekyMainten from "./dyc30_WeekyMainten.vue";
import dyc30_weeklyCheck from "../../DetailTable/weeklys/dyc30_weeklyCheck.vue";
import dyc30_weeklyGZ from "../../DetailTable/weeklys/dyc30_weeklyGZ.vue";
//月
import dyc30Month from "./dyc30Month.vue";
import dyc30monthCheck from "../../DetailTable/months/dyc30monthCheck.vue";
import dyc30monthGZ from "../../DetailTable/months/dyc30monthGZ.vue";
//季度
import dyc30Quarter from "./dyc30Quarter.vue";
import dyc30quarterCheck from "../../DetailTable/quarter/dyc30quarterCheck.vue";
import dyc30quarterGZ from "../../DetailTable/quarter/dyc30quarterGZ.vue";
//年度
import dyc30Year from "./dyc30Year.vue";
import dyc30yearCheck from "../../DetailTable/year/dyc30yearCheck.vue";
import dyc30yearGZ from "../../DetailTable/year/dyc30yearGZ.vue";
import indexSs from "../indexSs.vue";
import { Notify } from "vant";
export default {
// inject: ["reload"],
data() {
return {
activeName: "first",
step: "1",
equipTableData: {},
};
},
components: {
dyc30_WeekyMainten,
indexSs,
dyc30_weeklyCheck,
dyc30_weeklyGZ,
//月
dyc30Month,
dyc30monthCheck,
dyc30monthGZ,
//季度
dyc30Quarter,
dyc30quarterCheck,
dyc30quarterGZ,
//年度
dyc30Year,
dyc30yearCheck,
dyc30yearGZ,
},
beforeCreate() {
console.log("dyc30_选择型号后进来===", this.$route.params.data);
}, //生命周期 - 创建之前
created() {
this.equipTableData.modelID = this.$route.params.data;
},
watch: {},
mounted() {
//在此组件想接收数据,定义this.$bus.$on和this.$bus.$off
//接收路由传过来的数据
this.$bus.$on("step", (data) => {
this.step = data.step;
if (data.data) {
this.equipTableData = data.data;
}
});
},
destroyed() {
//解绑当前组件所用的事件
this.$bus.$off("step");
},
methods: {
/**在下一步的页面中,不能切换选项卡 */
beforeHandle() {
if (this.step != 1) {
Notify({ type: "danger", message: "请先完成当前维护登记" });
return false;
}
},
},
};
</script>
<style scoped>
.dyc30_Index {
/* background-color: #eaecf2; */
background: url("../../../assets/imgList/WeiHuBG.png") no-repeat;
background-position: center;
height: 100%;
width: 100%;
background-size: 100% 100%;
position: fixed;
}
.tabsStyle {
height: 100%;
}
::v-deep .el-tabs__nav {
float: none;
}
/**选中的变色 */
::v-deep .el-tabs__item.is-active {
color: #fff;
background: linear-gradient(#237df5, #018ff2, #06b7f7);
}
::v-deep .el-tabs__item {
padding: 0% 0%;
width: 17%;
box-sizing: border-box;
display: inline-block;
list-style: none;
position: relative;
border-radius: 39px;
margin: 1%;
background-color: #fff;
color: #31478f;
box-shadow: 1px 2px 3px 4px #f4f4f4;
}
::v-deep .el-tabs__header {
height: 8%;
}
::v-deep .el-tabs__content {
height: 90%;
}
.tabsStyle >>> .el-tabs__active-bar {
width: 0 !important;
}
/**添加切换动画 */
.cs02 {
animation: fadeInLeft 1.5s 0.02s ease backwards;
}
</style>
这里面用到了插槽,插槽页:
<template>
<div
class="indexSs"
style="height: 100%; width: 100%"
>
<slot name="one"></slot>
</div>
</template>
<script>
import preventBack from "vue-prevent-browser-back"; //阻止返回
export default {
name: "indexSs",
data() {
return {};
},
mixins: [preventBack], //注入 阻止返回上一页
components: {},
};
</script>
A页面:
<template>
<div class="dyc30Month">
<el-row style="height: 7%">
<p class="textStyle">月维查卡</p>
</el-row>
<el-row style="height: 90%">
<el-row
:gutter="15"
v-model="equipmentData"
style="display: flex; height: 9%"
>
<el-col :span="2"></el-col>
<el-col :span="10">
<div class="inputname">检查时间</div>
<el-date-picker
v-model="equipmentData.checkData"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期"
>
</el-date-picker>
</el-col>
<el-col :span="10">
<div class="inputname">装备编号</div>
<el-input
placeholder="点击选择"
readonly
v-model="equipmentData.code.name"
@focus="inputClick('装备编号')"
>
</el-input>
</el-col>
</el-row>
<el-row style="height: 75%; padding: 0 4%">
<span class="titleStyle">基本数据</span>
<maintenPublictable
ref="tableRef"
:getHeight="Getheight"
/>
</el-row>
<el-row style="padding-top:15px">
<el-button
class="maintenButtonStyle button9"
@click="carReturn"
>返回到菜单页</el-button><el-button
class="maintenButtonStyle button1"
@click="toNext"
>下一步</el-button>
</el-row>
<el-row>
<nowTime style="padding-top:0" />
</el-row>
</el-row>
<!-- 弹出下拉框 -->
<van-popup
v-model="show"
style="width: 50%; height: 50%"
>
<popup
:titles="titles"
:Types="Types"
@closeTan="closeTan"
:columns="popupColumns"
@popupValue="getpopupValue"
/>
</van-popup>
</div>
</template>
<script>
import maintenPublictable from "../../../components/maintenPublictable.vue";
import nowTime from "../../../components/nowTime.vue";
import popup from "../../../components/popup.vue";
import { Toast, Dialog } from "vant";
import { APIB } from "@/API/blazor.js";
import { Message, Notification } from "element-ui";
export default {
// inject: ["reload"], //刷新
data() {
return {
isOpen: true,
activeNames: ["1"], //折叠面板
// 应该是从后台获取的 (下拉选择数据) ———— 测试数据
equipment: [],
// 主表信息数据(form)
equipmentData: {
code: "", //装备编号
model: "", //型号
checkUser: "", //检查人
checksUser: "", //复查人
faultSymptom: "", //故障现象
faultReason: "", //故障原因
result: "", //处理结果
repairUser: "", //维修人
LUBEHeight: "", //发动机润滑油油位高度
coolantHeight: "", //发动机冷却液液面高度
motorOilHeight: "", //柴油机机油油位高度
flow: "", //液压油流量
YaLiFW: "", //液压油压力可调范围
//以下为新增字段
checkData: "", //检查时间
motorOilCoolHeight: "", //柴油机冷却液高度
alternatingVoltage: "", //空载状态下,交流输出电压
directVoltage: "", //空载状态下,直流输出电压
frequency: "", //频率
batteryVoltage: "", //蓄电池电压
modelID: "",
},
show: false, //默认不展开
//选择器组件title
titles: "",
//选择器类型
Types: "",
popupColumns: [], //用于给popup传值
//装备型号下拉数据,
equipmentModelList: [],
//下拉数据选项、包含装备编号数据
equipmentNumberList: [],
//数据解析后
columns: [],
tableData: [],
//
Getheight: "375", //设置表格高,给table组件传过去
};
},
components: {
nowTime,
popup,
maintenPublictable,
},
/**从第二页面获取的数据 */
props: {
data: {
type: Object,
default: {},
},
},
mounted() {
//初始化
this.init();
//获取通过路由传过来的参数 :this.$route.params);
console.log("dyc30_月维护接收第二个页面传过来的基本数据===", this.data);
//1. 选择型号后进来,获取型号ID
if (this.data.modelID != null || this.data.modelID != undefined) {
//接收选择的型号
this.equipmentData.modelID = this.data.modelID;
}
//2. 从【检查数据】页面跳转到此页面获取的数据
if (
this.data.equipmentData !== undefined &&
this.data.ClickIdsList !== undefined
) {
this.equipmentData = this.data.equipmentData;
this.$refs.tableRef.tableData = this.data.equipmentTable;
this.$refs.tableRef.ClickIdsList = this.data.ClickIdsList;
}
//表头
this.GetColDataList();
//下拉框数据
this.initBydicDataId();
},
methods: {
init() {
var _this = this;
//调接口,参数param,
//1. modelID:查询型号==modelID所有所有数据,
//2. types:因为周月季年的字段都一样,所有通过这个参数判断是哪个表
const param = {
modelID: this.equipmentData.modelID,
types: "月",
};
console.log("param===", param);
//获取form表单数据和表格数据
let res = {
code: 200,
data: {
code: "",
model: "",
checkUser: "",
checksUser: "",
faultSymptom: "",
faultReason: "",
result: "",
repairUser: "",
LUBEHeight: "",
coolantHeight: "",
motorOilHeight: "",
flow: "",
YaLiFW: "",
checkData: "",
motorOilCoolHeight: "",
alternatingVoltage: "",
directVoltage: "",
frequency: "",
batteryVoltage: "",
modelID: 2,
childTable: [
{
ID: 1,
ids: 1,
item: "汽车底盘",
itemDetail: "汽车底盘",
standard: "检查常、无异响",
check: false,
dsc: "",
},
],
},
};
//把值直接赋给tableRef.tableData
_this.$refs.tableRef.tableData = res.data.childTable;
//查询此型号(modelID)下所有的编号
_this.initBydicDataId(param);
},
//编号
async initBydicDataId(param) {
var _this = this;
let res = {
code: 200,
data: [
{
code: "BH230324021", //装备编号
model: "XH001", //型号
modelID: "2", //与型号关联的ID
},
{
code: "BH230324022", //装备编号
model: "XH001", //型号
modelID: "2", //与型号关联的ID
},
],
};
this.columns = res.data;
},
//表头
GetColDataList() {
//跟周维护一样
let res = [
{
label: "维护项目",
child: [
{
label: "维护项目 |",
prop: "item",
width: "100",
},
{
label: "维护项目 ||",
prop: "itemDetail",
width: "100",
},
],
},
{
label: "内容及标准",
prop: "standard",
width: "250",
},
{
label: "备注",
prop: "dsc",
width: "100",
},
];
//不能直接使用this.$refs.tableRef.SetDataTableHeader
this.$nextTick(() => {
this.$refs.tableRef.SetDataTableHeader(res);
});
},
carReturn() {
this.$confirm("返回菜单页,不保存此数据,确定返回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.$router.push("/choiceIndex");
})
.catch(() => {});
},
handleChange(val) {
console.log(val);
},
// 下一步
toNext() {
let datasDetail = this.$refs.tableRef.tableData; //明细表
let ClickIdsListlength = this.$refs.tableRef.ClickIdsList; //勾选的哪些,用于判断是否有勾选
// console.log("点击下一步,ClickIdsList=", this.$refs.tableRef.ClickIdsList);
// console.log("点击下一步,表格数据===", datasDetail);
if (
this.equipmentData.checkData == "" ||
this.equipmentData.code == "" ||
ClickIdsListlength.length == 0
) {
if (this.equipmentData.checkData == "") {
Toast.fail("请输入检查时间");
}
if (this.equipmentData.code == "") {
Toast.fail("请输入装备编号");
}
if (ClickIdsListlength.length == 0) {
Toast.fail("勾选完成情况");
}
} else {
// 调路由且传数据
this.$bus.$emit("step", {
step: "monthCheck", //路由名称
data: {
//数据
equipmentData: this.equipmentData,
ClickIdsList: ClickIdsListlength,
equipmentTable: datasDetail,
},
});
}
},
// 点击输入框弹出 ====> 字典查询
inputClick(val) {
this.titles = "请选择" + val;
this.Types = val; //当页面同时会使用此处时,通过Types 区分最终回传的值应回显在哪里
if (val == "装备编号") {
let res = [];
this.columns.forEach((item) => {
res.push({
prectName: item.code,
ID: item.modelID,
value: item.modelID,
text: item.code,
});
});
this.popupColumns = res;
}
this.show = true;
},
//从子组件接收(popup 在选择器点击确定后,吧数据给到父组件)
getpopupValue(val, types) {
console.log("维护卡==接收的值===", val);
if (types !== "") {
if (types == "装备型号") {
let objs = {
id: val[0].value,
name: val[0].text,
};
//发生变化了则清除编号,避免错误数据
if (this.equipmentData.model.id !== objs.id) {
//清除编号
this.equipmentData.code = "";
}
//型号名称 + 装备型号Id (字典表中的id)
this.equipmentData.model = objs;
} else if (types == "装备编号") {
let objs = {
id: val[0].value,
name: val[0].text,
};
// 装备编号 + 装备id (装备表中的id)
this.equipmentData.code = objs;
}
}
this.show = false;
},
//点击取消,关闭弹框
closeTan(val) {
this.show = val;
},
},
};
</script>
<style scoped>
::v-deep .el-date-editor.el-input {
width: 325px;
}
</style>
成果: