关于如何得到addressId

关于如何得到addressId

相关代码:

    const addressId=ref('')
const getAddressList = async () => {
const index=0
try {
const result = await get("api/user/address");
if (result.errno == 0 && result?.data?.length) {
addressId.value = result.data[index]._id
}
} catch (e) {
console.log(e)
}
};
watchEffect(()=>{
getAddressList();
})

这样得到的addressId的结果是正确的。但是,我按如何代码写,为什么就不行呢?

    const addressList=ref([])    
const getAddressList = async () => {
const index=0
try {
const result = await get("api/user/address");
if (result.errno == 0 && result?.data?.length) {
addressList.value=result.data
}
} catch (e) {
console.log(e)
}
};
watchEffect(()=>{
getAddressList();
})
const addressId=addressList.value[0]._id;

先得到整个接口数据,然后再取它的一个值,这样为什么就不行呢?为什么Console窗口显示 addressList是undefined呢?在渲染页面时不是可以调用这样得到的接口数据吗?是因为需要经过setup函数return后才可以使用吗?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕星星 2021-04-11 15:25:33

同学你好,问题解答如下:

1、获取数据是异步操作,需要等获取到数据才可以获取其中的_id,否则为undefined,如下

http://img1.sycdn.imooc.com//climg/60728fef09458eb207540481.jpg

http://img1.sycdn.imooc.com//climg/60728ff6090e92ec01070035.jpg

2、如果想使用全局数据,可以用app.config.globalProperties来设置,例如在main.js中定义

http://img1.sycdn.imooc.com//climg/6072a36509fdc4e310960827.jpg

这里老师将数据放在属性上了,如果想写函数也可以,方法中再返回数据即可。

然后在组件中使用数据

http://img1.sycdn.imooc.com//climg/6072a3f9091f95b407200450.jpg

记得要在获取数据外层加定时器,因为get数据是异步的,使用的时候也异步避免获取不到,自己试着写一写。

3、不知道同学粘贴这段代码什么意思?老师不太明白,可以描述具体一些,便于帮助解决

http://img1.sycdn.imooc.com//climg/6072a45009b5eb9706770226.jpg


祝学习愉快!

好帮手慕久久 2021-04-10 16:06:42

同学你好,解答如下:

1、按照第二种写法,控制台能够获取到addressList,不是undefined:

http://img1.sycdn.imooc.com//climg/607152fe090f78c407780582.jpg

http://img1.sycdn.imooc.com//climg/607153130951fc5106580863.jpg

同学再检查一下自己的代码,看哪里不对。

2、由于addressList这个变量使用了ref包裹,所以addressList是一个响应式数据;将其在return中返回后,才能在页面上使用它:

http://img1.sycdn.imooc.com//climg/607153b609e0aa7707890623.jpg

http://img1.sycdn.imooc.com//climg/607153bc09d84bb603720124.jpg

http://img1.sycdn.imooc.com//climg/607153c309e13c0e05730248.jpg

如果想获取第一个数据的id,则可以如下这样写:

http://img1.sycdn.imooc.com//climg/6071570509d2f8b106910144.jpg

3、ref是用来将基础数据转成响应式的,数组不属于基础数据,所以如下写法不合理:

http://img1.sycdn.imooc.com//climg/60715849097beff405360103.jpg

最好如下这样写:

http://img1.sycdn.imooc.com//climg/60715b3709e838dd07600654.jpg

http://img1.sycdn.imooc.com//climg/60715b4f09a4f9b005280113.jpg

4、如果想直接使用addressId这个变量,最好按照方式1来写。要将addressId设置成一个响应式数据,这样更改它之后,才能映射到页面上:

http://img1.sycdn.imooc.com//climg/60715bfe095fb05800000000.jpg

http://img1.sycdn.imooc.com//climg/60715c1509d8903905960122.jpg

祝学习愉快!​


  • 提问者 慕妹8003063 #1

    感谢老师的回答。但是,我想知道,虽然addressList可以获取到,为什么

    const addressId=addressList.value[0]._id;

    会提示: Uncaught (in promise) TypeError: Cannot read property '_id' of undefined。

    我不是想在页面渲染中用addressId,而是想在接下来的函数中用,如下。

    我不想使用第一种方式,即从接口数据直接得到addressId,因为有好几个页面需要从这个接口提取数据,但是用到的具体值不同,有的要用整体的addressList,有的只要里面的用户名,有的只要里面的addressId,因此,我想写一个通用的获取接口数据的事件函数,然后让各个页面来调用,而不是重复提取数据,因此想在通用函数里得到整体的addressList,然后调用的函数再通过addressList来得到里面的具体值。但是,却没能成功,我想知道如何来实现。

    const handleConfirmPay = async (isCanceled) => {
    const purchases = [];
    const purchaseList=caculations.value.purchaseList
    for (let key in purchaseList) {
    const goods = purchaseList[key];
    purchases.push({ id: goods._id , num: goods.count });
    }
    try {
    const result = await post("/api/order", {
    addressId,
    shopId,
    shopName: caculations.value.shopName,
    isCanceled,
    goods:purchases
    });
    if (result?.errno === 0) {
    router.push({ name: "Order" });
    store.commit("handleClearCart",{shopId}) ;
    } else {
    console.log(result)
    // showToast("create order fail");
    }
    } catch (e) {
    console.log(e)
    }
    };
    2021-04-11 01:02:25
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师