React Native 图表库、react-native-graph、Skia 图表、React Native 折线图、移动端高性能图表、React Native 手势图表、@shopify/react-native-skia 使用教程、Crypto 图表实现、RN 动画图表
大家好 这里是「代码简单说`,欢迎大家关注同名公众号,不定时更新更多实用有趣的教程 也欢迎大家在评论区一起讨论交流!~

在做移动端数据可视化时(比如行情、价格走势、资产曲线),我在 RN 项目中经常遇到一个问题:
react-native-svg 在大量数据 + 动画时掉帧明显后来接触到 react-native-graph(基于 Skia),核心思路是:
用 Skia 直接做 2D 渲染 + 原生路径插值 + 动画系统,绕开 JS bridge 的性能瓶颈
react-native-graph 是一个基于 @shopify/react-native-skia 的高性能折线图组件,主要用于移动端实时数据展示(尤其是金融/加密资产场景)。
典型应用:
从工程角度拆解,它主要优化了三类问题:
yarn add react-native-reanimated
yarn add react-native-gesture-handler
yarn add @shopify/react-native-skia
yarn add react-native-graph注意点:
reanimated 和 gesture-handler 必须先配置最简单的折线图:
function App() {
const priceHistory = usePriceHistory('ethereum')
return (
<LineGraph
points={priceHistory}
color="#4484B2"
/>
)
}[
{ x: 1710000000000, y: 1200 },
{ x: 1710003600000, y: 1230 },
]<LineGraph
points={priceHistory}
animated={true}
color="#4484B2"
/><LineGraph
points={priceHistory}
animated={true}
enablePanGesture={true}
onGestureStart={() => console.log('start')}
onPointSelected={(p) => console.log(p)}
onGestureEnd={() => console.log('end')}
/>事件 | 说明 |
|---|---|
onGestureStart | 手指按下 |
onPointSelected | 拖动选中数据点 |
onGestureEnd | 松手结束 |
<LineGraph
points={priceHistory}
animated={true}
TopAxisLabel={() => <AxisLabel value={100} />}
BottomAxisLabel={() => <AxisLabel value={20} />}
/>常用于:
用于固定图表显示区间:
<LineGraph
points={priceHistory}
animated={true}
range={{
x: {
min: new Date(2000, 1, 1),
max: new Date(2000, 1, 31)
},
y: {
min: 0,
max: 200
}
}}
/>适用于:
<LineGraph
points={priceHistory}
animated={true}
enablePanGesture={true}
SelectionDot={CustomSelectionDot}
/>作用:
如果是在 FlatList 中渲染多个图:
animated建议在前端做一次降采样:
function downSample(data, step = 2) {
return data.filter((_, index) => index % step === 0)
}如果外层有 ScrollView:
项目 | Skia (react-native-graph) | react-native-svg |
|---|---|---|
性能 | 高(GPU) | 中(JS驱动) |
动画 | 原生插值 | JS动画 |
手势 | 流畅 | 容易卡顿 |
复杂图表 | 稳定 | 易掉帧 |
react-native-graph 的核心价值不在“画图”,而在:
用 Skia 把图表渲染从 JS 层迁移到 Native GPU 渲染管线
在以下场景更适合使用:
如果只是简单静态图表,其实 SVG 也足够。
如果需要,我可以再补一版: