关于element-ui多表联动的一些想法和实现
目的————即界面内有表格和多个图表,反应多条数据
点击表格某一行或者地图某一块,其他几个图表显示单块数据
二次点击后,取消显示单块数据,回复多条数据状态
1.根据同学的描述,他的思路是通过axios将数据传入vuex,然后通过切换组件来实现多表联动
2.网上查阅到的一些还未深究实践的方法
2.1通过react实现
2.2通过bus总线实现
2.3通过兄弟组件传值,即兄传父,父传弟
3.已经实现的内容
通过添加一个row-click,获取到点击行的数据。
class="tab">table :row-class-name="tableRowClassName" :data="tableData" @row-click="change" :default-sort="{ prop: 'date', order: 'descending' }" > "name" label="角色名字" sortable width="100"> "A" label="10-14周岁" sortable width="110"> "B" label="14-18周岁" sortable width="110"> "C" label="18-25周岁" sortable width="110"> "D" label="25-35周岁" sortable width="110"> "E" label="35+周岁" sortable width="110">
目前想法是:获取到数据后,将数据传入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.玫瑰图从全局接受数据
class="meiguitu">"meigui" ref="meigui" style="width: 300px; height: 250px">
最主要处是获取数据和监听刷新
即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) {.........}
即,将原本获取数据、构建地图的挂载,修改为一个获取数据的挂载,将地图的构建放到获取数据函数里面。
目前想的不太明白,同学的方法是通过二次点击同一块实现切换组件,单次点击实现数据的传输更改(对点击内容进行判断,点击前后内容一致则切换组件,不一致则数据更改)
我的不太一样,我的是设置数据的传输,已经设定了数据是数组形式,若要多条数组应该是要对象类型~还不太明白喔~
还有待完善……