在小程序(Taro)中使用antv/f2

这篇具有很好参考价值的文章主要介绍了在小程序(Taro)中使用antv/f2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、项目背景

二、使用方式

三、自定义图表的样式

公司的小程序项目需求中需要使用图表展示一些数据趋势,于是就去调研了一些图表的组件库,最后结合各组件库的图表样式、性能以及后期维护和扩展等方面决定使用antv/f2这个图表库,记录一下使用方式、样式等属性的修改方法以及遇到的一些坑点。

一、项目背景

项目技术框架是使用的Taro脚手架搭建的(React+ts),antv/f2是适用于移动端的图表组件库,适用于vue、react以及小程序(快速上手 | F2),官方文档上也介绍了如何在vue、react以及小程序中使用。but官网上介绍的小程序的使用方法是在小程序原生框架上的,墙裂建议文档上可以介绍一下在taro项目下的使用方式,因为最后在taro项目下成功把第一个图表demo跑下来发现,还是跟文档上介绍的小程序的使用方式挺不一样的

二、使用方式

1)npm install @antv/f2  --save 

这里需要注意的是我用的antv/f2的版本是4.0.29版本的,不同版本的组件的调用方式是不一样的

我踩的第一个坑就是我在项目中安装的版本是4.x.x的,但是我的调用方式是import F2 from  '@antv/f2' ,于是就一直报错,后面看文档才知道需要import {} from  '@antv/f2'这样使用,所以大家开发的时候一定要仔细看文档哦

在小程序(Taro)中使用antv/f2

 2)封装Canvas组件,后期在调用antv/f2画图表组件时都需要基于这个组件,直接附上踩完坑的代码,并且代码注释上会标明一些我踩的坑点(tips1,tips2,tips3...),给各位第一次使用的小伙伴们节省一点时间学(摸)习(鱼)呀

import { ReactNode, FC, useEffect, useRef, memo,CSSProperties } from 'react';
import { useReady, createSelectorQuery, getSystemInfoSync } from '@tarojs/taro';
import { ITouchEvent, CanvasTouchEvent, Canvas } from '@tarojs/components';
import { Canvas as FFCanvas } from '@antv/f2';

import useUnmount from './use-unmount';

interface F2CanvasProps {
  id?: string;//tips1:在同一个组件渲染多个图表时,每个图表的id需要唯一
  style?:CSSProperties | string;
  children?: ReactNode;
}

type CanvasEvent = ITouchEvent | CanvasTouchEvent;

interface CanvasElement {
  dispatchEvent: (type: string, event: CanvasEvent) => void;
}

function wrapEvent(e: CanvasEvent) {
  if (e && !e.preventDefault) {
    e.preventDefault = function () {};
  }
  return e;
}

const F2Canvas: FC<F2CanvasProps> = (props) => {
  const { children, id = 'f2Canvas',style = 'width:100%;height:100%;display:block;padding: 0;margin: 0;', } = props;
  const canvasRef = useRef<FFCanvas>();
  const canvasElRef = useRef<CanvasElement>();
  const childrenRef = useRef<ReactNode>(children);

  useEffect(() => {
    childrenRef.current = children;
    canvasRef.current?.update({ children });
  }, [children]);

  useUnmount(() => {
    canvasRef.current?.destroy();
  });

  useEffect(() => {
    //tips3:一开始使用的是taro的useReady,后面发现在页面控制图表组件条件显示时会出现图表组件如果隐藏了再显示的时候会出现空白的情况,就是没有绘制成功,后面查找问题才发现是使用useReady导致的问题,于是改成了useEffect
    const renderCanvas = () => {
      const query = createSelectorQuery();
      query
        .select(`#${id}`)
        .fields({
          node: true,
          size: true,
        })
        .exec((res) => {
          const { node, width, height } = res[0];
          const pixelRatio = getSystemInfoSync().pixelRatio;
          // 高清设置
          node.width = width * pixelRatio;
          node.height = height * pixelRatio;
          const context = node.getContext('2d');
          const canvas = new FFCanvas({
            pixelRatio,
            width,
            height,
            context,
            children: childrenRef.current,
          });
          canvas.render();
          canvasRef.current = canvas;
          canvasElRef.current = canvas.canvas.get('el');
          // console.log('canvasElRef', canvasRef);
        });
    };

    setTimeout(renderCanvas);//tips2:延迟是为了确保能获取到 node 对象,直接获取会出现 node 为 null 的情况

  }, []);

  const handleClick = (e: ITouchEvent) => {
    const canvasEl = canvasElRef.current;
    if (!canvasEl) {
      return;
    }

    const event = wrapEvent(e);
    // 包装成 touch 对象
    event.touches = [e.detail];
    canvasEl.dispatchEvent('click', event);
  };

  const handleTouchStart = (e: CanvasTouchEvent) => {
    const canvasEl = canvasElRef.current;
    if (!canvasEl) {
      return;
    }
    canvasEl.dispatchEvent('touchstart', wrapEvent(e));
  };

  const handleTouchMove = (e: CanvasTouchEvent) => {
    const canvasEl = canvasElRef.current;
    if (!canvasEl) {
      return;
    }
    canvasEl.dispatchEvent('touchmove', wrapEvent(e));
  };

  const handleTouchEnd = (e: CanvasTouchEvent) => {
    const canvasEl = canvasElRef.current;
    if (!canvasEl) {
      return;
    }
    canvasEl.dispatchEvent('touchend', wrapEvent(e));
  };

  return (
    <Canvas
      id={id}
      type='2d'
      style={style}
      onClick={handleClick}
      onTouchStart={handleTouchStart}
      onTouchMove={handleTouchMove}
      onTouchEnd={handleTouchEnd}
    />
  );
};
export default memo(F2Canvas);

