【小程序】类taro语法中小程序端使用f2

news2024/12/29 10:49:25

前言

  • 最近在类taro框架中小程序端使用最新版f2。(这里我使用rax)并封装了库,特此记录一下。

使用

  • 想直接用的同学直接在你的rax项目中安装rax-my-f2这个包,他依赖@antv/f2@antv/f2-context这2个包。
import { MyCanvas } from 'rax-my-f2';
  • 导入之后和官方文档一样直接使用:
const LineChart = (props) => (
  <Chart data={props.data}>
    <Axis
      field="date"
      tickCount={3}
      style={{
        label: { align: 'between' },
      }}
    />
    <Axis field="value" tickCount={5} />
    <Line x="date" y="value" />
    <Tooltip />
  </Chart>
);
function Index() {
  const [datas, setData] = useState(data);
  useEffect(() => {
    setTimeout(() => {
      console.log('over');
      setData(data2);
    }, 5000);
  }, []);
  return (
    <view id="aaa">
      <MyCanvas id='ddd' width={375} height={260} data={datas} onRender={LineChart} />
    </view>
  );
}
export default Index;
  • 如果需要封装taro或者其他类taro框架或者非阿里小程序,需要看一下下面的封装思路自行封装。

封装思路

  • 首先有些背景知识需要知道下。
  • 小程序的canvas和web的canvas有一些区别,不同平台的小程序之间canvas也有区别。f2是基于canvas绘图的,所以需要有个东西抹平canvas的差异。这里f2团队已经做好了使用@antv/f2-context就可以。这个包的用法很简单,你给他个小程序canvas的context做参数,他还你个做过兼容的context。
  • 阿里小程序主要分为支付宝小程序与钉钉小程序。钉钉小程序基础库目前只能使用1版本的,而阿里小程序可以切换1版本或者2版本。而canvas这个在1版本和2版本的使用都不一样,需要做两者的兼容。
  • 阿里小程序中2版本的canvas在加载完成后会触发onReady方法,在onReady方法中可以拿到该canvas的node,从而能获取到context。这个context是已经兼容过的,只需要做一下分辨率然后转给f2渲染即可:
const onCanvasReady = () => {
    const query = my.createSelectorQuery();
    query
      .select(`#${id}`)
      .node()
      .exec((res) => {
        if (!res[0]) {
          return;
        }
        const canvas = res[0].node;
        const { width, height } = canvas;
        const pixelRatio = getPixelRatio();
        canvas.width = width * pixelRatio;
        canvas.height = height * pixelRatio;
        const context = canvas.getContext("2d");
        canvasRender({ width, height, pixelRatio, context });
      });
  };
   const canvasRender = ({ width, height, pixelRatio, context }) => {
    if (!width || !height) {
      return;
    }
    const children = props.onRender(props);
    const pix = isAppX2CanvasEnv() ? pixelRatio : 1;
    const canvas = new Canvas({
      pixelRatio: pix,
      width,
      height,
      context,
      children,
    });
    canvas.render();
    setCtx(canvas);
    setEl(canvas.canvas.get("el"));
  };
  • 2版本的判断使用,一个就是onReady用来拿context,一个是return node用来拿canvas的node。
// 判断是否是新版 canvas 所支持的调用方法(AppX 2.7.0 及以上)
const isAppX2CanvasEnv = () =>
  my.canIUse("canvas.onReady") && my.canIUse("createSelectorQuery.return.node");
  • 1版本由于不会触发onReady且也拿不到node,需要使用createSelectorQuery去查找。实测发现这里在useEffect后还需要setTimeout不然很可能找不到。拿到宽高后使用createCanvasContext进行创建context,这个context则是没有兼容的,需要使用@antv/f2-context进行兼容。最后这个传给f2渲染的pixelRatio应该为1,否则这个图像显示会不太正常。
  • 最后对移动端常见的事件进行封装,因为已经拿到element了,直接canvas派发对应事件即可:
  const click = (e) => {
    if (!el) {
      return;
    }
    const event = wrapEvent(e);
    const { detail, target } = e;
    const { x, y } = detail;
    const { offsetLeft = 0, offsetTop = 0 } = target;
    // 包装成 touch 对象
    event.touches = [{ x: x - offsetLeft, y: y - offsetTop }];
    el.dispatchEvent("click", event);
  };
  const touchStart = (e) => {
    if (!el) {
      return;
    }
    el.dispatchEvent("touchstart", wrapEvent(e));
  };
  const touchMove = (e) => {
    if (!el) {
      return;
    }
    el.dispatchEvent("touchmove", wrapEvent(e));
  };
  const touchEnd = (e) => {
    if (!el) {
      return;
    }
    el.dispatchEvent("touchend", wrapEvent(e));
  };

