note Reflex 是一个开源库,旨在使用纯 Python 构建全栈 Web 应用程序。它的设计理念是让开发者能够完全使用 Python 编写应用的前端和后端,无需学习 JavaScript。这对于那些希望专注于 Python 编程语言的开发者来说是一个重大的福音。
上面说的都是场面话,这都依托于它自身包装的第三方应用够丰富。但是,对于一些冷门的应用,比如我这里要说的IGV浏览器,就没有那么容易了。这里我就来分享一下我是如何在 Reflex 里面使用 IGV 浏览器的。
包装igv.js到react组件
首先,我们需要把 igv.js 包装成一个 React 组件。我们以两个需要实现的交互为例子来说明:
- 第一个是我们有一个外部的控制器,可以通过这个控制器来控制 igv.js 显示的坐标范围。
- 第二个是当我们鼠标点击某个区域的时候,我们可以获取到这个区域的所有信息。
首先,通过查阅 IGV.js的文档,我们知道,我们可以通过 igv.createBrowser
来创建一个 IGV 浏览器。我们可以通过这个函数来创建一个 IGV 浏览器,然后通过这个浏览器的实例来控制 IGV 的显示。
import igv from "https://unpkg.com/[email protected]/dist/igv.esm.min.js" |
然后我们可以通过igv.removeAllBrowsers()
来移除所有的浏览器。
那么,我们放到 React 组件里面,就是这样的:
import React, { useEffect, useRef } from "react"; |
现在,我们来添加交互,我们想要实现的第二个功能需要 browser.on
来监听事件。比如我们想要监听鼠标点击事件,我们可以这样:
browser.on("trackclick", (track, popoverData) => {}) |
我们放入 React 组件里面,就是这样的:
import React, { useEffect, useRef } from "react"; |
而第一个要求里,我们要外部控制,需要获取到browser的实例,然后通过这个实例来控制 IGV 的显示。我们可以通过 browser.search
来搜索某个基因,通过 browser.zoomIn
和 browser.zoomOut
来缩放。这在react里是这样的:
import React, { useEffect, useRef } from "react"; |
这样,我们就完成了最终的包装。我们可以自己搭建React环境来测试一下是否可行,或者可以去找在线平台测试,例如playcode
在 Reflex 里面使用
根据官方文档的表述,React组件的包装就相当简单了,我们这里是本地的组件,所以就可以这样:
### IGV.py |
一定要注意的是,Reflex默认是服务端渲染的,但是显然 IGV浏览器无法在服务端兼容,那么我们就是用 NoSSRComponent
来包装。
如何使用?
我们可以写一个小的 Demo来测试一下:
import reflex as rx |
使用就很简单了,一旦包装好,我们导入它就可以当做官方的组件来使用了,我们可以为他写 State,写 EventHandler,写页面,写交互,写样式,写逻辑,写一切。
总结
这里我们介绍了如何将 igv.js 包装成 React 组件,然后将 React 组件包装成 Reflex 组件,最后在 Reflex 里面使用。这里只是一个简单的例子,实陿上,我们可以包装任何我们想要的组件,只要我们有足够的耐心和技术。本文的代码在 Github 可以获取。
note 这里的 igv.js 是一个简单的例子,实陿上,我们可以包装任何我们想要的组件,只要我们有足够的耐心和技术。