Vue分页效果与购物车功能


Posted in Javascript onDecember 13, 2019

分页组件

首先来创建项目:

分页组件,做项目不要写动手写代码,要想想业务逻辑,怎么写,如何写才是最好的呈现方式,做项目不急,要先想好整体的框架,从底层一开始最想要的是什么做起。

先动代码,边做边想是会出问题的,而且还会卡壳,让你半路出家的。

分页组件,你觉得要什么内容,是页面?如果不懂可以去看看别人的分页是怎么做的,考虑业务逻辑,整体出发去思考问题。要不然我去百度看看,别人的分页效果。

Vue分页效果与购物车功能

看了后做不出来也是没有关系的,我们呢?

可以从底部出发,从最小的逻辑开始,从做这个需要考虑到什么想起,一步一步来,做好局部的功能,这个功能做好了,才去做另一个功能或者页面哦~

分页组件我们需要的字段有哪些?

你想想,当前页,是不是有,curpage当前页,每页的大小,pagesize,总的页数,total,等等,考虑不到的,没关系看看别人的有什么,想好后才写代码,那才快。

不说无用,先创建项目:

Vue分页效果与购物车功能

写的分页组件

props: ['total'],
data: function() {
 return {
 page: 1, // 当前页码
 pagesize: 10 // 每一页的记录数
 });
},

是不是只能想到那么多呢?那就先写那么多,然后再想想需要什么:

总页码 = Math.ceil(总记录数/每一页记录数)

总页码数,7页,或6页,当前是向上取整,每一页记录数10页,总记录数,总的多少页。如80除10页,8页。

math.ceil(x)返回大于等于参数x的最小整数,即对浮点数向上取整.

单击事件,切换不同的页面的效果。

<div id="app">
<h1>分页组件</h1>
//父
<page-component :total="total"></page-component>
</div>

<template id="page-component">
 <ul class="pagination">
 <li :class="p == page ? 'page-item active' : 'page-item'"
 v-for="p in pagecount">
 <a href="#" rel="external nofollow" class="page-link" @click.prevent="page=p">
 {{p}}
 </a>
 </li>
 </ul>
 </template>

@click.stop 阻止事件冒泡

@click.prevent 阻止事件的默认行为,

<script src="vue.js"> </script>
<script>
// 定义组件
const PageComponent = {
 name: 'PageComponent',
 template: '#page-component',
 props: ['total'],
 
 data: function() {
 return {
 page: 1, // 当前页码
 pagesize: 10 // 每一页的记录数
 };
 },
 
 computed: {
 pagecount: function() {
 // 总页数
 return Math.ceil(this.total / this.pagesize);
 }
 }
 
};

// 创建Vue实例对象
const app = new Vue({
 el: '#app',
 data: {
 total: 35
 },
 
 components: {
 PageComponent
 }
 
});
</script>

分页效果大致如此。

购物车组件

购物车组件,是做项目不可少的,面试也是,动不动就叫我上机写个购物车的组件,写就写咯,购物车时做商城项目不可少的,写好购物车组件会很方便,简书代码的重复性。

那么想想购物车组件有什么内容呢?

购物车,是不是有:商品名称,单价,增加删减单品的数量呢?还有就是订单总金额数呢?这些是必不可少的哦!!!

Vue分页效果与购物车功能

购物车组件不知道有什么也是可以去看看别人的先,看看有什么,购物车组件一般包含显示商品的名称,单价,购买的数量以及订单总金额,通过增加或减少商品的购买的数据,并同步更改订单的总金额。

总金额同步,我们能想到的是用什么指令,是不是v-model

v-model指令的双向绑定

// v-model指令双向绑定
updateCount: function() {
 // 触发input事件
 this.$emit('input', this.count);
}

vue中监听input输入值变化的事件,原生事件;

this.$emit(),是触发器,用于父子组件的传值。

this.$emit(事件,值)

父组件:

<Group title="用户名" v-model="username"></Group>

子组件:

<template>
 <div>
  <div class="group">
   <label>{{title}}</label>
   <input type="text" placeholder="请输入" @input="changeData()" v-model="val">
  </div>
 </div>
</template>

<script>
export default {
 props:["title"],
 data () {
  return {
   val:""
  }
 },
 methods:{
  changeData:function(){
   this.$emit('input',this.val);
  }
 }
}
</script>

当商品的购买数量发生变化时,订单总金额也再变。

这个时候应该想到computed属性:

// computed属性定义下的:

amount: function() {
 var money = 0;
 this.goodslist.forEach(goods => {
 money += parseInt(goods.count) * parseInt(goods.price);
 });
 return money;
}

v-model双向绑定实际上是通过子组件中$emit方法派发的input事件,父组件监听input事件中传递的value值,并存储在父组件data中,然后父组件通过prop的形式传递给子组件value值,在子组件中绑定Input的value属性。

代码:

// 父组件
<myDa :value="value" @input="value=$event"></my-comp>

:value = "value"

