Vue 및 Echarts 를 사용한 날씨 트렌드 차트

JavaScriptBeginner
지금 연습하기

소개

이 프로젝트에서는 한 도시의 연중 기온 데이터를 표시하는 날씨 추세 차트를 만드는 방법을 배우게 됩니다. 이 차트를 통해 사용자는 현재 달의 데이터와 다음 7 일간의 데이터를 전환하여 날씨 추세를 포괄적으로 볼 수 있습니다.

👀 미리보기

"현재 달"과 "다음 7 일" 전환 효과는 아래 그림과 같습니다.

Image Description

달 전환 효과는 다음과 같습니다.

Image Description

🎯 과제

이 프로젝트에서 다음을 배우게 됩니다.

  • Axios 를 사용하여 JSON 파일에서 날씨 데이터를 가져오는 방법
  • 월 목록을 렌더링하고 클릭 이벤트를 처리하여 표시된 데이터를 변경하는 방법
  • 현재 달의 데이터와 다음 7 일간의 데이터를 전환하는 탭을 구현하는 방법
  • 날씨 데이터를 표시하기 위해 Echarts 차트를 초기화하고 사용자 정의하는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다.

  • Axios 를 사용하여 JSON 파일에서 데이터를 가져오기
  • Vue.js 를 사용하여 반응형 (responsive) 하고 대화형 (interactive) 사용자 인터페이스 만들기
  • Echarts 를 사용하여 고급 기능이 있는 사용자 정의 차트 만들기
  • 사용자 상호 작용을 처리하고 그에 따라 차트 업데이트
  • 프론트엔드 개발, 데이터 시각화 및 사용자 경험 디자인에 대한 지식 적용

프로젝트 구조 설정

이 단계에서는 프로젝트 파일과 구조를 설정합니다. 이 단계를 완료하려면 아래 단계를 따르세요.

프로젝트 폴더를 엽니다. 디렉토리 구조는 다음과 같습니다.

├── css
│   └── style.css
├── js
│   ├── axios.js
│   ├── echarts.min.js
│   ├── vue.min.js
│   └── weather.json
└── index.html

여기서:

  • css/style.css는 스타일 파일입니다.
  • js/axios.js는 axios 파일입니다.
  • js/vue.min.js는 vue2.x 파일입니다.
  • js/echarts.min.js는 echarts 파일입니다.
  • js/weather.json은 요청에 필요한 날씨 데이터입니다.
  • index.html은 메인 페이지입니다.

WebIDE 의 오른쪽 하단 모서리에 있는 Go Live 버튼을 클릭하여 프로젝트를 실행합니다.

다음으로, VM 상단의 "Web 8080"을 열고 수동으로 새로 고침하면 페이지가 표시됩니다.

Image Description

날씨 데이터 가져오기

이 단계에서는 제공된 JSON 파일에서 날씨 데이터를 가져오는 방법을 배웁니다.

  1. index.html 파일에서 파일 하단의 <script> 태그를 찾습니다.
  2. <script> 태그 내에서 new Vue()를 사용하여 새로운 Vue 인스턴스를 생성합니다.
  3. Vue 인스턴스의 data 옵션에 다음 속성을 추가하고 초기 값을 할당합니다.
data: {
  // ...
  data: [],
  yData: [],
  xData: [],
},
  1. Vue 인스턴스의 methods 훅에서 initChart 함수 내의 this.chartOptions를 찾고, xAxis 및 series 의 data를 다음과 같이 해당 변수로 변경합니다.
this.chartOptions = {
  // ...
  xAxis: [
    {
      // ...
      data: this.xData
    }
  ],
  // ...
  series: [
    {
      // ...
      data: this.yData
    }
  ]
};
  1. Vue 인스턴스의 mounted 훅에서 axios.get() 메서드를 사용하여 ./js/weather.json 파일에서 날씨 데이터를 가져옵니다. 수정된 코드는 다음과 같습니다.
mounted: async function () {
  const res = await axios.get("./js/weather.json");
  this.data = res.data;
  this.yData = res.data[0]["January"];
  this.xData = [...this.yData.map((e, i) => i + 1)];
  this.$nextTick(() => {
    this.initChart();
  });
},

이 코드는 JSON 파일에서 날씨 데이터를 가져와 data 속성에 저장한 다음, 차트의 초기 yDataxData 속성을 설정합니다. 마지막으로, initChart() 메서드를 호출하여 차트를 렌더링합니다.

월별 목록 렌더링

