ایجاد نمودارهای React Native با Tooltip های دینامیک — راهنمای کاربردی

۱۰۳ بازدید
آخرین به‌روزرسانی: ۲۹ آبان ۱۴۰۲
زمان مطالعه: ۵ دقیقه
ایجاد نمودارهای React Native با Tooltip های دینامیک — راهنمای کاربردی

ایجاد نمودارهای React Native روی وب یا موبایل همواره یک کار جذاب و چالش‌برانگیز محسوب می‌شود. یافتن کتابخانه مناسبی که بتواند نیازهای کارکردی و طراحی را پوشش دهد دشوار است. با این که می‌توان نمودارها را مستقلاً ایجاد کرد، اما در اغلب موارد یادگیری و پیاده‌سازی موارد مختلف از صفر تا صد سربار زیادی دارد.

اگر یک برنامه‌نویس مبتدی هستید، احتمالاً می‌خواهید از یک کتابخانه آماده نمودار استفاده کنید. در این صورت گزینه‌های بسیار معدودی برای پیاده‌سازی و سفارشی‌سازی نمودارها در اختیار ما قرار دارد.

بیان مسئله

نمودارهای React Native

پیش از ورود عملی به بحث بهتر است یک بار دیگر مسئله را به صورت دقیق بررسی کنیم.

در این مقاله هدف ما آن است که یک ناحیه نمودار داشته باشیم که یک نشانگر دایره‌ای در هر نقطه داده‌ای به آن اضافه کنیم و بتوانیم روی آن بزنیم تا یک tooltip شامل مقادیر مختصات X و Y نمایش پیدا دهیم.

ما برای حل این مسئله برخی از کتابخانه‌های موجود React Native برای نمایش نمودار را بررسی کردیم و به دو مورد react-native-charts-wrapper و react-native-svg-charts رسیدیم.

کتابخانه React Native Charts Wrapper

نخستین گزینه کتابخانه React Native Charts Wrapper است که یک پوشش React Native برای کتابخانه محبوب MPAndroidChart و Charts است.

این کتابخانه قابلیت پیکربندی بالایی دارد و از آنجا که از کتابخانه‌های نمودار بومی استفاده می‌کند، گذار روانی دارد و از پشتیبانی لمسی خوبی برخوردار است. همچنین نمونه‌های زیادی از کاربرد در ریپازیتوری گیت‌هاب آن ارائه شده است.

با توجه به عملکرد و قابلیت سفارشی‌سازی این کتابخانه، در ابتدا گزینه اول ما محسوب می‌شد. این کتابخانه راهنمای نصب کاملاً بلند و دقیقی دارد که با پیروی از آن می‌توان کتابخانه را روی هر دو نوع دستگاه‌های iOS و اندروید نصب و اجرا کرد.

به نظر می‌رسد که همه چیز روی اندروید به نرمی و روان کار می‌کند. اما زمانی که تلاش کردیم آن را روی iOS بیلد کنیم، خطایی ایجاد شد. پس از ساعت‌های زیاد جستجو در بخش issue-های گیت‌هاب و گوگل متوجه شدیم که گزینه مطلوبی برای ما محسوب نمی‌شود.

کتابخانه React Native SVG Charts

پس از کنار گذاشتن دیگر کتابخانه‌ها، کتابخانه React Native SVG Charts بهترین گزینه‌ای است که تاکنون یافته‌ایم. react-native-svg-charts در پس‌زمینه از react-native-svg برای رندر کردن نمودارها استفاده می‌کند. همچنین مثال‌های زیادی (+) برای نشان دادن کاربردهای مختلف آن ارائه شده است. از آن جا که این کتابخانه هیچ لینک بومی ندارد، نصب و پیاده‌سازی آن کاملاً سرراست و ساده است. برای مشاهده سورس کد کتابخانه به این ریپو (+) مراجعه کنید.

شروع

یک پروژه React Native ایجاد کرده و وابستگی‌های لازم را نصب کنید:

~ react-native init ReactNativeTooltip

همچنین باید کتابخانه react-native-svg را نصب و لینک کنید:

~ npm i react-native-svg
~ react-native link react-native-svg

