iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0

由於目前 HourlyForecastDailyForecast 當中的 icon 設定部分都是重複的,看起來可以共用,因此我們可以將這部分抽出來,變成一個獨立的 config,這樣就可以避免重複的程式碼。

建立共用的 config

首先我們先建立一個 config 資料夾,並在裡面建立一個 weatherIconsConfig.ts 檔案:

$ mkdir src/config
$ touch src/config/weatherIconsConfig.ts

接下來我們把這兩個 component 中的 icon 設定部分抽出來,並且放到 weatherIconsConfig.ts 中:

import { ComponentType } from 'react'
import { AntDesign, Feather } from '@expo/vector-icons'

export type AntDesignNames = keyof typeof AntDesign.glyphMap
export type FeatherNames = keyof typeof Feather.glyphMap

export interface WeatherIconConfig {
  component: ComponentType<any>
  name: AntDesignNames | FeatherNames
  color: string
}

export const weatherIcons: Record<string, WeatherIconConfig> = {
  sunny: { component: Feather, name: 'sun', color: '#FFD700' },
  cloudy: { component: AntDesign, name: 'cloudo', color: '#cfd8e2' },
  rainy: { component: Feather, name: 'cloud-rain', color: '#a9b2bc' },
}

這個有關於 icon 的型別定義,以及判斷如何使用 icon 的部分,通通在這個檔案做一個管理,除了避免重複的程式碼之外,也可以讓我們在未來要新增 icon 的時候,可以更方便地管理。

使用 config

接下來我們就可以在 HourlyForecastDailyForecast 當中使用這個 config 了:

import { weatherIcons } from '../config/weatherIconsConfig'

interface HourlyForecastProps {
  time: string
  icon: keyof typeof weatherIcons
  temp: string
}

const HourlyForecast: FC<HourlyForecastProps> = ({ time, icon, temp }) => {
  const IconComponent = weatherIcons[icon]?.component || AntDesign || Feather
  const iconName = weatherIcons[icon]?.name || 'question'
  const iconColor = weatherIcons[icon]?.color || '#ffffff'

  // 省略
}

export default HourlyForecast
import { weatherIcons } from '../config/weatherIconsConfig'

interface DailyForecastProps {
  day: string
  icon: keyof typeof weatherIcons
  tempHigh: string
  tempLow: string
}

const DailyForecast: FC<DailyForecastProps> = ({
  day,
  icon,
  tempHigh,
  tempLow
}) => {
  const IconComponent = weatherIcons[icon]?.component || AntDesign || Feather
  const iconName = weatherIcons[icon]?.name || 'question'
  const iconColor = weatherIcons[icon]?.color || '#ffffff'

  // 省略
  )
}

export default DailyForecast

這樣我們的專案就更加乾淨了,而且未來如果要新增 icon 的話,也可以直接在 weatherIconsConfig.ts 中新增,不用再去修改其他的程式碼。

在開始串接天氣 API 之前,我們需要先定位目前的所在地,明天見👋!


上一篇
Day 17 - 建立 Weather App UI 架構
下一篇
Day 19 - 簡單定位 - Expo Location
系列文
掌握 React Native 與 Expo:30天雙打,新手也能精通跨平台開發!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言