前端基础文章打卡Day8 : 图表生成网页 | 青训营

85 阅读2分钟

我们一般都会使用echarts来生成统计图表,但是在代码中修修改改非常麻烦,需要找到具体配置的选项然后进行修改,试着自己做一个网站可以直接输入想要的数据来生成图表,不需要在代码区进行定位。

row版

因为这是一个初步的想法,先写逻辑后进行页面美观优化

基本准备

首先把基本的输入框给安排上

<div class="numChoice">
            <div>标题:<input type="text" class="title" placeholder="请输入图表标题"></div>
            <div>数据名称:<input type="text" class="Bigname" placeholder="请输入数据的名称"></div>
            <div>数量:<input class="num" type="number" min="0" placeholder="请输入数据个数"></div>
            <div>类型:<br><select class="type" name="" id="">
                <option value=""></option>
                <option value="bar">柱状图</option>
                <option value="pie">饼状图</option>
                <option value="line">折线图</option>
            </select></div>
</div>

由于采用flex布局,所以子元素都使用了div包裹,便于定位

image.png

逻辑实现

首先准备好我们的option配置项,将一些基础的图例和一些有用的配置默认加上,在标题和数据名称具体数据的地方用变量来填充。
首先是图表标题,将标题的输入框里面的值获取过来,并且对样式进行一定的修改:

            title:{
                text:document.querySelector('.title').value,
                left: "center",
                top:'0px',
                textStyle:{
                    fontSize: 20,
                    color:'#000'
                }
            }

数据名称同理:

            series:[{
                label:{
                    show:true
                },
                name:document.querySelector('.Bigname').value ,
                type: mapType,
                data
            }]

接下来是数据的个数,我们需要根据数据个数生成相应个数的输入框,所以我们需要做一些逻辑上的判断,首先先定义一个函数用来生成填写数据的输入框

function createInput(node,num){
    if(num > 0)
    for(let i = 0 ; i < num ; i++){
        const input = document.createElement('input')
        const inputName = document.createElement('input')
        const br = document.createElement('br')
        input.className = 'Data'
        input.type = 'number'
        input.placeholder = '数据'
        inputName.className = 'dataName'
        inputName.type = 'text'
        inputName.placeholder = '名称'
        node.append(inputName)
        node.append(input)
        node.append(br)
    }
}

其中第一个参数node是我们需要生成输入框的dom元素节点,第二个参数num是需要生成的个数

接下来我们对输入数据个数的输入框进行逻辑编写

numDom.addEventListener('change',() => {
    num = numDom.value


    numData.remove()
    numData = document.createElement('div')
    numData.className = 'numData'
    document.querySelector('.numPlace').append(numData)
    createInput(numData,num)

})

其中我们生成一个div盒子用来存放输入数据的输入框,并且在个数改变的时候重新渲染

image.png

下面我们进行最重要的数据处理,我们先声明存放X轴名称的变量和数据变量。

let Xname = []
let data = []

然后我们对填写数据的输入框进行监听,将其中的数据添加到先前声明的变量中

    const input = document.querySelectorAll('.Data')
    const inputName = document.querySelectorAll('.dataName')
    for(let i = 0 ; i < input.length ; i++){
        input[i].addEventListener('change',() => {
            Arry.splice(i,1,input[i].value)
        })
    }
    data = Arry
    for(let i = 0 ; i < input.length ; i++){
        inputName[i].addEventListener('change',() => {
            Xname.splice(i,1,inputName[i].value)
            console.log(Xname);
        })
    }

在配置项的相应位置上放入变量,一个简单的图表生成就做好了。

再准备一个button,点击后将配置项添加给echarts生成图表

并且使用FileSaver插件将canvas标签里面的图表保存

downLoad.addEventListener('click', () => {
    const canvas = document.querySelector('canvas')
    canvas.toBlob(function(blob) {
        saveAs(blob, document.querySelector('.title').value)
      });
})

image.png