UNIAPP实战项目笔记47 显示默认收货地址和修改收货地址页面的布局

news2024/9/22 21:28:17

UNIAPP实战项目笔记47 显示默认收货地址和修改收货地址页面的布局

实际案例图片

  • 显示默认地址
    显示默认地址

  • 修改收货地址后
    修改后

  • 地址列表
    地址列表

显示默认地址页面

具体内容图片自己替换哈,随便找了个图片的做示例
具体位置见目录结构
完善布局页面和样式
用到了页面间传值 uni. o n u n i . on uni. onuni.off uni.$emit

代码 confirm-order.vue部分

confirm-order.vue 确认订单页面布局和渲染

<template>
    <view class="confirm-order bg-active-color">
        <Lines></Lines>
        
        <!-- 地址 -->
        <view class="order-map" @tap="goPathList">
            <block v-if="path">
                <view class="map-title">
                    <view class="map-name">收件人:{{path.name}}</view>
                    <view class="">{{path.tel}}</view>
                </view>
                <view class="map-add">
                    收货地址:{{path.city}} {{path.detail}}
                </view>
            </block>
            <block v-else>
                <view class="map-title">
                    <view class="map-name">请选择地址</view>
                </view>
            </block>
            
        </view>
        
        <!-- 商品 -->
        <view class="goods-list" v-for="(item,index) in 2">
                
            <view class="goods-content bg-active-color">
                <image class="goods-img" src="../../static/logo.png" mode=""></image>
                <view class="goods-text">
                    <view class="goods-name">
                        一大串文字介绍一大串文字介绍一大串文字介绍一大串文字介绍一大串文字介绍
                    </view>
                    <view class="goods-size f-color">
                        颜色分类:黑色
                    </view>
                    <view class="f-active-color">
                        7天无理由
                    </view>
                </view>
                <view class="">
                    <view class="">299.00
                    </view>
                    <view class="goods-size">
                        x 1
                    </view>
                </view>
            </view>
            
        </view>
    
        <!-- 底部:提交订单 -->
        <view class="order-foot">
            <view class="total-price">
                合计: <text class="f-active-color">$3999.00</text>
            </view>
            <view class="confirm">
                提交订单
            </view>
        </view>
    </view>
</template>

<script>
    import Lines from '@/components/common/Lines.vue'
    import {mapGetters} from 'vuex'
    export default {
        data() {
            return {
                path:false
            };
        },
        computed:{
            ...mapGetters(['defaultPath'])
        },
        onLoad() {
            // 如果默认地址的一个赋值
            if(this.defaultPath.length){
                this.path = this.defaultPath[0];
            }
            
            // 如果出发自定义事件,on去接收值
            uni.$on('selectPathItem',(res)=>{
                // console.log(res);
                this.path = res;
            })
        },
        onUnload() {
          uni.$off('selectPathItem',()=>{
              console.log('移除了selectPathItem');
          })  
        },
        components:{
            Lines
        },
        methods:{
            goPathList(){
                uni.navigateTo({
                    url:'/pages/my-path-list/my-path-list?type=selectedPath'
                })
            },
        }
    }
</script>

<style lang="less">
.confirm-order{
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 100%;
}
.order-map{
    margin-bottom: 10rpx;
    padding: 20rpx;
    background-color: #fff;
    line-height: 50rpx;
}
.map-title{
    display: flex;
    justify-content: space-between;
}
.map-name{
    font-weight: bold;
}
.goods-list{
    background-color: #fff;
    padding: 10rpx 0;
}

.goods-content{
    padding: 10rpx 20rpx;
    display: flex;
    justify-content: space-between;
    align-items: center;
}
.goods-text{
    width: 360rpx;
    padding: 0 10rpx;
    font-size: 26rpx;
}
.goods-img{
    width: 160rpx;
    height: 160rpx;
}
.goods-size{
    font-size: 24rpx;
}

.order-foot{
    width: 100%;
    height: 80rpx;
    position: fixed;
    bottom: 0;
    left: 0;
    background-color: #fff;
    display: flex;
    justify-content: flex-end;
    align-items: center;
}
.confirm{
    color: #fff;
    background-color: #49bdfb;
    padding: 10rpx 30rpx;
}
.total-price{
    padding: 0 20rpx;
}


</style>

my-path-list.vue 文件代码

地址列表

<template>
    <view class="my-path-list">
        <view class="path-list">
            <view  
                v-for="(item,index) in list" 
                :key="index"
                @tap="toAddPath(index)"
            >
            
                <view class="path-item" @tap="goConfirmOrder(item)" >
                    <view class="item-main">
                        <view class="item-name">
                            {{item.name}}
                        </view>
                        <view class="">
                            {{item.tel}}
                        </view>
                    </view>
                    <view class="item-main">
                        <view class="active" v-show="item.isDefault">
                            默认
                        </view>
                        <view class="">
                            {{item.city}} {{item.details}}
                        </view>
                    </view>
                </view>
            </view>
        </view>
        <view class="add-path">
            <view class="add-path-btn" @tap="goAddPath">
                新增地址
            </view>
        </view>
    </view>
</template>

<script>
    import {mapState} from 'vuex'
    export default {
        data() {
            return {
                isSelectedPath:false
            };
        },
        computed:{
            ...mapState({
                list:state=>state.path.list
            })
        },
        onLoad(e) {
            if (e.type === 'selectedPath') {
                this.isSelectedPath = true;
            }
        },
        methods:{
            // 修改
            toAddPath(index){
                let pathObj = JSON.stringify({
                    index:index,
                    item:this.list[index]
                });
                uni.navigateTo({
                    url:'../my-add-path/my-add-path?data='+pathObj
                })
            },
            // 新增
            goAddPath(){
                uni.navigateTo({
                    url:'../my-add-path/my-add-path'
                })
            },
            // 返回确认订单
            goConfirmOrder(item){
                // 如果是从确认订单过来的执行
                if(this.isSelectedPath){
                    // 自定义事件:页面通信
                    uni.$emit('selectPathItem',item);
                    // 返回上一页
                    uni.navigateBack();
                }
            }
        }
    }
</script>

<style lang="scss">
.add-path{
    padding: 20rpx 0;
    width: 100%;
    display: flex;
    justify-content: center;
}
.add-path-btn{
    border: 2rpx solid #49bdfb;
    color: #49bdfb;
    border-radius: 30rpx;
    padding: 6rpx 60rpx;
}
.path-list{
    padding: 0 20rpx;
}
.path-item{
    padding: 10rpx;
    border-bottom: 2rpx solid #ccc;
}
.item-main{
    padding: 8rpx 0;
    display: flex;
    align-items: center;
}
.item-name{
    padding-right: 10rpx;
}
.active{
    padding: 6rpx;
    background-color: #49bdfb;
    columns: #fff;
    border-radius: 20rpx;
    font-size: 24rpx;
    text-align: center;
}
</style>

path.js文件代码

export default{
    state:{
        list:[
            {
                name:"张果老",
                tel:"18010101919",
                city:"北京市朝阳区建国路",
                details:"四惠东199号",
                isDefault:false
            },{
                name:"吕洞宾",
                tel:"18010102929",
                city:"北京市石景山区鲁谷",
                details:"中心西街199号",
                isDefault:true
            }
        ]
    },
    getters:{
        defaultPath(state){
            return state.list.filter(v=>v.isDefault)
        }
    },
    mutations:{
        createPath( state, obj ){
            state.list.unshift( obj );
        },
        updatePath( state, {index,item} ){
            for(let key in item){
                state.list[index][key] = item[key];
            }
        },
        // 把之前选中默认的改完未选中
        removePath(state){
            state.list.forEach(v=>{
                if(v.isDefault){
                    v.isDefault = false;
                }
            })
        }
    },
    actions:{
        createPathFn({commit}, obj){
            if(obj.isDefault){
                commit('removePath')
            }
            commit('createPath', obj);
        },
        updatePathFn({commit}, obj){
            if(obj.item.isDefault){
                commit('removePath')
            }
            commit('updatePath', obj);
        }
    }
}

目录结构

前端目录结构

  • manifest.json 配置文件: appid、logo…

  • pages.json 配置文件: 导航、 tabbar、 路由

  • main.js vue初始化入口文件

  • App.vue 全局配置:样式、全局监视

  • static 静态资源:图片、字体图标

  • page 页面

    • index
      • index.vue
    • list
      • list.vue
    • my
      • my.vue
    • my-config
      • my-config.vue
    • my-config
      • my-config.vue
    • my-add-path
      • my-add-path.vue
    • my-path-list
      • my-path-list.vue
    • search
      • search.vue
    • search-list
      • search-list.vue
    • shopcart
      • shopcart.vue
    • details
      • details.vue
    • my-order
      • my-order.vue
    • confirm-order
      • confirm-order.vue
  • components 组件

    • index
      • Banner.vue
      • Hot.vue
      • Icons.vue
      • indexSwiper.vue
      • Recommend.vue
      • Shop.vue
    • common
      • Card.vue
      • Commondity.vue
      • CommondityList.vue
      • Line.vue
      • ShopList.vue
    • order
      • order-list.vue
    • uni
      • uni-number-box
        • uni-number-box.vue
      • uni-icons
        • uni-icons.vue
      • uni-nav-bar
        • uni-nav-bar.vue
      • mpvue-citypicker
        • mpvueCityPicker.vue
  • common 公共文件:全局css文件 || 全局js文件

    • api
      • request.js
    • common.css
    • uni.css
  • store vuex状态机文件

    • modules
      • cart.js
      • path.js
    • index.js

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/67704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计JAVA圆梦山区贫困学生助学系统

[附源码]计算机毕业设计JAVA圆梦山区贫困学生助学系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM…

1163. 按字典序排在最后的子串-解题思路推导

1163. 按字典序排在最后的子串-解题思路推导 给你一个字符串 s &#xff0c;找出它的所有子串并按字典序排列&#xff0c;返回排在最后的那个子串。 示例 1&#xff1a; 输入&#xff1a;s “abab” 输出&#xff1a;“bab” 解释&#xff1a;我们可以找出 7 个子串 [“a”…

刷爆力扣之种花问题

刷爆力扣之种花问题 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#xff0c;每…

YOLOv7 Backbone| 原文源码详解

YOLOv7 Backbone结构详解在之前的文章中&#xff0c;我们以YOLOv5为对象&#xff0c;详细解剖了一只麻雀的内部构造&#xff0c;包括anchor机制、backbone的结构、neck的结构和head的结构。在本篇文章中&#xff0c;我们将以YOLOv7v0.1版本的代码为目标&#xff0c;结合作者团队…

骨骼动画——2D Animation

1、2D骨骼动画 传统的序列帧动画为了达到好的动画效果&#xff0c;理论上来说&#xff0c;图片越多&#xff0c;动作越流畅&#xff0c;往往需要较多的美术资源&#xff0c;虽然效果好但是资源占用较多 而2D骨骼动画是利用3D骨骼动画的制作原理进行制作的&#xff0c;将一张2…

借助 ChatGPT 编写的 libbpf eBPF 工具开发实践教程: 通过例子学习 eBPF

这是一个基于 CO-RE&#xff08;一次编译&#xff0c;到处运行&#xff09;的 libbpf 的 eBPF 的开发教程&#xff0c;提供了从入门到进阶的 eBPF 开发实践指南&#xff0c;包括基本概念、代码实例、实际应用等内容。我们主要提供了一些 eBPF 工具的案例&#xff0c;帮助开发者…

大学免费查题接口

大学免费查题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳…

设计模式-day02

4&#xff0c;创建型模式 4.2 工厂模式 4.2.1 概述 需求&#xff1a;设计一个咖啡店点餐系统。 设计一个咖啡类&#xff08;Coffee&#xff09;&#xff0c;并定义其两个子类&#xff08;美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】&#xff09;&#xff1b;再设…

蓝牙学习六(GATT)

1.简介 GATT-Generic Attribute profle-通用属性配置文件。GATT层是传输真正数据所在的层。包括了一个数据传输和存储架构以及其基本操作。GATT用来规范attribute中的数据内容&#xff0c;并运用group&#xff08;分组&#xff09;的概念对attribute进行分类管理。没有GATT&…

