如何根据 axios 响应更新 vue 数据?

Posted

技术标签:

【中文标题】如何根据 axios 响应更新 vue 数据?【英文标题】:How do I update vue data based on axios response? 【发布时间】:2020-08-19 17:28:54 【问题描述】:

如何将axios中的数据放到vue js数据中:value: [parseInt(this.maintemp1),parseInt( this.maintemp2)], <--------Here is my problem

    export default 
  data: () => (
    maincity: "",
    maintemp1: "",
    maintemp2: "",
    maindate1: "",
    showLabels: true,
    lineWidth: 2,
    labelSize: 7,
    radius: 10,
    padding: 8,
    lineCap: "round",
    gradient: gradients[5],
    value: [parseInt(this.maintemp1),parseInt( this.maintemp2)], <--------Here is my problem
    gradientDirection: "top",
    gradients,
    fill: true,
    type: "trend",
    autoLineWidth: false
  ),
  mounted() 
    axios
      .get(
        "http://api.openweathermap.org/data/2.5/forecast?q=khiva&units=metric&appid=myapi"
      )
      .then(response => 
        this.wholeResponse = response.data.Search;
        this.maincity = response.data.city.name;
        this.maindate1 = response.data.list[1].dt_txt;
        this.maintemp1 = response.data.list[1].main.temp;
        this.maintemp2 = response.data.list[9].main.temp;
      )
      .catch(error => 
        console.log(error);
      );
  
;

【问题讨论】:

因为它依赖于其他数据属性,所以将value 设为computed 属性。 value: [parseInt(this.maintemp1),parseInt( this.maintemp2)], 不锁定函数,而是 data() 中的值 在答案中添加了代码更改示例 【参考方案1】:

发生这种情况是因为 data 选项值在调用 mounted 方法之前进行了评估。因此,当最初设置 value 时,maintemp1maintemp2 是空字符串。此外,value 不是此处的计算属性,因此它也不跟踪 maintemp1maintemp2 的更改。一种选择是在 axios .then() 方法中设置 value

所以,首先将value 设置为data 中的一个空数组,例如:

data: () => (
  ...
  value: [],
    ..
),

然后在mounted里面更新如下:

axios
  .get(
    "http://api.openweathermap.org/data/2.5/forecast?q=khiva&units=metric&appid=myapi"
  )
  .then(response => 
    this.wholeResponse = response.data.Search;
    this.maincity = response.data.city.name;
    this.maindate1 = response.data.list[1].dt_txt;
    this.maintemp1 = response.data.list[1].main.temp;
    this.maintemp2 = response.data.list[9].main.temp;

    this.value = [parseInt(this.maintemp1), parseInt( this.maintemp2)];
  )
  .catch(error => 
    console.log(error);
  );

【讨论】:

【参考方案2】:

您的value 是一个计算属性。 data 包含静态事物的列表,这些事物会随着时间的推移在您的组件中发生变化,但它们仍然只是值。如果您的属性动态依赖于其他属性,您应该将其放在computed 中,如下所示:

export default 
  data: () => (
    maincity: "",
    maintemp1: "",
    maintemp2: "",
    maindate1: "",
    showLabels: true,
    lineWidth: 2,
    labelSize: 7,
    radius: 10,
    padding: 8,
    lineCap: "round",
    gradient: gradients[5],
    gradientDirection: "top",
    gradients,
    fill: true,
    type: "trend",
    autoLineWidth: false
  ),
  computed: 
     value() 
       return [parseInt(this.maintemp1),parseInt( this.maintemp2)],
     
  ,
  mounted() 
    axios
      .get(
        "http://api.openweathermap.org/data/2.5/forecast?q=khiva&units=metric&appid=myapi"
      )
      .then(response => 
        this.wholeResponse = response.data.Search;
        this.maincity = response.data.city.name;
        this.maindate1 = response.data.list[1].dt_txt;
        this.maintemp1 = response.data.list[1].main.temp;
        this.maintemp2 = response.data.list[9].main.temp;
      )
      .catch(error => 
        console.log(error);
      );
  
;

【讨论】:

以上是关于如何根据 axios 响应更新 vue 数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据响应的错误代码返回自定义 axios 响应

Vue.js - 如何通过 axios 响应数据从对象中获取特定字段

如何对使用 Axios(或其他异步更新)的 Vue 组件进行单元测试?

Vue Axios 检索列表中对象的响应 ID

从控制器读取 json 响应到 Axios Catch 部分 - Laravel Vue Axios

如何使用 vue axios 在 laravel 中解决 401 未授权响应