Вычисляемое свойство не получает данные правильно Vue. js, - PullRequest
0 голосов
/ 06 августа 2020

Привет, у меня проблема с моим вычисленным свойством.

В первую очередь я получаю данные из моего ruby API рельсов, все идет хорошо, теперь я фильтрую эти данные на основе их id, я делаю это в своем вычисляемом свойстве, но если я консоль записываю его, он просто дает мне undefined, я не могу получить доступ, например, к filteredRecords[0].id, потому что он просто пуст, однако , я могу l oop через этот массив и дает мне правильные данные. Я думаю, что это связано со временем, я получаю данные в моем разделе created(){}, фильтрация тоже выполняется, но я просто не могу получить доступ к данным напрямую, вот когда мне нужна ваша помощь.

Вот как сейчас выглядит мой код (я выделяю важные моменты стрелкой):

<template>
  <body>
    <div
      class="container uppercase text-xl font-mono pl-4 font-semibold no-underline text-indigo-dark hover:text-indigo-darker "
    >
      <table>
        
        <tbody>
          <tr class="priority-200 ">
            <td id="writeDay" class="default ">{{ createdDate }}</td>
            <td id="hour" class="default pl-16">
              {{ createdHours }}
            </td>
            <td
             
              id="degree"
              class="defaulted  white--text
            "
              v-show="filteredDatas && filteredDatas[0].temperature"
            >
              {{ filteredDatas[0].temperature }} °C
            </td>
            <td
              
              id="speed"
              class="defaulted"
              v-show="filteredDatas && filteredDatas[0].windspeed"
            >
              {{ filteredDatas[0].windspeed }} km/h
            </td>
          </tr>
        </tbody>
      </table>
-----------------------------------------------------THIS H1, i can loop through my records without problem-----------------------------------------
      <h1
        v-for="(record, index) of filteredRecords"
        :key="index"
        :record="record"
      >
        <div :class="getClass(record)">
          <strong
            v-show="
              record.path === 'rightoleft' &&
                currentlyActive &&
                record.id == currentlyActive.id
            "
            >{{ record.description }}
          </strong>
         
        </div>
      </h1>
-----------------------------------------------------------------------------

    </div>
  </body>
</template>

<script>
import { mapGetters } from "vuex";
import moment from "moment";
export default {
  name: "Table",
  data() {
    return {
      templates: [],
      records: [],
      activeSpan: 0,
      datas: [],
      currentlyActive: null,
    
     
     
    };
  },
  mounted() {
    
    this.start();
    
 
  },

  computed: {
    ...mapGetters({
      id: "id",
      dataId: "dataId"
    }),

    createdDate() {
      return moment().format("DD-MM-YYYY ");
    },
    createdHours() {
      return moment().format("HH:mm ");
    },
-----------------------------------------------THATS HOW I FILTER THROUGH MY RECORDS ARRAY WHAT WAS GIVEN FROM AN API

    filteredRecords: function() {
      let localId = this.id;
      let filtered = this.records.filter(record => {
        return record.template_id == localId;
      });
   
      console.log(filtered);
    
      this.anyad = filtered;
      return filtered;
    },

--------------------------------------------------------------------------  
  filteredDatas: function() {
      let localId2 = this.dataId;
      let filtered2 = this.datas.filter(data => {
        return data.id == localId2;
      });
   
      return filtered2;
    }
  },
  methods: {


 
    getClass(record) {
      return {
        rightoleft: record.path === "rightToleft",
       
      };
    },
         ------------------------------------------------------
    start() {
    
      this.currentlyActive = this.filteredRecords[0];    -----> I CANNOT GET THIS ONE ITS GIVING ME NOTHING HELP ------------------------------
      if (!this.currentlyActive) return;
      setTimeout(() => {
        this.nextRecord();
      }, this.currentlyActive.time * 1000);
    },
    nextRecord() {
      let currIndex = this.filteredRecords.findIndex(
        f => f === this.currentlyActive
      );
      if (currIndex === this.filteredRecords.length - 1) {
    
        this.currentlyActive = this.filteredRecords[0];
      } else {
        this.currentlyActive = this.filteredRecords[currIndex + 1];
      }

      setTimeout(() => {
        this.nextRecord();
      }, this.currentlyActive.time * 1000);
    }
     ----------------------------------------------------------------
  },

  created() {
  
    if (!localStorage.signedIn) {
      this.$router.replace("/");
    } else {
      this.$http.secured
        .get("/api/v1/records")
        .then(response => {
          console.log(response.data);
          this.records.splice(0, this.records.length - 1, ...response.data);
        })
        .catch(error => this.setError(error, "Something went wrong"));
      this.$http.secured
        .get("/api/v1/templates")
        .then(response => {
          this.templates = response.data;
        })
        .catch(error => this.setError(error, "Something went wrong"));
      this.$http.secured
        .get("/api/v1/data")
        .then(response => {
          this.datas = response.data;
        })
        .catch(error => this.setError(error, "Something went wrong"));
    }
  }

};
</script>


 <style>

.rightoleft {
  margin-top: 100px;
  color: yellow;
  width: 1000px;
  height: 1000px;
  animation: move 20s linear infinite;
}


@keyframes move {
  0% {
    transform: translate(50px);
    opacity: 1;
  }
  90% {
    transform: translate(800px);
    opacity: 1;
  }

  92% {
    transform: translate(800px);
    opacity: 0;
  }
  94% {
    transform: translate(800px);
    opacity: 1;
  }
  96% {
    transform: translate(800px);
    opacity: 0;
  }
  98% {
    transform: translate(800px);
    opacity: 1;
  }
  /* 60% {
    transform: translate(500px);
    opacity: 1;
  } */

  100% {
    opacity: 1;
    transform: translate(50px);
  }
}
</style>

ЖЕЛАТЕЛЬНЫЙ ВЫХОД: https://codesandbox.io/s/blue-sun-sm8tl?file= / src / components / HelloWorld. vue

Это точно , как я хочу выводить, как в песочнице, в песочнице он работает, потому что я даю ему вручную записи, чтобы он мог найти, например, отфильтрованные записи [0] .id

Не могли бы вы мне помочь с этим ?? что я должен делать ? Стоит ли копировать эту штуку в другой массив? если да, то как мне это сделать, потому что v-for работает, но доступа к нему нет.

Спасибо.

1 Ответ

1 голос
/ 06 августа 2020

В смонтированном хуке эти данные еще не доступны, потому что эти данные получены асинхронным способом, чтобы справиться с этим поведением, я предлагаю использовать свойство watch вместо установленного хука:

watch:{
  filteredRecords:{
    handler(newVal,oldVal){
    if(newVal.length>0 && newVal.length!==oldVal.length){
      this.start()
     }
   },
  deep:true

  }
}

...