faq

1、 按照官网的示例写原生canvas怎么着都出不来效果

  • 官网示例:https://opendocs.alipay.com/mini/api/createimage
    包括onCanvasReady函数不会正常运行。createSelectorQuery没有node方法。
  • 原因:未使用高版本基础库。(低版本基础库也能显示f2,但是不会触发onCanvasReady方法,钉钉小程序只能使用低版本基础库)。
    在这里插入图片描述
    需要在设置里勾上启用2.0构建。
    可以查看下版本号:
    在这里插入图片描述
    错误的版本号1开头的就不会显示。
    在这里插入图片描述
    高版本则正常。

2、rax小程序报找不到jsx

  • 找不到jsx一般有2种情况:
    一种是使用的组件没有保留rax的createElement函数导致。
    还有一种是在该Rax页面中保留了rax的默认导出(这个坑坑了我挺久的)比如:
import Rax, { createElement, useEffect, useRef, useState } from 'rax';
  • 这个默认导出Rax如果存在,就会报这个错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes 笔记(06)— 搭建多节点集群、kubeadm 安装 master/worker/console/flannel 网络插件

1. kubeadm 官网&#xff1a;https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/ 为了简化 Kubernetes 的部署工作&#xff0c;社区里就出现了一个专门用来在集群中安装 Kubernetes 的工具&#xff0c;名字就叫 kubeadm&#xff0c;意思就是 Kubernetes 管理员…

Java设计模式-状态模式State

介绍 状态模式&#xff08;State Pattern&#xff09;&#xff1a;它主要用来解决对象在多种状态转换时&#xff0c;需要对外输出不同的行为的问题。状态和行为是一一对应的&#xff0c;状态之间可以相互转换。当一个对象的内在状态改变时&#xff0c;允许改变其行为&#xff…

学习记录677@项目管理之配置管理案例

案例 Simple公司的质量管理体系中的配置管理程序文件中有如下规定: (1)由变更控制委员会(CCB)制定项目的配置管理计划; (2)由配置管理员(CMO)创建配置管理环境: (3)由CCB 审核变更计划; (4)项目中配置基线的变更经过变更申请、变更评估、变更实施后便可发布&#xff1b; (5)CC…

Java基础10:常用API(下)

Java基础10&#xff1a;常用API&#xff08;下&#xff09;一、Date二、SimpleDateFormat三、Calendar四、ZoneId五、Instant六、ZoneDateTime七、DateTimeFormatter八、LocalDate、LocalTime、LocalDateTime九、Duration、Period、ChronoUnit十、包装类一、Date Date类是一个…

基于PIL和Tesseract的数字计算验证码识别处理思路

如图,我们在使用python自动化的时候经常会遇到很多各式各样的验证码。这个是一个数字加法的验证码。 干扰项里包含完整的数字、字母信息,普通的OCR识别可能不是很准确。 但是不管怎们样,咱们先把必要的环境搭建起来,试一下Tesseract的识别结果吧。 1、安装Tesseract: 首…

屏蔽360阻止运程执行变更注册表自启动数据的办法

屏蔽360阻止运程执行变更注册表自启动数据的办法 运程服务器上的程序&#xff0c;由于需要。我在服务器中&#xff0c;加入更新升级自身&#xff08;exe&#xff09;文件&#xff0c;并变更操作系统自启动数据的代码。 实践证明&#xff0c;通过客户端&#xff0c;调用运程服务…

全景解析SSD IO QoS性能优化

一、NAND基本原理目前NAND已经从SLC发展到PLC&#xff0c;但是PLC离大规模上市还有一段距离&#xff0c;我们暂时先略过。市面上主要流通的就是4种NAND类型&#xff1a;SLC、MLC、TLC、QLC。随着每个寿命从高到低依次是SLC>MLC>TLC>QLC.随着单个cell含有的bit数越多&a…

Unity MRTK使用详解(Htc vive+LeapMotion)

MRTK-Unity是一个由Microsoft驱动的开源项目&#xff0c;提供了多种组件和功能&#xff0c;用于加速Unity中的跨平台MR应用程序开发。以下是其一些功能&#xff1a; 提供跨平台输入系统和用于空间交互和UI组件。 启用快速原型通过在编辑器中的模拟&#xff0c;让你马上看到变化…

创建大量TCP连接时会受到什么因素的限制?

