企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 切换底栏 :-: ![](https://img.kancloud.cn/d2/e0/d2e022a8df669830ea60ad6996bfa49b_566x491.gif) > 切换进行中,会列举出未选中的列表;切换已完成,会列举出已选中的列表;当单击删除完成,会将已选中的列表删除掉 > 同时在选中过程中,tab栏也会有选中状态。 ## 先做选中状态 >[success] 可以在data中存一个状态标识sign,当单击底栏进行切换绑定方法,每一个按钮都添加上自己的标识。 ``` <footer id="footer"><span id="todo-count"><strong>0</strong>进行中</span> <ul id="filters"> <li> <a href="#" :class="{selected:sign==='all'}" @click="changeSign('all')"> 全部 </a> </li> <li> <a href="#" :class="{selected:sign==='avtiving'}" @click="changeSign('avtiving')"> 进行中 </a> </li> <li> <a href="#" :class="{selected:sign==='completed'}" @click="changeSign('completed')"> 已完成 </a> </li> </ul> …… </footer> var vm = new Vue({ el: '#todoapp', data: { sign:'all', …… }, …… methods: { …… changeSign(val){ this.sign = val; } } }) ``` ## 切换数据 > 切换按钮时不仅要选中,还要切换数据,根据不同的功能做不同的事情。如何完成? >[warning] 思考一下?可不可以直接将list的数据修改? > 答案是不可以的!!因为我们切换为\*\* 进行中\*\* 此时list数组中只存在进行中的数据 ,再切换为 **全部** 会导致已完成的数据丢失 >[success] 如何解决? > 我们可以再书写一个数据为\*\*curlist ,**而**Iist \*\*只是做一个备份数据,每次操作数据都是从list中取出数据再来修改curlist即可。 ``` <section id="main"> …… <ul id="todo-list"> <li :class="{completed:item.selected,editing:edit===index}" v-for="(item,index) in curlist"> …… </li> </ul> </section> var vm = new Vue({ el: '#todoapp', data: { …… curlist:local.get(), list:local.get() } …… }) ``` ## list的数据同步到curlist中 >[danger] 现在会产生的问题是我们添加数据和删除数据都不会成功,必须重新刷新才有效果,可以看下图 :-: ![](https://img.kancloud.cn/ee/8f/ee8f175d1456147561357b2d2f6fb3f2_564x434.gif) > 问题产生的原因是因为我们只是将`curlist`用了一下, > 之前用户交互时候:用户输入数据操作的是`list`,而不是`curlist`;删除数据操作的都是list,都不是`curlist` > 所以产生下面的问题 >[success] 解决 > 监听list数据变化的时候将数据重新给到curlist上。 ``` watch: { list: { handler() { local.set(this.list) this.curlist = local.get(); }, deep: true } } ``` >[warning] 注意这里面我们为什么不是this.curlist = this.list。如果是这样的话,它们就是引用关系。会产生问题。我们需要拷贝一份新的数据,那么如何做呢?我们在获取本地存储数据时候其实已经是拷贝的数据了。 ## 切换数据 >[warning] 思考题? > 我们在切换中,要去修改数据,这个功能该如何进行?可能 会直接想到就在changeSign这个方法中,根据传递的val参数值的不同,进行判断再去展示相应的数据即可。其实这种并不好! > 1. 首先这个功能内部代码冗余度很多。 > 2. 而且 if else的可扩展性不强,现在是只有三种情况,如果有更多情况,那判断会更多。 > 3. 将来维护起来也会炒鸡麻烦。 >[success] 解决 > **可以在全局定义一个对象,且对象中的key值刚好就是我们三个切换的标识**。在changeSign这个方法中调用的话只需要 \*\*对象.标识 \*\* 即可 > 想要扩展也很简单,只需要给对象添加新的key即可。 ``` var filter = { all(list) { return list }, activing(list) { return list.filter(item => item.selected === false) }, completed(list) { return list.filter(item => item.selected === true) } } …… methods: { …… changeSign(val) { this.sign = val; this.curlist = filter[val](this.list) } } ```