이 단계에서는 월 목록을 렌더링하고 클릭 이벤트를 처리하여 표시된 데이터를 변경하는 방법을 배웁니다.

  1. index.html 파일에서 Vue 인스턴스의 data 옵션에 다음 속성을 추가하고 초기 값을 할당합니다.
data: {
  // ...
  monthName: "January",
  monthNumber: 0,
},
  1. class="month"를 가진 <ul> 요소에서 v-for 지시어를 사용하여 월 목록을 렌더링합니다. <li> 요소에 클릭 이벤트 핸들러를 추가하여 월을 클릭하면 changeMonth() 메서드를 호출합니다.
<ul>
  <li
    v-for="(item,key,index) in monthList"
    :class="[monthName===key?'active':'']"
    @click="changeMonth(key,index)"
  >
    {{item}}
  </li>
</ul>
  1. Vue 인스턴스의 methods 섹션에 changeMonth() 메서드를 추가합니다. 이 메서드는 선택된 월을 기반으로 monthName, monthNumber, yData, 및 xData 속성을 업데이트한 다음, initChart() 메서드를 호출하여 차트를 다시 렌더링합니다.
changeMonth(month, index) {
  this.monthName = month;
  this.monthNumber = index;

  this.yData = this.data[index][month];
  this.xData = [...this.yData.map((e, i) => i + 1)];

  if (index === this.nowMonth) {
    this.type = 1;
  }
  this.initChart();
},

현재 월 및 다음 7 일 탭 구현

이 단계에서는 사용자가 현재 월의 데이터와 다음 7 일의 데이터를 전환할 수 있도록 하는 탭을 구현하는 방법을 배웁니다.

  1. index.html 파일에서 Vue 인스턴스의 data 섹션에 다음 속성을 추가합니다.
data: {
  type: 1, // 다음 7 일 및 현재 월에 대한 데이터 상태
  nowMonth: new Date().getMonth(),
},
  1. id="currentMonth"를 가진 <div>에서 monthNumbernowMonth 속성을 기반으로 조건부 렌더링을 추가합니다. 이렇게 하면 현재 월에 대한 탭만 표시됩니다.
<div id="currentMonth" v-if="monthNumber===nowMonth">
  <div class="title">
    <h3>{{typeTitle}}</h3>
    <div class="type" @click="clickType($event)">
      <span id="seven" :class="{'active':!type}">The next 7 days</span>
      <span id="current" :class="{'active':type}">The current month</span>
    </div>
  </div>
</div>
  1. Vue 인스턴스의 methods 섹션에 clickType() 메서드를 추가합니다. 이 메서드는 클릭된 탭을 기반으로 type, typeTitle, yData, 및 xData 속성을 업데이트한 다음, initChart() 메서드를 호출하여 차트를 다시 렌더링합니다.
clickType(e) {
  switch (e.target.id) {
    case "seven":
      this.type = 0;
      this.typeTitle = "The next 7 days";
      [this.xData, this.yData] = this.getSevenData();
      break;
    case "current":
      this.type = 1;
      this.typeTitle = "The current month";
      this.yData = this.data[this.monthNumber][this.monthName];
      this.xData = [...this.yData.map((e, i) => i + 1)];
      break;
  }
  this.initChart();
},
  1. 다음 7 일에 대한 x 축 레이블과 y 축 데이터를 계산하는 getSevenData() 메서드를 추가합니다.
getSevenData() {
  let newXdata = [],
    newYdata = [];
  for (let i = 0; i < 7; i++) {
    let now = new Date();
    let time = now.getTime() + 1000 * 60 * 60 * 24 * i;
    now.setTime(time);
    newXdata.push(`${now.getMonth() + 1}/${now.getDate()}`);

    if (this.monthNumber === now.getMonth()) {
      newYdata.push(this.yData[now.getDate() - 1]);
    } else {
      let nextMonth = this.data[now.getMonth()];
      for (const key in nextMonth) {
        newYdata.push(nextMonth[key][now.getDate() - 1]);
      }
    }
  }
  return [newXdata, newYdata];
},

이 메서드는 월 간의 전환을 고려하여 다음 7 일에 대한 x 축 레이블과 y 축 데이터를 계산합니다.

  1. 파일을 저장하고 페이지를 다시 로드하여 업데이트된 차트를 확인합니다. 다음 그림은 "현재 월"과 "다음 7 일" 간의 전환 효과를 보여줍니다 (시간 함수를 통해 얻었으며, 여기서는 4 월을 가정합니다).

Image Description

월 전환 효과는 다음과 같습니다.

Image Description

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.

✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습