在Vue中使用箭头函数无法获取gata

Posted

技术标签:

【中文标题】在Vue中使用箭头函数无法获取gata【英文标题】:Can't get gata using arrow function in Vue 【发布时间】:2021-01-02 12:52:44 【问题描述】:

我是 Vue 的新手,我的问题是:我无法从 API 获取数据到我的组件。 我有一个从我的 api 获取数据的服务类。 Api 工作正常。所以代码:

import IReview from "../types/Review"
import axios from "axios"

export default class ReviewService
    API_URL=process.env.VUE_APP_API_URL;
 
    public async getAllReviews(id: number): Promise<IReview[]>
        const result=await axios.get(`$this.API_URL/film/$id/reviews`);
        console.log(result.data, "This is ok, i see my data in console")
        return result.data;
    

谁想知道,我使用 filmId 从 API 获取电影评论。

得到结果很好Img

所以我得到的组件:

<template>
    <div class="ComentsField">
        <div class="ListOfComments">
            <div v-if="this.getReviewsCount()>0">
                <review :review="review"
                 v-for="review in ReviewsList" 
                 v-bind:key="review.id" 
                 v-bind:FilmId="FilmId">
                        review.Review
                </review>
            </div>
        </div>
        <hr>
        <div class="AddNewComment">
            Add
        </div>
    </div>
</template>

<script lang="ts">
import ReviewService from '@/services/review-service.ts'
import IReview from '@/types/Review.d.ts'
import  Vue from 'vue';
import Component from 'vue-class-component';
import Review from '@/components/Review.vue'

const reviewService=new ReviewService();
@Component(
    props: ['FilmId'],
 name: 'Reviews',
 components: Review
)
export default class Reviews extends Vue
    ReviewsList: IReview[]=[];
    getReviewsCount()
        return this.ReviewsList.length;
    
    getAllReviews()
        console.log(this.ReviewsList.length, "**IT gets me zero**")
        reviewService.getAllReviews(this.$props['FilmId']).then(data=>this.ReviewsList=data).catch(err=>console.error(err));
        console.log(this.ReviewsList, "1111111111s")//undef  BUT WHY i import data
        console.log(this.ReviewsList.length, "222222")//0 again
    
    created()
    
        this.getAllReviews();
    

</script>

<style lang="scss">

</style>

审查

export default interface IReview

    id:number,
    createdOn: Date,
    updatedOn:Date,
    Review: string,
    ReviewAuthor: string,

在控制台日志中我评论发生了什么。

当然,我将它推送到 github,你可以在这里找到(BackEnd .NET 5)。

GitHub

我不知道为什么会这样,并且很乐意提供任何帮助。

【问题讨论】:

将这两个console.log 移动到getAllReviews.then() 的回调中。例如:reviewService.getAllReviews(...).then((data) =&gt; console.log(this.ReviewsList)) 我不熟悉 TS,但除非我遗漏了与此相关的内容,否则您不应该直接修改 ReviewList 的值,而是通过突变和/的方式访问它或动作调度。 【参考方案1】:

您可以在文档中找到更多示例:

https://developer.mozilla.org/ru/docs/Web/javascript/Reference/Statements/async_function

对于 axios 来说: https://github.com/axios/axios#example

【讨论】:

嗨,我的 props 有错误,axios 工作正常,谢谢【参考方案2】:

我解决了 谁想知道我修复了我的复习课

  props: ["review", "FilmId"],

并在我的评论 v-for 中进行一些修复

<div class="ListOfComments">
  <div v-if="this.getReviewsCount()>0">
    <div v-for="review in ReviewsList" v-bind:key="review.id">
      Вошли в цикл
      <review :review="review" :FilmId="FilmId">
        Пытаемся писать ревью
        review.Review
      </review>
    </div>
  </div>
</div>

【讨论】:

【参考方案3】:

快速回答:您的 console.log 在 http 承诺实际解决之前执行。所以你打印出你的变量,但你还没有结果。

解决方案:将您的 console.log 移至 .then() 块中,或使用与您在服务中相同的方式使用 async/await

其他改进:将您的 getReviewsCount 转换为 computed。

【讨论】:

好的,我明天试试,然后回答 再次嗨,它没有帮助。我再次在我的 Review 组件中得到 undef 我想自从您批准我的回答后它就起作用了?此外,您应该将 then 语句包装到括号中,如下所示:.then(data=&gt;(this.ReviewsList=data))

以上是关于在Vue中使用箭头函数无法获取gata的主要内容,如果未能解决你的问题,请参考以下文章

Vue中匿名函数和箭头函数的this

箭头函数无法使用this的解决方法

vue模板内用箭头函数轻松的增加了第二参数吗?

vue箭头函数与普通函数

VUE学习笔记:25.脚手架vue-cli之箭头函数

Vue箭头函数