1. <!DOCTYPE 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. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    7. <title>Document</title>
    8. <script src="./lib/vue.js"></script>
    9. </head>
    10. <body>
    11. <div id="app">
    12. <div>
    13. <label>
    14. id:<input type="text" v-model="id">
    15. </label>
    16. <label>
    17. <!-- @keyup.enter="add" 松开键盘,并且按下回车就会触发add方法 -->
    18. name:<input type="text" v-model="name" @keyup.enter="add">
    19. </label>
    20. <label>
    21. <input type="button" value="添加" @click="add">
    22. </label>
    23. <label>
    24. <!-- 调用自定义指令v-focus -->
    25. <input type="text" v-model="keywords" v-focus v-color="'springgreen'">
    26. <input type="button" value="搜索" @click="serach(keywords)" >
    27. </label>
    28. </div>
    29. <table border="1" style="margin-top: 20px;">
    30. <thead>
    31. <tr>
    32. <th>id</th>
    33. <th>name</th>
    34. <th>ctime</th>
    35. <th>操作</th>
    36. </tr>
    37. </thead>
    38. <tbody>
    39. <tr v-for="(item, index) in serach(keywords)" :key="index">
    40. <td>{{item.id}}</td>
    41. <td>{{item.name}}</td>
    42. <td>{{item.ctime}}</td>
    43. <td><a href="" @click.prevent="del(item.id)">删除</a></td>
    44. </tr>
    45. </tbody>
    46. </table>
    47. </div>
    48. <script>
    49. // 自定义全局键盘修饰符
    50. // Vue.config.keywords.f2 = "113";
    51. //定义一个自定指令,名字叫focus,在调用的时候,加上v-前缀进行调用
    52. Vue.directive('focus', {
    53. // 只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
    54. // 加载到内存 调用bind 和样式相关的,放入bind里面
    55. bind: function (el) {
    56. // console.log("bind")
    57. // el.focus();
    58. },
    59. // 被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
    60. // 从内存到页面, 和js行为相关的一般放inserted里面
    61. inserted: function (el) {
    62. el.focus();
    63. },
    64. updated: function (el) {
    65. // el.focus();
    66. }
    67. })
    68. Vue.directive('color', {
    69. // 只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
    70. // 加载到内存 调用bind 和样式相关的,放入bind里面
    71. // binding是一个对象,里面有自定义属性的值
    72. bind: function (el, binding) {
    73. console.log(binding)
    74. el.style.color = binding.value;
    75. }
    76. })
    77. var vm = new Vue({
    78. el: '#app',
    79. data: {
    80. id: "",
    81. name: "",
    82. keywords: "",
    83. list: [
    84. { id: 1, name: "奔驰", ctime: new Date() },
    85. { id: 2, name: "宝马", ctime: new Date() },
    86. ]
    87. },
    88. methods: {
    89. add() {
    90. var obj = { id: this.id, name: this.name, ctime: new Date() };
    91. this.list.push(obj);
    92. this.id = '';
    93. this.name = '';
    94. },
    95. del(id) {
    96. // 根据id查找索引
    97. // 根据索引删除对应的对象
    98. // 方法二
    99. var index = this.list.findIndex(item => {
    100. if (item.id == id) {
    101. return true
    102. }
    103. })
    104. console.log(index)
    105. // this.list.splice(index, 1)
    106. // 方法一
    107. // 在数组some方法中,如果return true,就立刻终止这个数组的后续循环
    108. this.list.some((v, i) => {
    109. if (v.id == id) {
    110. this.list.splice(i, 1)
    111. return true
    112. }
    113. })
    114. },
    115. serach(keywords) {
    116. // 第一种方法
    117. var newlist = [];
    118. this.list.forEach(item => {
    119. // item.name.indexOf(keywords) != -1 名字包含就push到新数组中去
    120. if (item.name.indexOf(keywords) != -1) {
    121. newlist.push(item)
    122. }
    123. });
    124. return newlist
    125. // 第二种方法
    126. // var newlist = this.list.filter(item=>{
    127. // if (item.name.includes(keywords)) {
    128. // return item
    129. // }
    130. // })
    131. // return newlist
    132. }
    133. }
    134. });
    135. </script>
    136. </body>
    137. </html>

    访问页面,鼠标自动聚焦到搜索输入框
    image.png