作者 | Jeskson

来源 | 达达前端小酒馆

分页组件

首先来创建项目:

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

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

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

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

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

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

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

不说无用,先创建项目:

写的分页组件

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

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

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

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

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

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

  1. <div id="app">
  2. <h1>分页组件</h1>
  3. //父
  4. <page-component :total="total"></page-component>
  5. </div>
  6. <template id="page-component">
  7. <ul class="pagination">
  8. <li :class="p == page ? 'page-item active' : 'page-item'"
  9. v-for="p in pagecount">
  10. <a href="#" class="page-link" @click.prevent="page=p">
  11. {{p}}
  12. </a>
  13. </li>
  14. </ul>
  15. </template>

@click.stop 阻止事件冒泡

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

  1. <script src="vue.js"> </script>
  2. <script>
  3. // 定义组件
  4. const PageComponent = {
  5. name: 'PageComponent',
  6. template: '#page-component',
  7. props: ['total'],
  8. data: function() {
  9. return {
  10. page: 1, // 当前页码
  11. pagesize: 10 // 每一页的记录数
  12. };
  13. },
  14. computed: {
  15. pagecount: function() {
  16. // 总页数
  17. return Math.ceil(this.total / this.pagesize);
  18. }
  19. }
  20. };
  21. // 创建Vue实例对象
  22. const app = new Vue({
  23. el: '#app',
  24. data: {
  25. total: 35
  26. },
  27. components: {
  28. PageComponent
  29. }
  30. });
  31. </script>

分页效果大致如此。

购物车组件

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

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

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

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

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

v-model指令的双向绑定

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

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

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

this.$emit(事件,值)

父组件:

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

子组件:

  1. <template>
  2. <div>
  3. <div class="group">
  4. <label>{{title}}</label>
  5. <input type="text" placeholder="请输入" @input="changeData()" v-model="val">
  6. </div>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. props:["title"],
  12. data () {
  13. return {
  14. val:""
  15. }
  16. },
  17. methods:{
  18. changeData:function(){
  19. this.$emit('input',this.val);
  20. }
  21. }
  22. }
  23. </script>

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

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

  1. // computed属性定义下的:
  2. amount: function() {
  3. var money = 0;
  4. this.goodslist.forEach(goods => {
  5. money += parseInt(goods.count) * parseInt(goods.price);
  6. });
  7. return money;
  8. }

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

代码:

  1. // 父组件
  2. <myDa :value="value" @input="value=$event"></my-comp>
  3. :value = "value"
  4. <input type="text" @input="$emit('input', $event.target.value)" :value="value">
  5. 子组件

使用$on(eventName)监听事件

使用$emit(eventName)触发事件

购物车最终代码:

  1. <div id="app">
  2. <div v-for="goods in goodslist">
  3. <p>商品名称:{{goods.name}}</p>
  4. <p>单价:{{goods.price}}</p>
  5. <cart-component v-model="goods.count">
  6. </cart-component>
  7. <hr>
  8. </div>
  9. <div>
  10. 订单总金额:{{amount}}元
  11. </div>
  12. </div>
  13. <template id="cart-component">
  14. <div class="cart">
  15. <button @click="count--; updateCount();">
  16. -
  17. </button>
  18. <input type="text" v-model="count"
  19. @input=updateCount()">
  20. <button @click="count++; updateCount();">
  21. +
  22. </button>
  23. </div>
  24. </template>
  25. <script>
  26. // 定义组件
  27. const CartComponent = {
  28. name: 'Cart',
  29. template: '#cart-component',
  30. // 在组件中不可直接修改props数据
  31. props: ['value'],
  32. data: function() {
  33. return {
  34. count: this.value
  35. };
  36. },
  37. methods: {
  38. // v-model指令双向绑定,修改父组件内容
  39. updateCount: function() {
  40. // 触发input事件
  41. this.$emit('input',this.count);
  42. }
  43. }
  44. };
  45. // 创建vue实例对象
  46. const app = new Vue({
  47. el: '#app',
  48. data: {
  49. goodslist; [{
  50. name: 'apple',
  51. price: 2,
  52. count: 2
  53. },{
  54. name: 'dada'
  55. price: 222222222222,
  56. count: 0
  57. }]
  58. },
  59. computed: {
  60. // 当前订单总金额
  61. amount: function(){
  62. var money=0
  63. this.goodslist.forEach(goods=>{
  64. money += pareseInt(goods.count) * parseInt(goods.price);
  65. });
  66. return money;
  67. }
  68. },
  69. components: {
  70. CartComponent
  71. }
  72. });
  73. </script>
  74. vue:自定义组件中v-model以及父子组件的双向绑定
  75. <div id="app">
  76. <p>{{message}}</p>
  77. <input type="text" v-model='message'>
  78. </div>
  79. <script>
  80. var vueApp = new Vue({
  81. el:'#app',
  82. data:{
  83. message:"我其实是一个语法糖"
  84. }
  85. })
  86. </script>
  1. <div id="app">
  2. <p>{{message}}</p>
  3. <input type="text" v-bind:value='message' @input='message = $event.target.value'>
  4. </div>
  5. <script>
  6. var vueApp = new Vue({
  7. el: '#app',
  8. data: {
  9. message: "我其实是一个语法糖"
  10. }
  11. })
  12. </script>

