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

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

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 实现响应的数据绑定和组合的视图组件。

    266 引用 • 665 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 477 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 625 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 16 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 680 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 431 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    125 引用 • 169 回帖 • 1 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 2 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    176 引用 • 815 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 113 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 303 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 175 关注
  • 创业

    你比 99% 的人都优秀么?

    84 引用 • 1399 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    351 引用 • 1814 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    567 引用 • 3532 回帖
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖 • 2 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 43 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    8 引用 • 30 回帖 • 407 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 628 关注
  • 负能量

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

    88 引用 • 1235 回帖 • 411 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖
  • 深度学习

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

    53 引用 • 40 回帖 • 2 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    169 引用 • 506 回帖
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