返回

数据大屏组件开发:容器、变换分类、面板条目滚动

前端

容器组件

容器组件负责管理数据大屏的布局和大小。为了适应不同屏幕尺寸,容器组件需要监听resize事件并调整宽高比。可以使用以下代码实现:

import Vue from 'vue'

export default Vue.component('Container', {
  data() {
    return {
      width: window.innerWidth,
      height: window.innerHeight
    }
  },
  mounted() {
    window.addEventListener('resize', this.onResize)
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.onResize)
  },
  methods: {
    onResize() {
      this.width = window.innerWidth
      this.height = window.innerHeight
    }
  },
  render() {
    return (
      <div style={{ width: this.width, height: this.height }}>
        {this.$slots.default}
      </div>
    )
  }
})

变换分类组件

变换分类组件用于展示不同分类的数据。可以使用Element UI Tabs组件实现:

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

Vue.use(ElementUI)

export default Vue.component('TransformCategory', {
  props: ['categories'],
  data() {
    return {
      activeIndex: 0
    }
  },
  methods: {
    handleTabChange(index) {
      this.activeIndex = index
    }
  },
  render() {
    return (
      <el-tabs value={this.activeIndex} on-tab-click={this.handleTabChange}>
        {this.categories.map((category, index) => {
          return <el-tab-pane label={category.name} key={index}>{category.content}</el-tab-pane>
        })}
      </el-tabs>
    )
  }
})

面板条目滚动组件

面板条目滚动组件用于展示大量数据条目。可以使用Vuex和webpack实现:

// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    items: []
  },
  mutations: {
    setItems(state, items) {
      state.items = items
    }
  }
})

// main.js
import Vue from 'vue'
import App from './App.vue'
import store from './store'

new Vue({
  store,
  render: h => h(App)
}).$mount('#app')
// App.vue
<template>
  <div>
    <ul>
      <li v-for="item in items">{{item}}</li>
    </ul>
  </div>
</template>

<script>
import {mapState} from 'vuex'

export default {
  computed: {
    ...mapState([
      'items'
    ])
  },
  mounted() {
    // 模拟数据加载
    setTimeout(() => {
      this.$store.commit('setItems', [1, 2, 3, 4, 5])
    }, 1000)
  }
}
</script>

通过上述方式,可以实现数据大屏中常见的容器组件、变换分类组件和面板条目滚动组件。