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.在说一下从父组件传递过来的属性,在子组件中不能修改,如果想修改必须通过父组件,否者这个属性会失去意义。
今天算是把这个课学完了,明天做一个总结把,然后就开始新的课程!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于