use-unmount.ts

import { useEffect, useRef } from 'react';

function useUnmount(effectCallback: () => void) {
  const ref = useRef(effectCallback);
  ref.current = effectCallback;

  useEffect(() => () => ref.current(), []);
}

export default useUnmount;

3)封装完canvas组件,那我们就来写一个demo吧

import F2Canvas from '@/components/common/F2Canvas';
import { Axis, Chart, Line, Tooltip, PointGuide, Area } from '@antv/f2';

const data = [{date:'2021-07-18',score:'26'},{date:'2022-07-18',score:'27'}]
const pointRecords = [{date:'2021-07-18',score:'26'}]//该点的样式为下面设置的style
<F2Canvas id='demo'>
  <Chart data={data}>
    <Axis field='date'></Axis> //x轴
    <Axis field='score'></Axis> //y轴
    <Line x='date' y='score' shape='smooth' /*曲线是否平滑*/></Line>//折线图
    <PointGuide records={pointRecords} 
    style={{fill: '#fff',lineWidth: 2,stroke: '#F1825E'}}></PointGuide>//标记点
    <Tooltip></Tooltip>//手指移到对应的点时的提示框
  </Chart>
</F2Canvas>

三、自定义图表的样式

由于我在项目中只用了折线图,所以在这里就只记录折线图的样式修改,后续如果有其他图表的使用再补上。

1)修改折现的颜色:如果我们要定义的折线的样式不是渐变的,那就直接设置color="#F17F5B"就可以了,但是如果颜色是渐变的,则这样设置color="l(180) 0:#f0805d8e 0.5:#F17F5B 1:#f17f5c26"

需要注意的是当图表只有一个点时,color如果设置为渐变控制台会有报错信息,因此我们可以设置color={data.length === 1? '#F17F5B': 'l(180) 0:#f0805d8e 0.5:#F17F5B 1:#f17f5c26'}

在小程序(Taro)中使用antv/f2

 2)当我们需要在某个特殊的点进行一些标记时则可以使用

在小程序(Taro)中使用antv/f2

在小程序(Taro)中使用antv/f2 

3)当我们x轴或y轴的数据是2022-07-18 但是我们希望在图表上展示时是07/18时,可设置<Axis formatter={(data: string)=>{return dayjs(data).format('MM/DD');}} /> 

4)当数据比较多时,可以设置x轴或者y轴的tickCount去设置要显示几个点或者设置nice={true}自适应显示点的个数,这样不会导致数据多时挤在一起

更多的图表设置可查看文档,或者点击进对应的组件的index.d.ts文件去查看文章来源地址https://www.toymoban.com/news/detail-486655.html

