地址列表渲染实现,地址选配功能

本贴最后更新于 1635 天前,其中的信息可能已经事过景迁

1.进行初始化,拿到 mock 中的地址数据

created() {
            this.init();
        },
        methods: {
            init() {
                this.axios.get("/mock/address.json").then((response) => {
                    let res = response.data;
                    this.addressList = res.data;

                });
            }
        }

2.利用 v-for, v-bind 指令对地址列表进行渲染

<li class="check" v-for="item in addressList" v-bind:key="item.addressId">
                                    <dl>
                                        <dt>{{item.Username}}</dt>
                                        <dd class="address">{{item.streetName}}</dd>
                                        <dd class="tel">{{item.tel}}</dd>
                                    </dl>

3.在没有打开查看更多之前,只显示三个,如果打开,就显示多个
这个地方又用到了计算属性,只不过这个属性是一个地址的 list,动态的改变然后去渲染,

computed: {
            addressFilter() {
                return this.addressList.splice(0, this.limit);
            }
        },

limit 目前先写死就是 3,那么目前就只能显示三个,然后只需要在点击查看更多的时候改变 limit 的数值就可以了
limit 改变的 click 事件:

expand() {
                window.console.log(this.limit);
                window.console.log(this.addressList.length);
                window.console.log(this.addressList);
                //如果是3,代表要展开
                if (this.limit == 3) {
                    this.limit = this.addressList.length;
                } else {
                    //否则就是折叠起来
                    this.limit = 3;
                }
            }

然后这里就不再详细解释了,可以直接看注释。但是这里要记录一个点。这个地方出现了一个 bug,就是 limit 一直是 3,所以 addressList.length 也一直是 3,为什么呢,就想到了是不是因为在 computed 里边被切割了。这个时候就想到了 splice,百度一下,发现了他和 slice 的区别:
@1.slice(start,end):方法可从已有数组中返回选定的元素,返回一个新数组,包含从 start 到 end(不包含该元素)的数组元素
@2.splice():该方法向或者从数组中添加或者删除项目,返回被删除的项目。(该方法会改变原数组)
所以 computed 里边不应该用 splice,而是用 slice。bug 解决!

4.改变箭头,有一个 open 类,代表现在是打开的,也就是数量是大于三的,因此只要在 limit 大于 3 的时候绑定上一个 open 类就可以类

<a class="addr-more-btn up-down-btn" href="javascript:;" @click="expand" v-bind:class="{'open': limit>3}">

5.点亮默认的选配地址
首先在初始化的函数里找到默认的地址的索引

init() {
                this.axios.get("/mock/address.json").then((response) => {
                    let res = response.data;
                    this.addressList = res.data;
                    //找到谁是默认的地址
                    this.addressList.forEach((item, index) => {
                        if (item.checked) {
                            this.checkedIndex = index;
                        }
                    });
                });
            },

6.然后再动态绑定 check 类

<li v-bind:class="{'check': checkedIndex==index}" v-for="(item, index) in addressFilter" v-bind:key="item.addressId">

7.绑定 click 事件,改变 checkedIndex,从而改变渲染效果

<li v-bind:class="{'check': checkedIndex==index}" v-for="(item, index) in addressFilter" v-bind:key="item.addressId" @click="checkedIndex=index">

8.用 v-if 指令动态渲染是否显示默认地址和设为默认

<div class="addr-opration addr-set-default" v-if="!item.isDefault">
                                        <a href="javascript:;" class="addr-set-default-btn"><i>设为默认</i></a>
                                    </div>
                                    <div class="addr-opration addr-default" v-if="item.isDefault">默认地址</div>

9.设为默认

setDefault(addressId) {
                this.addressList.map((item) => {
                    if (addressId == item.addressId) {
                        item.isDefault = true;
                    } else {
                        item.isDefault = false;
                    }
                })
            }

需要吧这个地址的 id 传过来

<div class="addr-opration addr-default" v-if="item.isDefault">默认地址</div>

10.删除地址

//删除地址
            delAddress(addressId) {
                this.addressList.map((item, index) => {
                    if (addressId == item.addressId) {
                        this.addressList.splice(index, 1);
                    }
                })
            }

同样需要把这个 id 给传进去

<a href="javascript:;" class="addr-del-btn" @click="delAddress(item.addressId)">

在下一步那里加上一个弹框:

<modal :mdShow="modalConfirm" @close="closeModal">
            <template v-slot:message>
                <p>结束咯!!!</p>
            </template>
            <template v-slot:btnGroup>
                <a class="btn btn--m btn--red" href="javascript:;" @click="modalConfirm=false">关闭</a>
            </template>
        </modal>

12.在说一下从父组件传递过来的属性,在子组件中不能修改,如果想修改必须通过父组件,否者这个属性会失去意义。

今天算是把这个课学完了,明天做一个总结把,然后就开始新的课程!

  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    261 引用 • 662 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 589 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    476 引用 • 899 回帖
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    85 引用 • 1201 回帖 • 455 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    96 引用 • 330 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 495 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    40 引用 • 40 回帖
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 24 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 398 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 640 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 22 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖 • 1 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    90 引用 • 383 回帖 • 1 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    180 引用 • 447 回帖 • 1 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 598 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 243 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 178 关注
  • 996
    13 引用 • 200 回帖 • 1 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 107 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    126 引用 • 1699 回帖
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖 • 1 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 3 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    491 引用 • 1383 回帖 • 373 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 44 关注