Vue-프로젝트

vue-프로젝트 chart.js(4일차)

꾸준2 2020. 4. 8. 18:32
1. 상위컴포넌트에서 함수를 통해 변경된 변수값은 computed로 하위컴포넌트에 값을 전달할 수 있다.
2. chart.js를 사용할때 하위컴포넌트에서는 <template>을 사용하면 오류가 난다 <script>
3. props로 여러개의 데이터를 넘길때는 문자타입을 정해줘야한다.
// weather.vue

<template>
  <div class="all">

    <div>
      <dt class="detail">
        <dd class="weather" v-for="(weather, index) in weather">
          {{weather}}
        </dd>
      </dt>
    </div>

    <weather-chart v-bind:text="time" v-bind:number="temperature"></weather-chart>

  </div>
</template>

<script>
import {Line} from 'vue-chartjs'
import weatherChart from './weatherChart'

var axios = require('axios')
var cheerio = require('cheerio');

export default {
  extends: Line,
  components:{
    weatherChart
  },
  data() {
    return {
      number : '',
      temperature : [],
      weather: [],
      time : [],
    }
  },
  computed: {
    getData: function(){
      axios.get('https://search.naver.com/search.naver?sm=top_hty&fbm=1&ie=utf8&query=%EB%82%A0%EC%94%A8')
      .then(res => {
        var $ = cheerio.load(res.data)
        var number = $("#main_pack > div.sc.cs_weather._weather > div:nth-child(2) > div.weather_box > div.weather_area._mainArea > div.today_area._mainTabContent > div.table_info.bytime._todayWeatherByTime > div.info_list.weather_condition._tabContent > ul > li").length
        this.number = number


        for(var i=1; i<=number; i++){
          this.temperature.push($("#main_pack > div.sc.cs_weather._weather > div:nth-child(2) > div.weather_box > div.weather_area._mainArea > div.today_area._mainTabContent > div.table_info.bytime._todayWeatherByTime > div.info_list.weather_condition._tabContent > ul > li:nth-child("+i+") > dl > dd.weather_item._dotWrapper > span:nth-child(1)").text())
        }
        for(var i=1; i<=number; i++){
          this.weather.push($("#main_pack > div.sc.cs_weather._weather > div:nth-child(2) > div.weather_box > div.weather_area._mainArea > div.today_area._mainTabContent > div.table_info.bytime._todayWeatherByTime > div.info_list.weather_condition._tabContent > ul > li:nth-child("+i+") > dl > dd.item_condition > span").text())
        }
        for(var i=1; i<=number; i++){
          this.time.push($("#main_pack > div.sc.cs_weather._weather > div:nth-child(2) > div.weather_box > div.weather_area._mainArea > div.today_area._mainTabContent > div.table_info.bytime._todayWeatherByTime > div.info_list.weather_condition._tabContent > ul > li:nth-child("+i+") > dl > dd.item_time > span").text())
        }
      })
    }
  },
  mounted(){
    this.getData
  }
}
</script>

<style scoped>
  .detail{
    display: flex;
    flex-direction: row;
  }
  .temperature, .weather, .time{
    width: 12.5%;
    padding-top: 20px;
  }
</style>
// weatherChart.vue

<script>
import {Line} from 'vue-chartjs'

export default {
  extends: Line,
  props:{
    'text':Array,
    'number':Array
  },
  data() {
    return {
      temperature: [],
      time: [],
      numbers: '',

      datacollection: {
        labels: this.text,
        datasets: [
          {
            label: '온도',
            data: this.number
          }
        ]
      },
      options: {
        legend:{
          display:true
        }
      }
    }
  },
  mounted(){
    this.renderChart(this.datacollection, this.options)
  }
}
</script>

<style scoped>
</style>