到了这里,关于在小程序(Taro)中使用antv/f2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在小程序中使用百度地图

    进入百度开放平台官网,点击右上角“API控制台”,注册成为百度地图开发者。 进入控制台,创建一个新应用。填写相应信息时,应用类型选择【微信小程序】,APPID填写小程序开发者ID。 点击提交后,即可在查看应用页面看到申请成功的密钥(AK)。 在项目根目录下新建一

    2023年04月09日
    浏览(39)
  • 在小程序中如何使用svg图标

    1.首先找到一个能够下载svg图标的网站,例如iconfont或iconpark。  2.选择好点击批量下载,下载一个压缩包。将下载后的压缩包解压之后就是我们选择下载的svg文件。如下图  3. 打开将svg文件转成base64的网站 ,因为在小程序中不能直接使用svg文件,得将其转成base64格式得数据作

    2024年02月12日
    浏览(62)
  • 如何在小程序中引入使用vant框架

    vantUI框架常用于移动端页面组件的基础库构建,为了让用户获得更趋向于原生的体验,它是一种相当不错的方案选择。 关于这个框架,它不仅有适用于移动端vue脚手架的版本,同时还存在可以兼容小程序开发的webapp版本。在微信小程序的原生组件较少的背景下,通常我们在开

    2024年02月12日
    浏览(40)
  • 使用antv/G6在vue项目中开发较复杂样式流程图

    设计师提供了一版样式较复杂的流程图,我搜了一些常用的vue-super-flow和vue-x6-flow等都只支持简单的样式。之前自己写过纯展示流程图不涉及太多交互,感觉还是找一个成熟的插件开发更适合,也方便其他同事参考,所以最后选择了用antv/G6自己个性化开发,总结了使用antv/G6在

    2023年04月09日
    浏览(139)
  • 微信小程序WebSocket接口以及在小程序中的使用。

    示例: 这里要注意url中的接口不是http://.xxx或者https://.xxx开头的,而是以ws://xxx.com或者wss://.xxx开头的,要不然就会连接失败 他们是监听监听wx.connectSocket的连接成功与否的 代码如下(示例): 这里是接收服务器的消息的(也就是聊天时对面发来的消息) 代码如下(示例):

    2024年02月09日
    浏览(55)
  • 反编译微信小程序,可导出uniapp或taro项目

    微信小程序反编译(全网通用) 微信小程序反编译 反编译主要分为四个阶段 操作流程 1. node.js安装 2. node安装模块 3. 开始反编译 4. 导入到微信开发者工具既可运行 微信小程序反编译 当碰到不会写的小程序功能时,正好看到隔壁小程序有类似的功能,一般都想借鉴一下,本

    2024年02月12日
    浏览(39)
  • Ant Design Mini 在小程序中的使用

    今天来给大家分享一下 Ant Design Mini 在原生小程序中或者uniapp中的使用 目录 在原生微信小程序中使用 在 uni-app 中使用 在支付宝小程序中引用 在微信小程序中引用 1. 安装依赖 npm i antd-mini --save 2. 构建 npm 安装好依赖以后,点击开发者工具中的菜单栏:工具 -- 构建 npm 3. 在项

    2024年04月09日
    浏览(84)
  • 直接在小程序中使用lodash会报错,原因可参考

    直接在小程序中使用lodash会报错,原因可参考 在 import {_} from \\\'lodash\\\' 之前先 import \\\'fix\\\' 原文链接:https://www.cnblogs.com/stumpx/p/13212266.html

    2024年02月15日
    浏览(33)
  • Taro+NutUi 开发不同平台的小程序系列 -第一章节/项目多平台运行测试

    写在前面 今天开始我们写 Taro+NutUi 的文章,第一篇先从创建一个项目开始,后续我们持续增加功能,发布到不同的平台开发工具上看一下具体的渲染效果怎么样,之前 uniapp 也是支持各个平台发布的,甚至可以直接发布到 app 上,我前面的文章也写过,今天我们使用 Taro 将这

    2024年02月04日
    浏览(32)
  • 微信小程序+Taro 混编,Taro 使用微信原生 behaviors

    最近有一个小程序项目,因为一些原因项目架构选择了微信小程序原生+Taro 混编的方式进行开发,在开发的过程中发现 Taro 不支持使用原生的 behaviors 特性,因为混编的原因项目当中已有原生页面在使用 behaviors,所以需要一个方案在不影响其他页面的基础上使 Taro 也能使用这

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包