<input type="text" @input="$emit('input', $event.target.value)" :value="value">

子组件使用监听事件使用

emit(eventName)触发事件

购物车最终代码:

<div id="app">
<div v-for="goods in goodslist">
<p>商品名称:{{goods.name}}</p>
<p>单价:{{goods.price}}</p>
<cart-component v-model="goods.count">
</cart-component>
<hr>
</div>

<div>

订单总金额:{{amount}}元

</div>
</div>

<template id="cart-component">
<div class="cart">
<button @click="count--; updateCount();">
-
</button>

<input type="text" v-model="count" 
@input=updateCount()">

<button @click="count++; updateCount();"> 
+ 
</button>
</div>
</template>

<script>
// 定义组件
const CartComponent = {
 name: 'Cart',
 template: '#cart-component',
 // 在组件中不可直接修改props数据
 props: ['value'],
 data: function() {
 return {
 count: this.value
 };
 },
 methods: {
 // v-model指令双向绑定,修改父组件内容
 updateCount: function() {
 // 触发input事件
 this.$emit('input',this.count);
 }
 }
};

// 创建vue实例对象
const app = new Vue({
 el: '#app',
 data: {
 goodslist; [{
 name: 'apple',
 price: 2,
 count: 2
 },{
 name: 'dada',
 price: 222222222222,
 count: 0
 }]
 },
 
 computed: {
 // 当前订单总金额
 amount: function(){
 var money=0
 this.goodslist.forEach(goods=>{
 money += pareseInt(goods.count) * parseInt(goods.price);
 });
 return money;
 }
 },
 components: {
 CartComponent
 }
});
</script>

vue:自定义组件中v-model以及父子组件的双向绑定

<div id="app">
 <p>{{message}}</p>
 <input type="text" v-model='message'>
</div>
<script>
 var vueApp = new Vue({
  el:'#app',
  data:{
   message:"我其实是一个语法糖"
  }
 })
</script>
<div id="app">
 <p>{{message}}</p>
 <input type="text" v-bind:value='message' @input='message = $event.target.value'>
</div>
<script>
 var vueApp = new Vue({
  el: '#app',
  data: {
   message: "我其实是一个语法糖"
  }
 })
</script>

以下两种约等于:

<custom v-model='something'></custom>
<custom :value="something" @input="value => { something = value }"></custom>
<div id="app">
 <h1>{{message}}</h1>
 <test-model v-model='message'></test-model>
</div>
<script>
 Vue.component('test-model', {
  template: ` <input v-bind:value='value'
     v-on:input="$emit('input', $event.target.value)">`,
 })
 var vueApp = new Vue({
  el: '#app',
  data: {
   message: '测试数据'
  },
 })
</script>

vue实际中的应用开发就到此结束了,后续敬请期待!!!

总结

以上所述是小编给大家介绍的Vue分页效果与购物车功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
js图片延迟加载的实现方法及思路
Jul 22 Javascript
javascript中的作用域和上下文使用简要概述
Dec 05 Javascript
javascript定义变量时加var与不加var的区别
Dec 22 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
Feb 28 Javascript
jQuery实现简单的DIV拖动效果
Feb 19 Javascript
jQuery动态创建元素以及追加节点的实现方法
Oct 20 Javascript
JavaScript数组去重的几种方法效率测试
Oct 23 Javascript
JavaScript 中Date对象的格式化代码方法汇总
Sep 06 Javascript
node.js基础知识小结
Feb 26 Javascript
JavaScript实现预览本地上传图片功能完整示例
Mar 08 Javascript
微信小程序按钮点击跳转页面详解
May 06 Javascript
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
如何在微信小程序中存setStorage
Dec 13 #Javascript
在微信小程序中使用mqtt服务的方法
Dec 13 #Javascript
微信小程序之左右布局的实现代码
Dec 13 #Javascript
vue实现输入一位数字转汉字功能
Dec 13 #Javascript
小程序登录之支付宝授权的实现示例
Dec 13 #Javascript
小程序使用wxs解决wxml保留2位小数问题
Dec 13 #Javascript
微信小程序点击保存图片到本机功能
Dec 13 #Javascript
You might like
PHP 日志缩略名的创建函数代码
2010/05/26 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
2017/06/07 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
使用angular写一个hello world
2015/01/23 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
vue npm install 安装某个指定的版本操作
2020/08/11 Javascript
Python3访问并下载网页内容的方法
2015/07/28 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
Python引用计数操作示例
2018/08/23 Python
python 获取等间隔的数组实例
2019/07/04 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
python多进程间通信代码实例
2019/09/30 Python
Python实现AI换脸功能
2020/04/10 Python
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
专科毕业生学习生活的自我评价
2013/10/26 职场文书
房地产财务管理制度
2014/02/02 职场文书
国际金融专业自荐信
2014/07/05 职场文书
单方投资意向书
2015/05/11 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
圣诞晚会主持词
2015/07/01 职场文书
小学英语课教学反思
2016/02/15 职场文书