اگر در لینک کردن کتابخانه به صورت خودکار با استفاده از دستور link هر گونه مشکلی داشتید می‌توانید از مراحل راهنما (+) که در مستندات رسمی ارائه شده پیروی کنید. در نهایت react-native-svg-charts را نصب کنید:

~ npm install react-native-svg-charts

دریافت داده‌های ساختگی

پیش از آن که به بررسی عمیق‌تر کدنویسی بپردازیم، باید مقداری داده‌های ساختگی داشته باشیم که از آن‌ها برای رندر AreaChart استفاده کنیم. ما از یک سرویس شخص ثالث به نام Mockaroo برای تولید داده‌های ساختگی جهت پروژه‌مان استفاده می‌کنیم.

به طور معمول داده‌ها از یک API دریافت می‌شوند، در حالت کامپوننت ذخیره می‌شوند و سپس وارد کامپوننت ناحیه ما می‌شوند. در ادامه داده‌های ساختگی را در قالب JSON می‌بینید. فایل کامل داده‌های JSON را در این صفحه (+) مشاهده کنید:

1export const DATA = [
2  {
3    id: 1,
4    date: '2019–01–26T22:37:01Z',
5    score: 3,
6  },
7  {
8    id: 2,
9    date: '2019–01–06T06:03:09Z',
10    score: 9,
11  },
12  {
13    id: 3,
14    date: '2019–01–28T14:10:00Z',
15    score: 10,
16  },
17  {
18    id: 4,
19    date: '2019–01–03T02:07:38Z',
20    score: 7,
21  },
22  ...
23]

استفاده از کتابخانه React Native SVG Charts

کتابخانه react-native-svg-charts کامپوننت‌های زیادی دارد که می‌توان برای ایجاد گراف از آن‌ها استفاده کرد. در این راهنما ما از کامپوننت AreaChart استفاده می‌کنیم اما شما می‌توانید از هر یک از کامپوننت‌های نمودار موجود (+) بهره بگیرید. در ادامه کد کامپوننت نمودار Areachart را مشاهده می‌کنید:

1<AreaChart
2  style={{ height: '70%' }}
3  data={data}
4  yAccessor={({ item }) => item.score}
5  xAccessor={({ item }) => moment(item.date)}
6  contentInset={contentInset}
7  svg={{ fill: '#003F5A' }}
8  numberOfTicks={10}
9  yMin={0}
10  yMax={10}
11>

در ادامه props–ی را پیاده‌سازی می‌کنیم که در AreaChart استفاده خواهیم کرد:

  • Data – این یک فیلد ضروری است که باید از نوع آرایه باشد.
  • yAccessor – تابعی است که هر مدخل data و همچنین اندیس می‌گیرد و مقدار y هر مدخل را بازگشت می‌دهد.
  • xAccessor – همانند yAccessor است اما مقدار x آن مدخل را بازگشت می‌دهد.

برای مطالعه موارد بیشتر در مورد props موجود به مستندات رسمی (+) مراجعه کنید.

افزودن دکوراتورها

کتابخانه React-native-SVG-charts طوری ساخته شده که تا حد امکان قابل بسط باشد. همه نمودارها می‌توانند با استفاده از decorators بسط یابند. دکوراتور کامپوننتی است که نمودار شما را به نوعی استایل‌بندی کرده و یا بهبود می‌بخشد. کافی است کامپوننت سازگار با react-native-svg را به عنوان فرزند به آن گراف ارسال کنید تا با همه اطلاعات ضروری برای طرح‌بندی دکوراتور فراخوانی شود.

در این راهنما به دو دکوراتور نیاز داریم که یکی برای نشانگر نقاط داده‌ای و دیگری برای tooltip است.

نکته: باید مطمئن شوید که دکوراتورها را درون کامپوننت AreaChart قرار می‌دهید، چون در غیر این صورت رندر نخواهد شد.

افزودن نقاط داده‌ای نشانگر

در ادامه یک دکوراتور ایجاد می‌کنیم که از یک نشانگر برای هر نقطه داده‌ای در نمودار استفاده می‌کند:

1const ChartPoints = ({ x, y, color }) =>
2  data.map((item, index) => (
3   <Circle
4     key={index}
5     cx={x(moment(item.date))}
6     cy={y(item.score)}
7     r={6}
8     stroke={color}
9     fill="white"
10     onPress={() =>
11       this.setState({
12         tooltipX: moment(item.date),
13         tooltipY: item.score,
14         tooltipIndex: index,
15       })
16     }
17  />
18));

