前端联调时addressId要怎么获得

前端联调时addressId要怎么获得

从router.params.id里面自带参数获得是shopId,下订单还需要前端这边addressId要从哪里获取呢?

还有收获地址数据也是,后端接口虽然做好了,但是前端要获得addressId怎么实现还是没有思路。

https://img1.sycdn.imooc.com//climg/616fd273097fe14a09860044.jpg

https://img1.sycdn.imooc.com//climg/616fd21c0918f70910001000.jpg

正在回答

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

1回答

同学你好,解答如下:

1、下单时,前端需要往后端发送ajax,可以把addressId拼接到url地址上,从而传给后端(后端就能对应获取到了),例如:

https://img1.sycdn.imooc.com//climg/616fdbe50991438708100299.jpg

此时前端需要先获取到该订单对应的addressId,可以通过如下思路实现:

a、使用默认地址提交订单:

正常来讲,如下地址信息(“默认地址”)应该是接口返回的;接口返回的数据中有addressId:

https://img1.sycdn.imooc.com//climg/616fdc7809344d2206520229.jpg

跳转到该页面时,就要把默认地址数据请求回来。请求完成,可以把地址的addressId,直接保存到本地缓存中;提交订单时,从本地缓存中,获取addressId,然后拼接到接口的url地址上即可:

https://img1.sycdn.imooc.com//climg/616fddd109b0622806160732.jpg

b、如果是从地址列表页面选择某一个地址:

https://img1.sycdn.imooc.com//climg/616fde4e0951d59110000346.jpg

可以通过如下思路实现:

渲染地址列表页面时,将每一个地址的addressId传给点击事件,然后在点击事件中获取addressId

https://img1.sycdn.imooc.com//climg/616fe04909bf902110000750.jpg

https://img1.sycdn.imooc.com//climg/616fe05b093865e706550474.jpg

获取到addressId后,可以保存到本地缓存中。点击“提交订单”按钮时,依旧从本地缓存中获取,然后拼接到接口的url地址上即可。

2、后端在对应的请求中,获取addressId即可,例如:

https://img1.sycdn.imooc.com//climg/616fe0ca0959cbb410000317.jpg

https://img1.sycdn.imooc.com//climg/616fe0f70963674b09360258.jpg

https://img1.sycdn.imooc.com//climg/616fe1120900ab0f04690131.jpg

