Vue предупреждает о необработанной ошибке при выполнении функции визуализации, сбросе планировщика и блокировке прокрутки при нарушении

#javascript #vue.js #vuejs3

#язык JavaScript #vue.js #vuejs3

Вопрос:

Я попытался выяснить, что происходит с этой конкретной страницей, поскольку каждый раз, когда я ее загружаю, я получаю список предупреждений и сообщение об ошибке

 [Vue warn]: Unhandled error during execution of render function   at lt;MovieDetails id="5" onVnodeUnmounted=fnlt;onVnodeUnmountedgt; ref=Reflt; undefined gt; gt;   at lt;RouterViewgt;   at lt;Appgt;   [Vue warn]: Unhandled error during execution of scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/vue-next   at lt;MovieDetails id="5" onVnodeUnmounted=fnlt;onVnodeUnmountedgt; ref=Reflt; undefined gt; gt;   at lt;RouterViewgt;   at lt;Appgt;  Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'rating')  at Proxy.render (MovieDetails.vue?e6ee:14)  at renderComponentRoot (runtime-core.esm-bundler.js?5c40:444)  at ReactiveEffect.componentUpdateFn [as fn] (runtime-core.esm-bundler.js?5c40:4211)  at ReactiveEffect.run (reactivity.esm-bundler.js?a1e9:160)  at setupRenderEffect (runtime-core.esm-bundler.js?5c40:4337)  at mountComponent (runtime-core.esm-bundler.js?5c40:4120)  at processComponent (runtime-core.esm-bundler.js?5c40:4078)  at patch (runtime-core.esm-bundler.js?5c40:3673)  at ReactiveEffect.componentUpdateFn [as fn] (runtime-core.esm-bundler.js?5c40:4288)  at ReactiveEffect.run (reactivity.esm-bundler.js?a1e9:160)  5[Violation] Added non-passive event listener to a scroll-blocking lt;somegt; event. Consider marking event handler as 'passive' to make the page more responsive. See lt;URLgt;  [Violation] 'setTimeout' handler took 96ms www-embed-player.js:575   

Все они действительно не имеют для меня никакого смысла, кроме неучтенного (в обещании), и даже в этом я очень не уверен, потому что при загрузке страницы (рейтинг, в котором говорится, что она не может читать, отображается так, как должно). Может ли кто-нибудь сказать мне, что означает это предупреждение и есть ли способ их исправить? Это единственная страница моего проекта, на которой есть эта проблема. Я также оставлю здесь свое мнение, и если кто-нибудь сможет объяснить мне, почему рейтинг выдает ошибку, несмотря на то, что она отображается правильно, это было бы здорово!

 lt;templategt;  lt;div class="movie-details"gt;  lt;div class="route"gt;  lt;h3gt;  lt;router-link to="/movies"gt;  lt;spangt;Movieslt;/spangt;  lt;/router-linkgt;  amp;emsp;/amp;emsp;{{ movie.title }}  lt;/h3gt;  lt;/divgt;   lt;div class="flex row"gt;  lt;h1gt;{{ movie.title }} lt;span class="subtitle"gt;({{ moment(movie.releaseDate).format("YYYY") }})lt;/spangt;lt;/h1gt;  lt;Button title="Edit" @btn-click="editMovie(this.id)" /gt;  lt;/divgt;   lt;div class="flex flex-info info"gt;  lt;span class="details"gt;{{ movie.rating.rating }}lt;/spangt; |  lt;span class="details"gt;{{ movie.movieLength }}lt;/spangt; |  lt;span class="details"gt;{{ movie.genre.genre }}lt;/spangt; |  lt;span class="details"gt;{{ moment(movie.releaseDate).format("D MMMM YYYY") }}lt;/spangt;  lt;/divgt;    lt;div class="youtube"gt;  lt;iframe width="640" height="360" :src="videoEmbed" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreengt;lt;/iframegt;  lt;/divgt;   lt;div class="cast-crew grid"gt;  lt;div class="director"gt;  lt;h2gt;Directed By:lt;/h2gt;    lt;router-link :to="{name: 'DirectorDetails', params: {id: movie.director.id }}"gt;  lt;ListItemgt;  {{ movie.director.firstName }} {{ movie.director.lastName }}  lt;/ListItemgt;  lt;/router-linkgt;  lt;/divgt;  lt;aside class="cast"gt;  lt;h2gt;Actors:lt;/h2gt;  lt;div class="actors grid"gt;  lt;div :key="actor.id" class="actor" v-for="actor in movie.actors"gt;  lt;router-link :to="{name: 'ActorDetails', params: {id: actor.id}}"gt;  lt;ListItemgt;  {{ actor.firstName }} {{ actor.lastName }}  lt;/ListItemgt;  lt;/router-linkgt;  lt;/divgt;  lt;/divgt;  lt;/asidegt;  lt;/divgt;  lt;/divgt; lt;/templategt;  lt;scriptgt;  import moment from "moment";  import Button from "@/components/Button.vue";  import ListItem from "@/components/ListItem.vue";   export default {  components: {  Button,  ListItem,  },  props: [  "id"  ],  data() {  return {  movie: {},  moment,  videoEmbed: "https://www.youtube.com/embed/"  };  },  methods: {  editMovie(id) {  this.$router.push({name: "EditMovie", params: { id: id }});  },  async fetchMovie(id) {  const res = await fetch(`api/movies/${id}`);  const data = await res.json();   return data;  }  },  async created() {  this.movie = await this.fetchMovie(this.id);    //eslint-disable-next-line  const reg = new RegExp('.*?=s*(.*)');  const split = reg.exec(this.movie.trailerUrl);  this.videoEmbed  = split[1];  }  } lt;/scriptgt;  lt;style scopedgt;  h1 {  font-weight: bold;  }   .subtitle {  font-weight: 400;  font-size: 1rem;  }   .info {  font-weight: 300;  letter-spacing: 1px;  }   .details {  margin: 0 0.8rem;  }   .details:first-child {  margin-left: 0;  }   .details:last-child {  margin-right: 0;  }   .youtube {  margin: 1.5rem 0;  display: flex;  }   .youtube iframe {  justify-self: flex-start;  border-radius: 8px;  }   .cast-crew {  height: 110%;  }   .cast-crew.grid {  grid-template-columns: auto 75%;  }   .cast-crew a {  font-weight: bold;  font-size: 1.125rem;  }   .director {  align-self: flex-start;  text-align: left;  }   .cast {  padding-left: 1.5rem;  text-align: left;  border-left: 2px solid #000;  align-self: flex-start;  }   .actors.grid {  grid-template-rows: repeat(4, 1fr);  grid-template-columns: auto;  gap: 0.75rem;  grid-auto-flow: column;  justify-content: flex-start;  } lt;/stylegt;  

Ответ №1:

Используйте метод lodash get для исправления неопределенной ошибки

  lt;scriptgt; import _ from 'lodash'; export default { methods: {  getValue(object, string, defaultValue = ''): {  return _.get(object, string, defaultValue)  } } lt;/scriptgt; lt;templategt;  {{ getValue(movie, 'rating.rating') }} lt;/templategt;   

вы можете сделать его глобальным помощником для последующего использования в шаблоне