ما به یک نشانگر دایره‌ای برای هر آیتم در آرایه داده‌ها نیاز داریم. به همین منظور قصد داریم در آرایه داده‌ها روی همه مدخل‌ها بچرخیم و کامپوننت SVG به نام Circle را برای هر کدام از آن‌ها بازگشت دهیم. اکنون برای موقعیت‌یابی آن‌ها روی نمودار از props به نام cx و cy برای قرار دادن به ترتیب به صورت افقی و عمودی استفاده می‌کنیم. ما برای cx از کلید date و برای cy از کلید score استفاده خواهیم کرد.

علاوه بر آن یک prop به نام onPress نیز ارسال می‌کنیم که در زمان فشرده شدن هر کدام از نقاط داده‌ای یکی از سه حالت tooltipX، tooltipY و tooltipIndex را تنظیم می‌کند. سپس از این حالت‌ها برای موقعیت‌یابی دکوراتور استفاده می‌کنیم.

نمودارهای React Native

افزودن tooltip

اکنون که اطلاعات لازم مانند محور (x (tooltipX، محور (y (tooltipY و یک اندیس (tooltipIndex) را برای نشانگر فشرده شده داریم می‌توانیم از آن‌ها برای قرار دادن Tooltip روی AreaChart استفاده می‌کنیم. ما یک فایل جدید برای دکوراتور Tooltip on the AreaChart ایجاد می‌کنیم.

1const Tooltip = ({ x, y, tooltipX, tooltipY, color, index, dataLength,
2}) => {
3let xAxis = 4;
4  if (dataLength > 4) {
5    if (index < 2) {
6      xAxis = 35;
7    } else if (index > dataLength - 2) {
8      xAxis = -20;
9    } else {
10     xAxis = 4;
11    }
12  }
13return (
14    <G x={x(tooltipX) - 40} y={y(tooltipY)}>
15      <G y={tooltipY > 9 ? 20 : -29} x={xAxis}>
16        <Rect x={-2} y={0} height={22} width={70} stroke={color} fill="white" ry={10} rx={10} />
17        <Rect x={-2} y={0} height={22} width={18} fill={color} ry={10} rx={10} />
18        <Rect x={10} y={0} height={22} width={tooltipY > 9 ? 12 : 10} fill={color} />
19        <Text x={6} y={14} stroke="#fff">
20          {tooltipY}
21        </Text>
22        <Text x={tooltipY > 9 ? 24 : 22} y={14}>
23          {moment(tooltipX).format('MMM DD')}
24        </Text>
25      </G>
26    </G>
27  );
28};

از دیدن این همه تگ‌های React ،G و Text سردرگم نشوید، چون اغلب آن‌ها صرفاً برای استایل‌بندی tooltip هستند.

کافی است روی tooltipX و tooltipY تمرکز کنید که از آن‌ها برای موقعیت‌یابی افقی و عمودی Tooltip روی نمودار استفاده می‌کنیم. این مقادیر همان cx و cy هستند که برای نشانگر استفاده کردیم و تنها تفاوت این است که برخی مقادیر را روی نمودار از آن‌ها اضافه یا کسر می‌کنیم.

علاوه بر آن از tooltipIndex برای یافتن اولین و آخرین tooltip استفاده می‌کنیم به طوری که نیازی به بریدن کناره‌ها نیست. برای مشاهده مثال کامل به این لینک (+) مراجعه کنید.

نمودارهای React Native

سخن پایانی

در این مقاله همه مواردی که برای ایجاد نمودار، نشانگر و tooltip لازم بود را توضیح دادیم. این مقاله صرفاً یک پیاده‌سازی مقدماتی از آن چه که می‌توان با استفاده از کتابخانه react-native-svg-charts ساخت ارائه می‌کند. اگر می‌خواهید موارد بیشتری را بررسی کنید می‌توانید مثال‌های موجود (+) در ریپازیتوری آن را به عنوان نمونه‌هایی از کاربرد کتابخانه مطالعه کنید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
better-programming
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *