目的————即界面内有表格和多个图表,反应多条数据

点击表格某一行或者地图某一块,其他几个图表显示单块数据

二次点击后,取消显示单块数据,回复多条数据状态

 

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) {.........}

即,将原本获取数据、构建地图的挂载,修改为一个获取数据的挂载,将地图的构建放到获取数据函数里面。

 

目前想的不太明白,同学的方法是通过二次点击同一块实现切换组件,单次点击实现数据的传输更改(对点击内容进行判断,点击前后内容一致则切换组件,不一致则数据更改)

我的不太一样,我的是设置数据的传输,已经设定了数据是数组形式,若要多条数组应该是要对象类型~还不太明白喔~

还有待完善……