关于element-ui多表联动的一些想法和实现
目的————即界面内有表格和多个图表,反应多条数据
点击表格某一行或者地图某一块,其他几个图表显示单块数据
二次点击后,取消显示单块数据,回复多条数据状态
1.根据同学的描述,他的思路是通过axios将数据传入vuex,然后通过切换组件来实现多表联动
2.网上查阅到的一些还未深究实践的方法
2.1通过react实现
2.2通过bus总线实现
2.3通过兄弟组件传值,即兄传父,父传弟
3.已经实现的内容
通过添加一个row-click,获取到点击行的数据。
<template> <div class="tab"> <el-table :row-class-name="tableRowClassName" :data="tableData" @row-click="change" :default-sort="{ prop: 'date', order: 'descending' }" > <el-table-column prop="name" label="角色名字" sortable width="100"> </el-table-column> <el-table-column prop="A" label="10-14周岁" sortable width="110"> </el-table-column> <el-table-column prop="B" label="14-18周岁" sortable width="110"> </el-table-column> <el-table-column prop="C" label="18-25周岁" sortable width="110"> </el-table-column> <el-table-column prop="D" label="25-35周岁" sortable width="110"> </el-table-column> <el-table-column prop="E" label="35+周岁" sortable width="110"> </el-table-column> </el-table> </div> </template> <script> export default { data() { return { tableData: [], }; }, mounted() { this.getdata(); }, methods: { getdata() { this.$axios.get("./json/shuju.json").then((tableData) => { this.tableData = tableData.data.mapdata; // console.log(tableData.data.mapdata); // console.log(1) }); }, formatter(row, column) { return row.specialty; }, tableRowClassName({ row, rowIndex }) { if (rowIndex === 1) { return "warning-row"; } else if (rowIndex === 3) { return "success-row"; } return ""; }, change(val) { let thisRowData = this; thisRowData = val; console.log(thisRowData); this.$emit("table", thisRowData); }, }, computed: { }, }; </script> <style lang="scss"> .el-table .warning-row { background: oldlace; } .el-table .success-row { background: #f0f9eb; } </style>
目前想法是:获取到数据后,将数据传入vuex中,成为全局数据,进行调用。点击不同数据后,将值进行重新赋值。
接上述,获取到数据后,尝试将这组数据通过兄弟组件传值,奈何本人技术不够,后来想了想兄弟传值似乎也有些繁琐,不如直接传到vuex全局,其他图表调用全局数据,点击后数据更新,随之重新构建图表。
实现过程:
1.给表格添加一个change函数,把获取到的一组数据传到vuex全局state内。
”changedata“是和vuex中接受的state对应,第二个参数是要从表格传到全局的数据。
change(val) { let thisRowData = this; thisRowData = val; // console.log(thisRowData); // this.$emit("table", thisRowData); this.$store.commit("changedata",thisRowData); },
store内index.js文件,即vuex如下:
import Vue from "vue"; import Vuex from "vuex"; Vue.use(Vuex); export default new Vuex.Store({ state: { clickeddata: {name: "周棋洛",value:10 , A: "130" ,B: 130,C:543,D: 130,E:10 }, }, getters: {}, mutations: { changedata(state,x){ state.clickeddata=x // console.log(state.clickeddata) } }, actions: {}, modules: {}, });
其中,changedata对应接受组件传到全局的数据,将state内clickdata初始值赋值为传进来的数值。
2.玫瑰图从全局接受数据
<template> <div class="meiguitu"> <!-- @click="change"> --> <div id="meigui" ref="meigui" style="width: 300px; height: 250px"></div> </div> </template> <script> export default { name: "JMEIGUITU", data() { return {}; }, mounted() { this.dataEcharts(); }, computed: { rosedata() { return this.$store.state.clickeddata; }, }, watch: { rosedata() { this.dataEcharts(); }, }, methods: { dataEcharts: function () { // console.log(this.rosedata); var myChart = this.$echarts.init(this.$refs.meigui); myChart.setOption({ series: [ { type: "pie", data: [ { value: this.rosedata.A, name: "10-14", }, { value: this.rosedata.B, name: "14-18", }, { value: this.rosedata.C, name: "18-25", }, { value: this.rosedata.D, name: "25-35", }, { value: this.rosedata.E, name: "35+", }, ], radius: ["20%", "60%"], roseType: "area", }, ], }); }, }, }; </script> <style lang="scss" scoped> .meiguitu { width: 100%; float: left; } </style>
最主要处是获取数据和监听刷新
即computed和watch
其他类似,都是一个道理。
其实想通了就觉得很简单,但是一开始就是怎么也想不明白,有了想法也是实现起来老报错。
遇到的问题有很多,最头痛的是图表获取到全局数据后无法更新到页面,因为已经构建好了图表。这里尝试过使用设定key值;监听值是否一致,不一致则重新构建图表等方式,最后我也忘记了咋解决的,哈哈,也是监听watch,然后重新构建图表。
这里还遇到一个问题,就是EchartsMap获取本地json时先构建地图后获取数据的问题,我这里想到之前同学帮我解决我上一版本的玫瑰图问题的解决方法,不得不感叹真的是有人就是很聪明。
data() { return { Data: [], }; }, mounted() { this.getdata(); }, components: {}, methods: { getdata() { this.$axios.get("./json/Data.json").then((tableData) => { this.Data = tableData.data.Data; /* console.log(this.Data);*/ this.initMap(this.Data); }); }, initMap: function (data) {.........}
即,将原本获取数据、构建地图的挂载,修改为一个获取数据的挂载,将地图的构建放到获取数据函数里面。
目前想的不太明白,同学的方法是通过二次点击同一块实现切换组件,单次点击实现数据的传输更改(对点击内容进行判断,点击前后内容一致则切换组件,不一致则数据更改)
我的不太一样,我的是设置数据的传输,已经设定了数据是数组形式,若要多条数组应该是要对象类型~还不太明白喔~
还有待完善……
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器