在Vue3中处理异步API调用并更新表单数据的方法示例

 更新时间:2024年06月20日 09:41:47   作者:码农研究僧  
这篇文章主要介绍了如何在Vue3中处理异步API调用并更新表单数据(附Demo),文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

前言

从实战问题中剖析知识点

1. 问题所示

执行Vue3数据的时候,终端输出的data如下所示

Promise {<pending>}
[[Prototype]] :  Promise
[[PromiseState]] :  "fulfilled"
[[PromiseResult]] :  Array(13)

截图如下所示:

2. 知识分析

输出的数据是JavaScript的Promise对象的

对于这个数据基本的数据分析如下:

  • Promise {<pending>}:Promise对象的初始状态,处于等待状态
  • [[Prototype]]: Promise:对象的原型链,通过Promise构造函数创建的
  • [[PromiseState]]: "fulfilled":Promise对象的内部状态,已经成功完成
  • [[PromiseResult]]: Array(13):对象的结果

对于Promise的状态有如下:

  • Pending(待定):Promise刚创建时的初始状态
  • Fulfilled(成功):操作成功完成,Promise有了结果
  • Rejected(失败):操作失败,Promise有了失败的原因

Promise的结果:当Promise状态变为fulfilled时,会有一个对应的结果值,这里是一个包含13个元素的数组

正确处理Promise的结果,例如使用.then().catch()方法

比如查看输出内容:

myPromise.then(result => console.log(result));

做适当的错误处理:

myPromise
    .then(result => {
        console.log(result);
    })
    .catch(error => {
        console.error('Error:', error);
    });

给个示例Demo:

function fetchData() {
    return new Promise((resolve, reject) => {
        // 模拟异步操作
        setTimeout(() => {
            const data = Array(13).fill('example data');
            resolve(data);
        }, 1000);
    });
}

// 使用Promise
fetchData()
    .then(result => {
        console.log('Promise fulfilled with result:', result);
    })
    .catch(error => {
        console.error('Promise rejected with error:', error);
    });

3. 实战

通过实战理解更加透彻

const handleAdd = () => {
  if (props.formType === 'detail') return // 禁用“添加危险品”按钮
  const row = {
    id: undefined,
    shipName: undefined,
    voyage: undefined,
    billNumber: undefined,
    boxNumber: undefined,
    boxSize: undefined,
    boxType: undefined,
    productName: undefined,
    hazardousLevel: undefined,
    hazardCode: undefined,
    isOpentopOrHigh: undefined,
    appointmentId: undefined,
  }
  row.appointmentId = props.appointmentId
  const data =  AppointmentCommissionApi.getEnterSiteListByAppointmentId(props.appointmentId)
  console.log(data)
  // 确保 data 是数组并赋值给 formData.value.list
  const fetchedData = Array.isArray(data) ? data : [];
  formData.value.list = [...formData.value.list, ...fetchedData];
  formData.value.list.push(row) // 添加新条目到列表中
  console.log('Updated list:', formData.value.list);
}

其中data输出问题所示的内容,那么处理此类问题有如下两种方式

  • 使用Promise的.then()方法来处理异步API调用的结果
const handleAdd = () => {
  if (props.formType === 'detail') return // 禁用按钮
  const row = {
    id: undefined,
    shipName: undefined,
    voyage: undefined,
    billNumber: undefined,
    boxNumber: undefined,
    boxSize: undefined,
    boxType: undefined,
    productName: undefined,
    hazardousLevel: undefined,
    hazardCode: undefined,
    isOpentopOrHigh: undefined,
    appointmentId: undefined,
  }
  row.appointmentId = props.appointmentId

  // 调用API并处理结果
  AppointmentCommissionApi.getEnterSiteListByAppointmentId(props.appointmentId)
    .then(data => {
      // 确保 data 是数组并赋值给 formData.value.list
      const fetchedData = Array.isArray(data) ? data : [];
      formData.value.list = [...formData.value.list, ...fetchedData];
      formData.value.list.push(row); // 添加新条目到列表中
      console.log('Updated list:', formData.value.list);
    })
    .catch(error => {
      console.error('Error fetching data:', error);
    });
}
  • 另一种更现代和清晰的方法是使用async/await
const handleAdd = async () => {
  if (props.formType === 'detail') return // 禁用按钮
  const row = {
    id: undefined,
    shipName: undefined,
    voyage: undefined,
    billNumber: undefined,
    boxNumber: undefined,
    boxSize: undefined,
    boxType: undefined,
    productName: undefined,
    hazardousLevel: undefined,
    hazardCode: undefined,
    isOpentopOrHigh: undefined,
    appointmentId: undefined,
  }
  row.appointmentId = props.appointmentId

  try {
    // 调用API并等待结果
    const data = await AppointmentCommissionApi.getEnterSiteListByAppointmentId(props.appointmentId);
    
    // 确保 data 是数组并赋值给 formData.value.list
    const fetchedData = Array.isArray(data) ? data : [];
    formData.value.list = [...formData.value.list, ...fetchedData];
    formData.value.list.push(row); // 添加新条目到列表中
    console.log('Updated list:', formData.value.list);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}

以上就是在Vue3中处理异步API调用并更新表单数据的方法示例的详细内容,更多关于Vue3处理异步API并更新数据的资料请关注脚本之家其它相关文章!

相关文章

  • VUE在for循环里面根据内容值动态的加入class值的方法

    VUE在for循环里面根据内容值动态的加入class值的方法

    这篇文章主要介绍了VUE在for循环里面根据内容值动态的加入class值的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • vue+webpack实现异步组件加载的方法

    vue+webpack实现异步组件加载的方法

    下面小编就为大家分享一篇vue+webpack实现异步组件加载的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)

    Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)

    在Vue的框架开发的项目过程中,经常会用到组件来管理不同的功能,有一些公共的组件会被提取出来。下面通过本文给大家介绍Vue开发中常用的三种传值方式父传子、子传父、非父子组件传值,需要的朋友参考下吧
    2018-08-08
  • 详解Vue中AXIOS的封装

    详解Vue中AXIOS的封装

    这篇文章主要为大家介绍了Vue中AXIOS的封装,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 关于vue.extend的使用及说明

    关于vue.extend的使用及说明

    这篇文章主要介绍了关于vue.extend的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • vue如何解决el-select下拉框显示ID不显示label问题

    vue如何解决el-select下拉框显示ID不显示label问题

    这篇文章主要介绍了vue如何解决el-select下拉框显示ID不显示label问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Vue ELement Table技巧表格业务需求实战示例

    Vue ELement Table技巧表格业务需求实战示例

    这篇文章主要介绍了Vue ELement Table技巧表格业务需求实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Vue插件之滑动验证码

    Vue插件之滑动验证码

    这篇文章主要为大家详细绍介绍了Vue插件之滑动验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • vue实现将数据存入vuex中以及从vuex中取出数据

    vue实现将数据存入vuex中以及从vuex中取出数据

    今天小编就为大家分享一篇vue实现将数据存入vuex中以及从vuex中取出数据,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vue.js中created方法作用

    vue.js中created方法作用

    这篇文章主要介绍了vue.js中created方法作用及mounted和created的区别介绍,需要的朋友可以参考下
    2018-03-03

最新评论