翼度科技»论坛 编程开发 JavaScript 查看内容

react echarts tooltip 区域新加输入框编辑保存数据功能

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
  1. // demo页面// 需求:产品要求在折线图的tooltip上新加一个输入框,可以编辑这个输入框保存备注信息,需要两种交互方式: 1.鼠标滑过展示备注信息。2.鼠标点击某一个日期时,鼠标可以滑到tooltip上做保存/编辑操作。// 思路:1.保留初始鼠标滑过echarts图效果。// 2.主要难点是点击时tooltip固定可编辑,有尝试通过动态改变echarts自带tooltip的显示隐藏,但是效果并不好,并且因为react是虚拟dom, 所以在react中没办法使用on监听事件,使用ReactEcharts也只是必须要点击某一个symbol圆点才可以出发点击事件,最后放弃使用自有api的想法// 3.最终方案:用一个div包裹echarts, 然后在echarts的同级新建一个div用来用来模拟真实tooltip,通过鼠标移入移出事件控制真实tooltip的显示与隐藏。// 思路大概就是这样,下面就是代码部分的实现。因为此页面只是用来当做demo,所以只提供伪代码
复制代码
  1. import * as echarts from "echarts";
  2. const [echartsParams, setEchartsParams] = useState([]); // tooltip formatter的params数据
  3. const [echartsData, setEchartsData] = useState({}); // 编辑或保存时输入框的数据
  4. const [chart, setChart] = useState(); // 记录当前echarts, 鼠标移入移出时控制tooltip显示隐藏
  5. const [chartAllData, setChartAllData] = useState(); // echaers数据源
  6. const save = (date, id) => {
  7.   const value = echartsData.annotation;
  8.     const url = id === null
  9.     ? axios('/save', {
  10.       method: 'post',
  11.       data: {
  12.         date,
  13.         annotation: value
  14.       }
  15.     })
  16.     : axios('/update', {
  17.       method: 'post',
  18.       data: {
  19.         date,
  20.         annotation: value,
  21.         id,
  22.       }
  23.     })
  24. }
  25. window.save = save; // 必须挂载在window上
  26. // echarts。 data: 数据源
  27. const initCharts = (data) => {
  28.   setChartAllData(data)
  29.    let option = {
  30.    tooltip: {
  31.         className: 'chartsTooltip',
  32.         trigger: "axis",
  33.         enterable: true,
  34.         appendToBody: true,
  35.         axisPointer: {
  36.           type: "line",
  37.           label: {
  38.             backgroundColor: "#6a7985",
  39.           },
  40.         },
  41.         formatter: (params) => {
  42.           setEchartsParams(params);
  43.           let str = '';
  44.           const annotation = data.filter((v) => v.time === params[0].name)[0].annotation || { annotation: '', id: null };
  45.           params.forEach((item) => {
  46.             str += '<div class="box">' + `<div>${item.marker + item.seriesName}</div>` + `<div>${item.value}</div>` + '</div>';
  47.           })
  48.           return `<div class="test" id="tooltipDom">
  49.             ${params[0].name}
  50.             <br />
  51.             ${str}
  52.             <textarea class="ipt" id="inputId">${annotation.annotation}</textarea>
  53.             <p onclick='save("${params[0].name}", "${annotation.id}")' class="save-btn">保存</p>
  54.           </div>`
  55.         },
  56.       },
  57.   }
  58.     let Chart = echarts.getInstanceByDom(
  59.       document.getElementById("enterprise-ratio")
  60.     ); //有的话就获取已有echarts实例的DOM节点。
  61.     if (Chart) {
  62.       // 如果不存在,就进行初始化。
  63.       Chart.clear();
  64.     } else {
  65.       Chart = echarts.init(document.getElementById("enterprise-ratio"));
  66.     }
  67.     Chart.setOption(option);
  68.     setChart(Chart);
  69. }
  70. return(
  71.   <div // 最外层的盒子
  72.     onMouseLeave={() => {
  73.         chart.dispatchAction({
  74.           type: 'showTip',
  75.         })
  76.         chart.setOption({
  77.          tooltip: {
  78.            show: true,
  79.          },
  80.         })
  81.         const chartsTooltip = document.getElementsByClassName('chartsTooltip')[0];
  82.         if (chartsTooltip) {
  83.           chartsTooltip.style.display = 'none';
  84.         }
  85.         const tooltipId = document.getElementById('tooltipId')
  86.         if (tooltipId) {
  87.           tooltipId.style.display = 'none';
  88.         }
  89.   >
  90.     <div>这是这个区域的标题</div>
  91.    <div
  92.     className="echarts-content"
  93.        onClick={() => {
  94.          chart.dispatchAction({
  95.            type: 'hideTip',
  96.          })
  97.          chart.setOption({
  98.            tooltip: {
  99.              show: false,
  100.            },
  101.          })
  102.      const annotationData = chartAllData.filter((v) => v.time === echartsParams[0].name)[0].annotation || { annotation: '', id: null }; // annotation: '后端接口返回的数据', id: '编辑时需要的id, 根据id是否未null判断是要保存还是编辑'
  103.          setEchartsData(annotationData)
  104.          const tooltipId = document.getElementById('tooltipId')
  105.            if (tooltipId) {
  106.              tooltipId.style.display = 'block';
  107.            }
  108.        }}
  109.    >
  110.        {
  111.               echartsParams.length ? (
  112.                 <div className="tooltip-box" id="tooltipId">
  113.                   {echartsParams[0].name}
  114.                   {
  115.                     echartsParams.map((item, i) => {
  116.                       return (
  117.                         <div className="box" key={i}>
  118.                           <>
  119.                             <div>
  120.                               <span dangerouslySetInnerHTML={{ __html: item.marker }}></span>
  121.                               <span>{item.seriesName}</span>
  122.                             </div>
  123.                             <div>{item.value}</div>
  124.                           </>
  125.                         </div>
  126.                       )
  127.                     })
  128.                   }
  129.                   <Input.TextArea
  130.                     value={echartsData.annotation}
  131.                     className="ipt"
  132.                     onChange={(e) => {
  133.                       const v = e.target.value;
  134.                       echartsData.annotation = v;
  135.                       setEchartsData({ ...echartsData })
  136.                     }}
  137.                   ></Input.TextArea>
  138.                   <p onClick={() => save(echartsParams[0].name, echartsData.id)} className="save-btn">保存</p>
  139.                 </div>
  140.               ) : ''
  141.             }
  142.     <div className="flex-1" id="enterprise-ratio" style={{ height: '200px', width: '100%' }}></div> // echarts折线图
  143.    </div>
  144.   </div>
复制代码
到此这篇关于react echarts tooltip 区域新加一个输入框,可以编辑保存数据的文章就介绍到这了,更多相关react echarts tooltip内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/article/284046.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具