以下两种约等于:

  1. <custom v-model='something'></custom>
  1. <custom :value="something" @input="value => { something = value }"></custom>
  1. <div id="app">
  2. <h1>{{message}}</h1>
  3. <test-model v-model='message'></test-model>
  4. </div>
  5. <script>
  6. Vue.component('test-model', {
  7. template: ` <input v-bind:value='value'
  8. v-on:input="$emit('input', $event.target.value)">`,
  9. })
  10. var vueApp = new Vue({
  11. el: '#app',
  12. data: {
  13. message: '测试数据'
  14. },
  15. })
  16. </script>

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

❤️ 不要忘记留下你学习的脚印 [点赞 + 收藏 + 评论]

作者Info:

【作者】:Jeskson

【原创公众号】:达达前端小酒馆。

【福利】:公众号回复 “资料” 送自学资料大礼包(进群分享,想要啥就说哈,看我有没有)!

【转载说明】:转载请说明出处,谢谢合作!~

大前端开发,定位前端开发技术栈博客,PHP后台知识点,web全栈技术领域,数据结构与算法、网络原理等通俗易懂的呈现给小伙伴。谢谢支持,承蒙厚爱!!!


若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理。


请点赞!因为你们的赞同/鼓励是我写作的最大动力!

欢迎关注达达的CSDN!

这是一个有质量,有态度的博客

Vue实际中的应用开发【分页效果与购物车】的更多相关文章

  1. 如何使用 Vue-TCB 快速在 Vue 应用中接入云开发

    什么是 Vue TCB 我自己平时经常会用到 Vue 来开发前端应用.所以,基于 Vue 的插件系统,封装了一个 Vue 插件. 如何使用 1. 安装 vue-tcb 执行如下命令,安装 vue-tc ...

  2. Cabloy-CMS中区块的开发与效果

    关于区块 Cabloy-CMS引入了区块的概念,通过区块可以快速向文章添加各种类型的内容,比如:插入一个地图子页面.插入一首音乐,等等 Cabloy-CMS中的区块可以类比于Wordpress古腾堡编 ...

  3. 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...

  4. 使用vue完成一个分页效果

    基于 element-ui 分页组件实现分页效果 效果如下: 使用说明: 0.首先在头部引入需要的外部文件 1.从element官方网页中复制想要的组件代码直接放入body中 2.编写逻辑代码 3.完 ...

  5. Mac中如何搭建Vue项目并利用VSCode开发

    (一)部署Node环境 (1)下载适合Mac环境的Node包,点击进入下载页面 (2)安装Node环境:找到下载好的Node包,这里是node-v12.14.1.pkg,我们双击它,会进入Node.j ...

  6. .NET中的repeater简介及分页效果

    Repeater控件是一个数据绑定容器控件,它能够生成各个项的列表,并可以使用模板定义网页上各个项的布局.当该页运行时,该控件为数据源中的每个项重复此布局.  配合模板使用repeater控件 若要使 ...

  7. VUE依赖webpack分别给开发环境和生产环境配置不同的常量值并在项目中动态引用

    当在开发和产品上线的时候,我们经常会遇到在同一个地方由于环境的不同而地址也不同的情况,这时候如果在代码中将该地址写死,那势必会造成上线时手动改动,多人开发及多处使用该地址难以维护等一系列问题,为避免这 ...

  8. 分页技巧__在项目中使用QueryHelper辅助对象实现分页效果

    分页技巧__在项目中使用QueryHelper辅助对象实现分页效果 QueryHelper 用于辅助拼接HQL语句 addCondition("t.type=?", "精 ...

  9. VUE中实现iview的图标效果时遇到的一个问题

    [Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available ...

随机推荐

  1. COMP 2406 – F19

    COMP 2406 – F19 – A4 Due Friday, November 22nd at 11:59 PMAssignment 4 Trivia Quiz BuilderSubmit a s ...

  2. Nginx Cache-Control

    转自:https://www.cnblogs.com/sfnz/p/5383647.html HTTP协议的Cache-Control指定请求和响应遵循的缓存机制.在请求消息或响应消息中设置 Cach ...

  3. Kafka关键参数设置

    生产环境中使用Kafka,参数调优非常重要,而Kafka参数众多,我们的java的Configuration代码中,经常设置的参数如下: Properties props = new Properti ...

  4. A query was run and no Result Maps were found for the Mapped Statement

    mybatis测试方法报错: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exec ...

  5. vsdbg 下载方法 使用下载工具下载后手动安装

    vsdbg国内下载太慢了,这里提供一个使用下载工具下载后,手动安装的处理方法 查看vs build控制台输出: 1>C:\WINDOWS\System32\WindowsPowerShell\v ...

  6. linq,sqlmethods,like

    LINQ to SQL will translate .NET methods in this manner: text.StartsWith(...) = LIKE ...% text.Contai ...

  7. Go语言中初始化变量中字面量&Type{}、new、make的区别

    Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用. 变量的声明 va ...

  8. oracle 创建表、删除表、添加字段、删除字段、表备注、字段备注、修改表属性

    1.创建表 create table 表名( classid number() primary key, 表字段 数据类型 是否允许为空(not null:不为空/null:允许空) 默认值(defa ...

  9. 6 、 图论—NP 搜索

    6.1 最大团 //最大团 //返回最大团大小和一个方案,传入图的大小 n 和邻接阵 mat //mat[i][j]为布尔量 #define MAXN 60 void clique(int n, in ...

  10. Ext学习之路——Ext.define

    Ext.define('My.awesome.Class', { someProperty: 'something', someMethod: function() { alert(s + this. ...