1.文件描述符资源 用户级限制 我们可以使用ulimit命令查看系统允许当前用户进程打开的文件数限制&#xff1a; ulimit -n 我们可以使用 ulimit -n 文件数 来修改不过这种设置是临时的&#xff0c;只在当前的session中有效。为永久修改用户级文件描述符数限制&#xff0c;可以…

SpringBoot框架介绍及使用

1. 概述 1.1 SpringBoot 简介 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 1.2 微服务 微服务&#xff1a;架构风格&#xff08;服务微化&#xff09; 一个应用应该是一组小型服务&#xff1b;…

【速记】离散分布的实现算法

离散分布与 zipf 分布 下面的一段代码&#xff0c;能根据数值描述来生成对应概率的离散值&#xff1a; #include <iostream> #include <iomanip> #include <map> #include <random>using namespace std;int main() {std::random_device rd;std::mt19…

「计算机组成原理」计算机系统概述

文章目录一、计算机发展历程1.1 什么是计算机系统1.2 硬件的发展1.2.1 硬件发展1.2.2 摩尔定律1.3 软件的发展1.4 目前的发展趋势二、计算机系统的多级层次结构2.1 编程语言的三个等级2.2 计算机系统层次结构三、计算机硬件的基本组成3.1 冯诺依曼结构3.2 现代计算机结构四、计…

Codeforces Round #847 (Div. 3) 的 C. Premutation(找规律题)

题面&#xff1a;中文大意&#xff1a;如果一个n个数字的序列恰好包含了1到n的所有整数&#xff0c;那么这个序列就被称为置换。例如&#xff0c;序列[3&#xff0c;1&#xff0c;4&#xff0c;2]。1]和[2&#xff0c;1]是互换&#xff0c;但是[1&#xff0c;2&#xff0c;1]&a…

Java设计模式-备忘录模式Memento

介绍 备忘录模式&#xff08;Memento Pattern&#xff09;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。可以这里理解备忘录模式&#xff1a;现实生活中的备忘录是用来记录某…

window系统path环境变量删除了怎么办?

前言 纪念我今天装JDK配置环境时&#xff0c;误删了path环境变量&#xff0c;后总结的知识点&#xff0c;希望对大家有所帮助&#xff0c;期待大家的评论&#xff01; 目录 前言 方案一&#xff1a;从注册表里找 方案二&#xff1a;实在没办法&#xff0c;从网上复制 方案三…

7-1输入/输出系统-概念外设接口

文章目录一.I/O系统基本概念&#xff08;一&#xff09;输入/输出系统&#xff08;二&#xff09;I/O控制方式二.外部设备1.显示存储器VRAM2.字符显示器3.外储存器三.I/O接口1.I/O接口的功能2.I/O接口的基本结构3.I/O接口的工作原理4.I/O接口的类型5.I/O端口及其编址&#xff0…

网络编程(TCP+UDP)(3)

1)咱们之前所说的网络分层就是因为说如果说使用一个协议太复杂了&#xff0c;那么我们就需要把这个协议分层&#xff0c;每一个协议都会简单一些&#xff0c;灵活替换也更方便&#xff1b; 2)咱们现在需要实现一个网络计算器&#xff1b; 1)上图是模拟一个计算器服务器和客户端…

第01天-Java数据结构和算法

001_几个经典的算法面试题(1)暴力匹配不推荐KMP算法分治算法002_几个经典的算法面试题(2)回溯算法图的深度优先遍历算法(DFS) 贪心算法优化003_内容介绍和授课方式数据结构和算法的重要性课程亮点和授课方式004_数据结构和算法的关系005_编程中实际遇到的几个问题Java代码小结…

机器学习实战(第二版)读书笔记(3)——膨胀卷积,WaveNet

一、基础知识 对于一个卷积层&#xff0c;如果希望增加输出单元的感受野&#xff0c;一般可以通过三种方式实现&#xff1a; 增加卷积核的大小增加层数&#xff08;比如两层3 3 的卷积可以近似一层5 5 卷积的效果&#xff09;在卷积之前进行池化操作 其中第1&#xff0c;2种…

推荐5个很牛的开源项目

大家伙们年过了哈&#xff0c;该收拾收拾心情上班了。 不知道大家有没有这种感觉&#xff0c;年纪越大&#xff0c;越觉得年过得快。感觉好像才刚开始&#xff0c;马上初五了&#xff0c;初六送完穷鬼&#xff0c;初七送自己出来上班了&#xff08;没有哭&#xff09;。 不过…