• Vue小案例(一)


    目录

    案例一:点击按钮切换图片

    案例二:书架

    案例三:成绩表


    案例一:点击按钮切换图片

    现在有5张图片,我想通过点击上一张 / 下一张的按钮来进行图片切换。

    使用:v-bind、v-on、v-show

    1、首先创建好Vue代码格式:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>Documenttitle>
    7. head>
    8. <body>
    9. <div id="app">
    10. div>
    11. <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js">script>
    12. <script>
    13. const app = new Vue({
    14. el:'#app',
    15. data
    16. })
    17. script>
    18. body>
    19. html>

    有5张图片,需要将其放入数组里,在data中创建数组和下标:

     创建2个按钮,上一张和下一张,以及相应的v-on事件

    中间还有图片的显示,需要v-bind动态设置img标签属性:

    1. <div>
    2. <img :src="list[index]" weight=300 height=300 alt="">
    3. div>

    效果:

    点击按钮上下翻动图片就完成了,但是还有一个BUG。

    当上一张到第1张位置时,再点上一张会出错,同样的下一张也是。

    解决方式:用v-if 进行条件渲染(或者用v-show)

    1. <button v-if="index > 0"@click="index--">上一张button>
    2. <div>
    3. <img :src="list[index]" weight=300 height=300 alt="">
    4. div>
    5. <button v-if="index < list.length-1" @click="index++">下一张button>

     这样到达第一张时“上一张”按钮就不会显示了,同理下一张处也是一样。

    完整代码:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>Documenttitle>
    7. head>
    8. <body>
    9. <div id="app">
    10. <button v-if="index > 0"@click="index--">上一张button>
    11. <div>
    12. <img :src="list[index]" weight=300 height=300 alt="">
    13. div>
    14. <button v-if="index < list.length-1" @click="index++">下一张button>
    15. div>
    16. <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js">script>
    17. <script>
    18. const app = new Vue({
    19. el:'#app',
    20. data:{
    21. index:0,
    22. list:[
    23. './0ff7d4d2be9bf8f4839c8196ea2dbba4(1).jpg',
    24. './Cache_-2d6dd9d4c0077ac0_edit_658705122363551.jpg',
    25. './Cache_3a7a27dc5e08e0ec.jpg',
    26. './Cache_4ee7d712c4c9acf8_edit_658719846241153.jpg',
    27. './mmexport1692814771342.jpg'
    28. ]
    29. }
    30. })
    31. script>
    32. body>
    33. html>

    案例二:书架

    现在需要设计这么一个书架,并能够删除其中的书。

    使用:

    首先是用v-for循环渲染数组:

    1. <body>
    2. <div id="app">
    3. <ul>
    4. <li v-for="item in bookList">
    5. <span>{{ item.name }}span>
    6. <span>{{ item.author}}span>
    7. <button>删除button>
    8. li>
    9. ul>
    10. div>
    11. <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js">script>
    12. <script>
    13. const app = new Vue({
    14. el:'#app',
    15. data:{
    16. bookList:[
    17. {id:1,name:'红楼梦',author:'曹雪芹'},
    18. {id:2,name:'西游记',author:'吴承恩'},
    19. {id:3,name:'水浒传',author:'施耐庵'},
    20. {id:4,name:'三国演义',author:'罗贯中'},
    21. ]
    22. }
    23. })
    24. script>
    25. body>

     效果:

    接下来实现删除功能。

    首先还是用v-on注册事件,在button上设置点击事件,并且在data下方提供相应的methods:

    删除就是将bookList对应的数组元素删除,那么del方法需要接收参数来确定删除哪一项。

    上面传参传item.id,有id用id,不用数组下标。

    下方方法体中用filter进行过滤:

    1. <body>
    2. <div id="app">
    3. <ul>
    4. <li v-for="item in bookList" :key="item.id">
    5. <span>{{ item.name }}span>
    6. <span>{{ item.author }}span>
    7. <button @click="del(item.id)">删除button>
    8. li>
    9. ul>
    10. div>
    11. <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js">script>
    12. <script>
    13. const app = new Vue({
    14. el:'#app',
    15. data:{
    16. bookList:[
    17. {id:1,name:'红楼梦',author:'曹雪芹'},
    18. {id:2,name:'西游记',author:'吴承恩'},
    19. {id:3,name:'水浒传',author:'施耐庵'},
    20. {id:4,name:'三国演义',author:'罗贯中'},
    21. ]
    22. },methods:{
    23. del(id){
    24. this.bookList = this.bookList.filter(item => item.id !== id)
    25. }
    26. }
    27. })
    28. script>
    29. body>

    案例三:成绩表

    创建图示这么个成绩表,包含三个科目及其编号成绩,显示总分和平均分,并可以进行添加成绩和删除成绩的操作(删除所有数据后显示暂无数据)。

    1、首先,把基础框架搭建好,填入基础数据:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>Documenttitle>
    7. head>
    8. <body>
    9. <div id="app" class="score-case">
    10. <div class="table">
    11. <table>
    12. <thead>
    13. <td>编号td>
    14. <td>科目td>
    15. <td>成绩td>
    16. <td>操作td>
    17. thead>
    18. <tbody>
    19. <tr>
    20. <td>1td>
    21. <td>语文td>
    22. <td class="red">46td>
    23. <td><a href="#">删除a>td>
    24. tr>
    25. <tr>
    26. <td>2td>
    27. <td>英语td>
    28. <td class="red">80td>
    29. <td><a href="#">删除a>td>
    30. tr>
    31. <tr>
    32. <td>3td>
    33. <td>数学td>
    34. <td class="red">70td>
    35. <td><a href="#">删除a>td>
    36. tr>
    37. tbody>
    38. <tbody>
    39. <tr>
    40. <td colspan="5">
    41. <span class="none">暂无数据span>
    42. td>
    43. tr>
    44. tbody>
    45. <tfoot>
    46. <tr>
    47. <td colspan="5">
    48. <span>总分:250span>
    49. <span style="margin-left: 50px">平均分:60span>
    50. td>
    51. tr>
    52. tfoot>
    53. table>
    54. div>
    55. <div class="form">
    56. <div class="form-item">
    57. <div class="label">科目:div>
    58. <div class="input">
    59. <input
    60. type="text"
    61. placeholder="请输入科目"
    62. />
    63. div>
    64. div>
    65. <div class="form-item">
    66. <div class="label">分数:div>
    67. <div class="input">
    68. <input
    69. type="text"
    70. placeholder="请输入分数"
    71. />
    72. div>
    73. div>
    74. <div class="form-item">
    75. <div class="label">div>
    76. <div class="input">
    77. <button class="submit">添加button>
    78. div>
    79. div>
    80. div>
    81. div>
    82. <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js">script>
    83. <script>
    84. const app = new Vue({
    85. el:'#app',
    86. data:{
    87. list:[
    88. {id:1,subject:'语文',score:20},
    89. {id:2,subject:'数学',score:90},
    90. {id:3,subject:'英语',score:70}
    91. ],
    92. subject:"",
    93. score:""
    94. }
    95. })
    96. script>
    97. body>
    98. html>

    2、table中有2个tbody,分别对应有无数据的情况。那么就需要v-if 来进行条件渲染,注意这里不用v-show,因为v-show只是控制元素的显示隐藏,而不会真正控制元素节点的创建删除。

    只需这样,就可以同时只出现一个tbody了:

    3、渲染列表,用v-for实现,代码会变得简洁很多且容易控制:

    1. <tbody v-if="list.length > 0" v-for="(item,index) in list">
    2. <tr>
    3. <td> {{ index+1 }}td>
    4. <td>{{ item.subject }}td>
    5. <td class="red">{{ item.score }}td>
    6. <td><a href="#">删除a>td>
    7. tr>
    8. tbody>

    4、实现删除功能。用v-on注册点击事件,简写成@click,创建methods方法实现:

    5、添加功能,需要先处理表单数据的双向绑定,这样才能拿到数据,用v-model:

     v-model.trim可以自动消除输入前后的空白,.number是将输入的字符串转成数字!

    然后是注册点击事件,add方法添加数据,unshift是数据加到最前面:

    严谨起见,还得判断输入的内容是否合规,并且在输入完后使得页面上的数据清除:

    1. add(){
    2. if(!this.subject){
    3. alert('请输入科目')
    4. return
    5. }
    6. if(typeof this.score != 'number'){
    7. alert('请输入正确的成绩')
    8. return
    9. }
    10. this.list.unshift({
    11. id: + new Date(), //时间戳
    12. subject: this.subject,
    13. score: this.score
    14. })
    15. this.subject = "",
    16. this.score = ""
    17. }
    18. }

    6、计算总分、平均分。需要用到computed方法:

    .toFixed(2)是保留两位小数的意思。

    注意:当删除元素删完后,平均分会显示NAN,因为除法除数为0.

    这里可以加一个判断:

     

    完整代码:
     

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>Documenttitle>
    7. head>
    8. <body>
    9. <div id="app" class="score-case">
    10. <div class="table">
    11. <table>
    12. <thead>
    13. <td>编号td>
    14. <td>科目td>
    15. <td>成绩td>
    16. <td>操作td>
    17. thead>
    18. <tbody v-if="list.length > 0" >
    19. <tr v-for="(item,index) in list" :key="item.id">
    20. <td style="border: 1px solid black"> {{ index+1 }}td>
    21. <td style="border: 1px solid black">{{ item.subject }}td>
    22. <td style="border: 1px solid black">{{ item.score }}td>
    23. <td style="border: 1px solid black"><a href="#" @click="del(item.id)">删除a>td>
    24. tr>
    25. tbody>
    26. <tbody v-else>
    27. <tr>
    28. <td style="border: 1px solid black" colspan="5">
    29. <span class="none">暂无数据span>
    30. td>
    31. tr>
    32. tbody>
    33. <tfoot>
    34. <tr>
    35. <td style="border: 1px solid black" colspan="5">
    36. <span>总分:{{ totalScore }}span>
    37. <span style="margin-left: 50px">平均分:{{ aveScore }}span>
    38. td>
    39. tr>
    40. tfoot>
    41. table>
    42. div>
    43. <div class="form">
    44. <div class="form-item">
    45. <div class="label">科目:div>
    46. <div class="input">
    47. <input v-model.trim="subject"
    48. type="text"
    49. placeholder="请输入科目"
    50. />
    51. div>
    52. div>
    53. <div class="form-item">
    54. <div class="label">分数:div>
    55. <div class="input">
    56. <input v-model.number="score"
    57. type="text"
    58. placeholder="请输入分数"
    59. />
    60. div>
    61. div>
    62. <div class="form-item">
    63. <div class="label">div>
    64. <div class="input">
    65. <button @click="add" class="submit">添加button>
    66. div>
    67. div>
    68. div>
    69. div>
    70. <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js">script>
    71. <script>
    72. const app = new Vue({
    73. el:'#app',
    74. data:{
    75. list:[
    76. {id:1,subject:'语文',score:20},
    77. {id:2,subject:'数学',score:90},
    78. {id:3,subject:'英语',score:70}
    79. ],
    80. subject:'',
    81. score:''
    82. },
    83. computed:{
    84. totalScore(){
    85. return this.list.reduce((sum,item)=>sum+item.score,0)
    86. },
    87. aveScore(){
    88. if(this.list.length === 0) return 0
    89. return (this.totalScore / this.list.length).toFixed(2);
    90. }
    91. },
    92. methods:{
    93. del(id){
    94. this.list = this.list.filter(item=>item.id !== id)
    95. },
    96. add(){
    97. if(!this.subject){
    98. alert('请输入科目')
    99. return
    100. }
    101. if(typeof this.score !== 'number'){
    102. alert('请输入正确的成绩')
    103. return
    104. }
    105. this.list.unshift({
    106. id: +new Date(), //时间戳
    107. subject: this.subject,
    108. score: this.score
    109. })
    110. this.subject = '',
    111. this.score = ''
    112. }
    113. }
    114. })
    115. script>
    116. body>
    117. html>

  • 相关阅读:
    GraphQL基础知识与Spring for GraphQL使用教程
    09-06 周二 Python之KNN算法的实现
    2022 云原生编程挑战赛火热报名中!看导师如何拆解 Serverless 赛题?
    『忘了再学』Shell基础 — 23、其他环境变量配置文件
    Git的简介以及基本使用
    9类人事管理场景应用,泛微协助HR释放更多工作量
    黑豹程序员-架构师学习路线图-百科:MVC的演变终点SpringMVC
    使用百度 EasyDL 实现电动车进电梯自动预警
    SpringMVC | SpringMVC中的 “数据绑定”
    Django REST framework(十)路由集routers的使用
  • 原文地址:https://blog.csdn.net/SAKURAjinx/article/details/133550464