VUE简单的分页购物清单

1.需求分析

image

可以在购物列表中添加、删除数据。添加删除操作会改变分页。

可切换每条数据采购状态,已采购的数据才能从列表中删除。否则删除键不能点击。

头部显示清单总数以及未采购数

2.数据驱动

image

以总数据为核心的数据驱动(添加、删除、选购状态);

分页以页码为核心,当前页展示条数为必要参数

以下为data


data:{

lists:[{name:'手机1',purchased:false},//所有购物信息 purchased选购状态 false未选购,true选购

        {name:'电脑2',purchased:true},

{name:'化妆品3',purchased:false},

{name:'包4',purchased:false},

{name:'电脑5',purchased:true},

{name:'化妆品6',purchased:false},

{name:'包7',purchased:false},

{name:'电脑8',purchased:true},

{name:'化妆品9',purchased:false},

{name:'包10',purchased:false},

{name:'手机11',purchased:false},

{name:'电脑12',purchased:true},

{name:'化妆品13',purchased:false},

{name:'包14',purchased:false},

{name:'电脑15',purchased:true},

{name:'化妆品16',purchased:false},

{name:'包17',purchased:false},

{name:'电脑18',purchased:true}

],

name:"",//添加一条数据所使用的变量

    page:{//分页相关变量

        total:1,//总分页数

        showPageNum:1,//当前展示页码

        contentNum:10,//每一页的展示条数

    },

3.添加、删除

样式用的全都是bootstrap

添加(html)


 <input class="form-control" type="text" v-model="name"/>

              <span class="input-group-btn">

                <button class="btn btn-primary" v-on:click="add(name)">添加</button>

              </span>

</div>

(js)


add:function(name){

if (name ==='')return;

this.lists.unshift({name:name,purchased:false});

this.name="";

this.paging();

}

this.paging();分页,后面会讲,添加、删除操作都会触发重新分页。

删除(html)


<button type="button" class="btn btn-danger btn-sm" @click="del(index)" :disabled="!item.purchased">删除</button>

<tr v-for="(item,index) in showList">******i****tem,index都是在v-for中获取的

@click="del(index)" 删除按钮仅仅负责根据当前数据的index删除对应数据。

:disabled="!item.purchased"根据选购状态设置删除按钮是否禁用(https://segmentfault.com/q/1010000016214238/a-1020000016214311

image

4.分页

根据信息总数、每页展示页数确定总页数

根据当前展示页的页码,以及总页数确定当前展示页(针对删除数据后页数减少的情况)

paging:function () {//分页

//确定总页数

    this.page.total=Math.ceil(this.lists.length/this.page.contentNum);

if(!this.page.total)

{

this.page.total=1;

}

//确定当前展示页数

    this.page.showPageNum=this.page.showPageNum>this.page.total?this.page.total:this.page.showPageNum;

}

当前展示页(html)


<table class="table table-striped">

              <thead>

                <tr>

                  <th>序号</th>

                  <th>清单名称</th>

                  <th>已采购</th>

                  <th>状态</th>

                  <th>删除</th>

                </tr>

              </thead>

              <tbody>

                <tr v-for="(item,index) in showList">

                  <td>{{serialNum(index)}}</td>

                  <td>{{item.name}}</td>

                  <td><input type="checkbox" v-model="item.purchased" ></td>

                  <td>{{item.purchased | stateFilter}}</td>

                  <td><button type="button" class="btn btn-danger btn-sm" @click="del(index)" :disabled="!item.purchased">删除</button></td>

                </tr>

              </tbody>

            </table>

(js)


computed:{

showList:function () {

//确定当前展示页数据

        letstart=(this.page.showPageNum-1)*this.page.contentNum;

return  this.lists.slice(start,start+this.page.contentNum);

}

}

<tr v-for="(item,index) in showList">当前展示页的数据是总数据的截取,会根据页码、总数据、每页展示数目变化。所以采用计算属性。

{{item.purchased | stateFilter}}根据采购状态,配合过滤器显示


filters:{//过滤器

    stateFilter:function(type){return type?"已采购":"未采购"}

},

<td>{{serialNum(index)}}</td>根据本条数据在展示页数据中的位置来给定序号。


serialNum:function (index) {

return index+1+(this.page.showPageNum-1)*this.page.contentNum;

},

5.页码以及翻页

页码(html)


<nav aria-label="Page navigation">

              <ul class="pagination">

                  <li @click="pagePre" :class="{disabled:page.showPageNum<=1}">

                      <a href="#" aria-label="Previous">

                          <span aria-hidden="true">&laquo;</span>

                      </a>

                  </li>

                  <li v-for="index in page.total" @click="pageTurn(index)" :class="{active:index===page.showPageNum}"><a href="#">{{index}}</a></li>

                  <li @click="pageNext" :class="{disabled:page.showPageNum>=page.total}">

                      <a href="#" aria-label="Next">

                          <span aria-hidden="true">&raquo;</span>

                      </a>

                  </li>

              </ul>

          </nav>

(js)


pageTurn:function (index) {//选择页数

    this.page.showPageNum=index;

this.paging();

},

pagePre:function () {//向前翻页

    if(this.page.showPageNum>1){

this.page.showPageNum--;

}

this.paging();

},

pageNext:function () {//向后翻页

    if(this.page.showPageNum<this.page.total){

this.page.showPageNum++;

}

this.paging();

}


<li v-for="index in page.total" @click="pageTurn(index)" :class="{active:index===page.showPageNum}"><a href="#">{{index}}</a></li>

根据当前展示的页码确定拥有active样式的页码。


<li @click="pagePre" :class="{disabled:page.showPageNum<=1}">

                      <a href="#" aria-label="Previous">

                          <span aria-hidden="true">&laquo;</span>

                      </a>

                  </li>

根据当前展示页页码给向前向后翻页添加禁用

6.为什么添加、删除写了对应的方法修改了总的lists的数据,但是通过勾选修改选购状态没有。

image

如图,修改a[0].name,b[0].name也会对应的修改,因为他们引用的是同一个对象。但是对b的添加删除操作不会影响到a。

<td><input type="checkbox" v-model="item.purchased"></td>v-model动态绑定的purchase就是总数组lists中的purchased

代码下载

所有代码已经上传到我的github仓库中。

都看到这里了就点个❤吧 (╹▽╹)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容