• 5.9图书管理案例


        常用特性应用场景
         1. 过滤器(格式化日期)
         2. 自定义指令(获取表单焦点)
         3. 计算属性(统计图书数量)
         4. 侦听器(验证图书存在性)
         5. 生命周期(图书数据处理)

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. <style type="text/css">
    7. .grid {
    8. margin: auto;
    9. width: 500px;
    10. text-align: center;
    11. }
    12. .grid table {
    13. width: 100%;
    14. border-collapse: collapse;
    15. }
    16. .grid th,td {
    17. padding: 10;
    18. border: 1px dashed orange;
    19. height: 35px;
    20. line-height: 35px;
    21. }
    22. .grid th {
    23. background-color: orange;
    24. }
    25. .book div {
    26. padding: 10;
    27. line-height: 35px;
    28. border-bottom: 1px solid green;
    29. margin: auto;
    30. background-color: orange;
    31. }
    32. .book input {
    33. width: 150px;
    34. }
    35. .grid .total {
    36. height: 30px;
    37. line-height: 30px;
    38. background-color: #F3DCAB;
    39. border-top: 1px solid #C2D89A;
    40. }
    41. style>
    42. head>
    43. <body>
    44. <div id="app">
    45. <div class="grid">
    46. <div>
    47. <h1>图书管理h1>
    48. <div class="book">
    49. <div>
    50. <label for="id">
    51. 编号:
    52. label>
    53. <input type="text" id="id" v-model="id" :disabled="flag" v-focus/>
    54. <label for="name">
    55. 名称:
    56. label>
    57. <input type="text" id="name" v-model="name" />
    58. <button @click="handle" :disabled="submitFlag">提交button>
    59. div>
    60. div>
    61. div>
    62. <div class="total">
    63. <span>图书总数:span>
    64. <span>{{total}}span>
    65. div>
    66. <table>
    67. <thead>
    68. <tr>
    69. <th>编号th>
    70. <th>名称th>
    71. <th>时间th>
    72. <th>操作th>
    73. tr>
    74. thead>
    75. <tbody>
    76. <tr :key='item.id' v-for="(item, index) in books">
    77. <td>{{item.id}}td>
    78. <td>{{item.name}}td>
    79. <td>{{item.date | format('yyyy-MM-dd hh:mm:ss')}}td>
    80. <td>
    81. <a href="" @click.prevent="toEdit(item.id)">修改a>
    82. <span> | span>
    83. <a href="" @click.prevent="del(item.id)">删除a>
    84. td>
    85. tr>
    86. tbody>
    87. table>
    88. div>
    89. div>
    90. body>
    91. <script type="text/javascript" src="../js/vue.js">script>
    92. <script type="text/javascript" >
    93. /*
    94. 常用特性应用场景
    95. 1. 过滤器(格式化日期)
    96. 2. 自定义指令(获取表单焦点)
    97. 3. 计算属性(统计图书数量)
    98. 4. 侦听器(验证图书存在性)
    99. 5. 生命周期(图书数据处理)
    100. */
    101. /*
    102. 自定义指令,自动获取焦点
    103. */
    104. Vue.directive('focus', {
    105. inserted: function(el){
    106. el.focus();
    107. }
    108. });
    109. /**
    110. 过滤器(日期时间格式化)
    111. */
    112. Vue.filter('format', function(value, arg){
    113. function dateFormat(date, format){
    114. if(typeof date === "string"){
    115. var mts = date.match(/(\/Date\((\d+)\)\/)/);
    116. if(mts && mts.length >= 3){
    117. date = parseInt(mts[2]);
    118. }
    119. }
    120. date = new Date(date);
    121. if(!date || date.toUTCString() == "Invalid Date"){
    122. return '';
    123. }
    124. var map = {
    125. "M" : date.getMonth() + 1,
    126. "d" : date.getDate(),
    127. "h" : date.getHours(),
    128. "m" : date.getMinutes(),
    129. "s" : date.getSeconds(),
    130. "q" : Math.floor((date.getMonth() + 3) / 3),
    131. "S" : date.getMilliseconds()
    132. };
    133. format = format.replace(/([yMdhmsqS])+/g, function(all, t){
    134. var v = map[t];
    135. if(v !== undefined){
    136. if(all.length > 1){
    137. v = '0' + v;
    138. v = v.substr(v.length -2);
    139. }
    140. return v;
    141. }else if(t === 'y'){
    142. return (date.getFullYear() + '').substr(4 - all.length);
    143. }
    144. return all;
    145. });
    146. return format;
    147. }
    148. return dateFormat(value, arg);
    149. })
    150. var vm = new Vue({
    151. el:'#app',
    152. data:{
    153. msg: "hello",
    154. id: '',
    155. name: '',
    156. flag : false,
    157. submitFlag: false,
    158. books: '',
    159. },
    160. methods: {
    161. handle: function () {
    162. if(this.flag){
    163. //编辑操作 根据当前id更新数组对应的数据
    164. this.books.some((item) => {
    165. if(item.id == this.id){
    166. item.name = this.name;
    167. //完成更新操作后,终止循环
    168. return true;
    169. }
    170. })
    171. this.flag = false;
    172. }else {
    173. //新增
    174. //添加图书
    175. var book = {};
    176. book.id = this.id;
    177. book.name = this.name;
    178. book.date = '';
    179. this.books.push(book);
    180. }
    181. //清空表单内容
    182. this.id = '';
    183. this.name = '';
    184. },
    185. toEdit: function(id){
    186. //修改的时候 禁用id修改
    187. this.flag = true;
    188. console.log(id);
    189. //根据id查询出要编辑的数据
    190. var book = this.books.filter(function(item){
    191. return item.id == id;
    192. })
    193. console.log(book);
    194. // 把获取到的信息回显
    195. this.id = book[0].id;
    196. this.name = book[0].name;
    197. },
    198. del: function(id){
    199. //删除
    200. //根据id从数组中查找索引
    201. var index = this.books.findIndex(function(item){
    202. return item.id == id;
    203. });
    204. //根据索引删除元素
    205. this.books.splice(index, 1);
    206. }
    207. },
    208. //计算属性,计算图书总数
    209. computed: {
    210. total: function(){
    211. // 计算图书的总数
    212. return this.books.length;
    213. }
    214. },
    215. //侦听器,验证图书是否存在
    216. watch: {
    217. name: function(val){
    218. //验证图书名称是否已经存在
    219. var flag = this.books.some(function(item){
    220. return item.name == val;
    221. });
    222. if(flag) {
    223. //图书名称存在,提交按钮禁用
    224. this.submitFlag = true;
    225. }else{
    226. this.submitFlag = false;
    227. }
    228. },
    229. id: function(val){
    230. //验证图书名称是否已经存在
    231. var flag = this.books.some(function(item){
    232. return item.id == val;
    233. });
    234. if(flag) {
    235. //图书名称存在,提交按钮禁用
    236. this.submitFlag = true;
    237. }else{
    238. this.submitFlag = false;
    239. }
    240. }
    241. },
    242. //该生命周期钩子函数被触发的时候,模板已经可以使用
    243. //一般此时用于获取后台数据,然后把数据填充到模板
    244. mounted: function(){
    245. var data = [{
    246. id: 1,
    247. name: '七龙珠',
    248. date: 2525609975000,
    249. },{
    250. id: 2,
    251. name: '灌篮高手',
    252. date: 2525609975000,
    253. },{
    254. id: 3,
    255. name: '名侦探柯南',
    256. date: 2525609975000,
    257. },{
    258. id: 4,
    259. name: '鬼灭之刃',
    260. date: 2525609975000,
    261. }];
    262. this.books = data;
    263. }
    264. });
    265. script>
    266. html>

  • 相关阅读:
    一个完整的项目测试方案流程应该是什么样的?
    782 变为棋盘——Leetcode天天刷(2022.8.23)【数学:降维计算】
    消防应急照明和疏散指示系统在城市隧道中的应用
    操作系统MIT6.S081:[xv6参考手册第5章]->中断与设备驱动程序
    基于大功率白光 LED 的可见光通信
    FFmpeg部分数据结构简介
    【华为OD机试真题 JAVA】火锅
    pop3 110端口渗透测试
    MySQL主从复制介绍及实操演示
    【Spring】bean的基础配置
  • 原文地址:https://blog.csdn.net/PengK_aha/article/details/128114006