祝学习愉快!

  • PADAopanda 提问者 #1

    老师,我想用/api/address的接口先获取整个addressList,然后用数组里面第一个元素作为默认地址,然后将addressId先设定为第一个元素的_id。

    然后将addressId用于获取第二次的接口/api/address/:addressId。但是我测试下来addressId返回的都是空,请问是哪里出错了?

    还有addressId是该用响应式赋值ref吗?还是直接用空字符串赋值var addressId = ''?这里感觉前端学的时候不是很扎实,漏洞很多。

    https://img1.sycdn.imooc.com//climg/6170bda00989161107500780.jpg

    <template>
    <div class="top">
    <div class="top__header">
    <Back class="top__header__back" iconColor="#FFFFFF" />
    <p>确认订单</p>
    </div>
    <div class="top__receiver">
    <div class="top__receiver__title">收货地址</div>
    <div class="top__receiver__address">
    上海
    </div>
    <div class="top__receiver__info">
    <span class="top__receiver__info__name">大神</span>
    <span class="top__receiver__info__phone">13800138000</span>
    </div>
    <div class="top__receiver__icon iconfont">&#xe609;</div>
    </div>
    </div>
    </template>
    
    <script>
    import { ref, reactive, toRefs } from 'vue';
    import { get } from '../../utils/request';
    import Back from '../../components/Back.vue';
    
    const useAddressListEffect = () => {
      const addressId = ref('')
      const getAddressList = async () => {
        const result = await get('/api/address');
        // console.log(result.data);
        if (result?.errno === 0 && result?.data?.length) {
          result.data.forEach((item, index) => {
            if (index === 0) {
              addressId.value = item._id;
            }
          });
        }
      };
      console.log(addressId.value);
      return { addressId, getAddressList };
    };
    
    const useAddressEffect = addressId => {
      const data = reactive({ address: {} });
      const getAddress = async () => {
        console.log(`/api/address/${addressId.value}`);
        const result = await get(`/api/address/${addressId.value}`);
        console.log(result.data);
        if (result?.errno === 0 && result?.data?.length) {
          data.address = result.data;
        }
      };
      const { address } = toRefs(data);
      return { getAddress, address };
    };
    
    export default {
    name: 'OrderConfirm',
    components: { Back },
    setup() {
        const { addressId, getAddressList } = useAddressListEffect();
        getAddressList();
        const { getAddress, address } = useAddressEffect(addressId);
        getAddress();
        return { address };
      }
    };
    </script>
    
    <style lang="scss" scoped>
    @import '../../style/variables.scss';
    @import '../../style/mixins.scss';
    .top {
    position: relative;
    background-image: linear-gradient(0deg, rgba(0, 145, 255, 0) 4%, #4da5e8 50%);
    &__header {
    height: 0.685rem;
    text-align: center;
    margin: 0 0.18rem;
    position: relative;
    padding-top: 0.26rem;
    &__back {
    position: absolute;
    top: 50%;
    transform: translate(0, -50%);
    width: 0.2rem;
    height: 0.3rem;
    }
    p {
    font-family: PingFangSC-Regular;
    font-size: 0.16rem;
    color: $white-bgColor;
    }
    }
    &__receiver {
    margin: 0 0.18rem;
    padding: 0.16rem 0.4rem 0.16rem 0.16rem;
    background: $white-bgColor;
    border-radius: 0.04rem;
    position: relative;
    &__title {
    font-family: PingFangSC-Medium;
    font-size: 0.16rem;
    line-height: 0.22rem;
    color: $content-fontcolor;
    margin-bottom: 0.14rem;
    }
    &__address {
    font-family: PingFangSC-Regular;
    font-size: 0.14rem;
    line-height: 0.2rem;
    color: $content-fontcolor;
    margin-bottom: 0.06rem;
    @include ellipsis;
    }
    &__info {
    font-family: PingFangSC-Regular;
    font-size: 0.12rem;
    line-height: 0.17rem;
    color: $medium-fontColor;
    span {
    margin-right: 0.1rem;
    }
    }
    &__icon {
    color: $medium-fontColor;
    position: absolute;
    right: 0.16rem;
    top: 50%;
    transform: translate(0, -50%);
    }
    }
    }
    </style>


    2021-10-21 09:10:25
  • 好帮手慕久久 回复 提问者 PADAopanda #2

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

    1、由于老师没有同学的接口,无法获取到数据,因此没办法提供具体的解答,只能简单模拟一下同学的操作,看如下描述能否给同学带来帮助。

    模拟代码如下:

    https://img1.sycdn.imooc.com//climg/6170e23d091db8d807550599.jpg

    https://img1.sycdn.imooc.com//climg/6170e26509428cd409040752.jpg

    运行结果如下:

    https://img1.sycdn.imooc.com//climg/6170e2920946073711870208.jpg

    其中第一行打印是空,应该就对应着同学如下位置:

    https://img1.sycdn.imooc.com//climg/6170e2af092d6f9f05860288.jpg

    原因是请求数据的过程是异步的, console.log(addressId.value)这句代码执行时,数据并没有请求回来,所以打印是空:

    https://img1.sycdn.imooc.com//climg/6170e30809f523ca08130484.jpg

    老师这里,第二行打印是能获取到addressId的:

    https://img1.sycdn.imooc.com//climg/6170e32b093a8d4b06670187.jpg

    同学参考上面描述,再调试一下自己的代码。

    2、如果数据需要联动(只要某个方法中改变了数据,数据就要同步更新),那么建议使用响应式的数据,因此addressId要用ref包裹。

    祝学习愉快!

    2021-10-21 11:54:13
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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