查题接口系统

查题接口系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xff09; 题库…

Bootstrap-jqgrid学习(十六)

jqgrid网站地址&#xff1a; jqGrid demos-jqGrid实例-中文-mn886.nethttps://blog.mn886.net/jqGrid/ 表格属性 分页属性&#xff1a; pagerstring定义翻页用的导航栏&#xff0c;必须是有效的html元素。翻页工具栏可以放置在html页面任意位置 显示总条数 viewrecordsbo…

#分支语句详解

第一章 C语言&#xff1a;分支语句 文章目录第一章 C语言&#xff1a;分支语句前言1、什么是语句&#xff1f;2.分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 if书写形式的对比2.2 switch语句2.2.1 在switch语句中的 break2.2.2 default子句2.2.3 练…

基于频谱的GCN的数学原理

参考链接&#xff1a;如何理解GCN&#xff1f;知乎回答&#xff1a;从热传导模型到GCN从CNN到GCN的联系与区别——GCN从入门到精&#xff08;fang&#xff09;通&#xff08;qi&#xff09; GCN问题本质 图中的每个结点无时无刻不因为邻居和更远的点的影响&#xff0c;而在改…

基于linux的操作系统的通用启动流程(一)

这篇我们讲解linux的通用启动流程,按照我们一贯的方式总分总的节奏,因为后面的每个子系统也很大,所以我们讲解子系统的时候也是按照总分总的方式。注意因为基于linux的各式各样的操作系统绝对不下100个,像嵌入式,然后我们的桌面有fedora,redhat,centos,debian,ubuntu以…

如何定位线上CPU占用过高的问题

系列文章目录 文章目录系列文章目录前言一、定位CPU的流程是什么&#xff1f;二、实操1.测试代码样例2.定位问题实践过程总结前言 一、定位CPU的流程是什么&#xff1f; 项目上线&#xff0c;CPU飙高不下&#xff0c;触发报警&#xff0c;如何定位排查问题。有两种办法1、通过…

JVM内存布局及GC原理

“java的内存布局以及GC原理”是java开发人员绕不开的话题&#xff0c;也是面试中常见的高频问题之一。 java发展历史上出现过很多垃圾回收器&#xff0c;各有各的适应场景&#xff0c;很多网上的旧文章已经跟不上最新的变化。本文详细介绍了java的内存布局以及各种垃圾回收器的…

著名运动员刘诗雯从政,迎来人生高光时刻,张继科还般配吗

曾经有这么一句话&#xff1a;中国男足谁都踢不过&#xff0c;中国乒乓球谁都打不过。也间接地说明了国球队伍人才济济。在众多优秀乒乓球队员当中&#xff0c;刘诗雯最近相当耀眼&#xff0c;听说她已经高升当官了&#xff0c;也和张继科拉开了距离。 据悉&#xff0c;公元202…

Java高效率复习-数据类型和运算符[Java]

第一篇关于JavaSE内容的文章 文章的风格比较涣散&#xff0c;但是都是干货&#xff0c;关于Java系列的&#xff0c;还有就是&#xff0c;我认为只有MySQL基础和JavaSE基础是可以做到可操作性和可执行性较强的。 如果像JavaWeb或者SSM框架这些&#xff0c;光看文章你是根本执行…

tensorflow的GPU加速计算

参考 tensorflow的GPU加速计算 - 云社区 - 腾讯云 一、概述 tensorflow程序可以通过tf.device函数来指定运行每一个操作的设备&#xff0c;这个设备可以是本地的CPU或者GPU&#xff0c;也可以是某一台远程的服务器。tensorflow会给每一个可用的设备一个名称&#xff0c;tf.…

PaO2/FiO2在临床中的应用 氧合指数

主任提问:患者呼吸衰竭时的“氧合指数”大约多少?如何计算?_腾讯新闻 (qq.com) 在 ARDS 柏林定义中,诊断低氧血症需要 PaO2/FiO2≤ 300 mmHg,并可以分为轻中重三个等级(下表)。 ARDS 患者的 PaO2/FiO2越低,死亡率越高,其中重度 ARDS 死亡率高达 45%。需要注意这里 …