Vue实现静态列表增删查功能

本文介绍如何使用Vue.js实现品牌列表展示及搜索功能,包括双向数据绑定、自定义指令、过滤器等核心概念,并演示了ES6新特性在实际开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

知识点

1.双向数据绑定

2.自定义指令

3.自定义过滤器

4.v-for循环对象数组

5.ES6操作数组的新方法:forEach some filter findIndex

 

实现效果

 

页面源码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <script src="./lib/vue-2.4.0.js"></script>
    <link rel="stylesheet" href="./lib/bootstrap-3.3.7.css" />
  </head>

  <body>
    <div id="app">
      <div class="panel panel-primary">
        <div class="panel-heading">
          <h3 class="panel-title">添加品牌</h3>
        </div>
        <div class="panel-body form-inline">
          <label>
            Id:
            <input type="text" class="form-control" v-model="id" />
          </label>
          <label>
            Name:
            <input
              type="text"
              class="form-control"
              v-model="name"
              @keyup.enter="add"
            />
          </label>
          <input
            type="button"
            value="添加"
            class="btn btn-primary"
            @click="add"
          />

          <label>
            搜索名称关键字:
            <input type="text" class="form-control" v-model="keywords" v-focus/>
          </label>
        </div>
      </div>

      <table class="table table-striped table-hover table-bordered">
        <thead>
          <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Ctime</th>
            <th>Operation</th>
          </tr>
        </thead>
        <tbody>
          <!-- v-for中的数据默认是从data上的list直接渲染来的 -->
          <!-- 现在改为动态的方法查询 -->
          <tr v-for="item in search(keywords)" :key="item.id">
            <td>{{ item.id }}</td>
            <td>{{ item.name }}</td>
            <td>{{ item.ctime | dateFormate('') }}</td>
            <td><a href="" @click.prevent="del(item.id)">删除</a></td>
          </tr>
        </tbody>
      </table>
    </div>
    <script>
      // 全局自定义指令
      Vue.directive('focus', {
        inserted: function(el){
          el.focus()
        }
      })
      // 全局时间过滤器
      Vue.filter('dateFormate', function(dateStr, pattern) {
        var dt = new Date(dateStr)
        var y = dt.getFullYear()
        var m = (dt.getMonth() + 1).toString().padStart(2, '0')
        var d = dt
          .getDate()
          .toString()
          .padStart(2, '0')

        // return `${y}-${m}-${d}`

        if (pattern.toLowerCase() === 'yyyy-mm-dd') {
          return `${y}-${m}-${d}`
        } else {
          var hh = dt
            .getHours()
            .toString()
            .padStart(2, '0')
          var mm = dt
            .getMinutes()
            .toString()
            .padStart(2, '0')
          var ss = dt
            .getSeconds()
            .toString()
            .padStart(2, '0')

          return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
        }
      })

      var vm = new Vue({
        el: '#app',
        data: {
          id: '',
          name: '',
          keywords: '',
          list: [
            { id: 1, name: '奔驰', ctime: new Date() },
            { id: 2, name: '宝马', ctime: new Date() }
          ]
        },
        methods: {
          // 添加
          add() {
            if (this.id != '' && this.name != '') {
              var car = { id: this.id, name: this.name, ctime: new Date() }
              this.list.push(car)
              this.id = ''
              this.name = ''
            }
          },
          // 删除
          del(id) {
            // 方法一
            /* this.list.some((item,i)=>{
              if(item.id == id){
                this.list.splice(i, 1)
                return true
              }
            }) */
            // 方法二
            var index = this.list.findIndex(item => {
              if (item.id == id) {
                return true
              }
            })
            this.list.splice(index, 1)
          },
          // 条件查询
          search(keywords) {
            /* 
            方法1
            var newList = [];
            this.list.forEach(item => {
              if(item.name.indexOf(keywords) != -1){
                newList.push(item)
              }
            });
            return newList; 
            */
            // forEach some filter findIndex
            return this.list.filter(item => {
              if (item.name.includes(keywords)) {
                return item
              }
            })
          }
        }
      })
    </script>
  </body>
</html>

 

<think>好的,我现在需要帮助用户找到如何使用Vue.js实现基本的CRUD操作的方法或教程。用户的问题是关于Vue.js的CRUD实现,我需要根据提供的引用和现有的知识来构建一个清晰的回答结构。 首先,用户提到的引用中有几个Vue相关的库,比如vue-json-schema、vue-awesome-form、vue-generator和vue-form-json。这些库可能与生成表单或页面有关,可能在实现CRUD时会用到。但用户可能需要的是基础的实现方法,而不是直接使用这些库。因此,我应该先提供基本的实现步骤,再提到这些库作为扩展选项。 接下来,引用2提到了tasks/pipeline.js的配置,这可能与项目的依赖管理有关。但不确定是否与CRUD直接相关,可能需要忽略或简要提及配置环境的重要性。 引用3提到<nuxt-link>组件,类似于Vue Router的<router-link>。这说明用户可能在使用Nuxt.js,或者在路由方面需要指导。CRUD通常需要前端路由来导航不同的页面,比如列表页、创建页、编辑页等。因此,在实现CRUD时,配置路由是重要的一步,需要详细说明如何使用Vue Router或Nuxt.js的路由功能。 现在,我需要整理实现CRUD的基本步骤。通常,CRUD涉及四个操作:创建、读取、更新、删除。在Vue.js中,通常的做法是: 1. 设置Vue项目和必要的依赖,如Vue Router、Axios(用于HTTP请求)。 2. 创建组件来显示数据列表(读取)、添加新数据(创建)、编辑数据(更新)。 3. 使用Vue Router管理不同视图之间的导航。 4. 通过Axios与后端API交互,发送GET、POST、PUT、DELETE请求。 5. 状态管理,可以使用Vuex或组件内的data属性来管理应用状态。 接下来,我需要检查用户提供的引用是否有相关内容。引用1中的库可以帮助生成表单,这可能简化创建和编辑表单的开发。例如,使用vue-form-json可以根据JSON生成带有验证的表单,这可能对用户有帮助,可以推荐作为优化步骤或替代方案。 引用3提到的<nuxt-link>说明用户可能在使用Nuxt.js,因此可能需要考虑SSR或静态站点的情况,但用户的问题更偏向基础CRUD,所以可能不需要深入Nuxt.js,但可以提到路由的配置方法,无论是Vue Router还是Nuxt.js。 在代码示例方面,需要展示如何定义组件、使用路由、发送HTTP请求。例如: - 使用Vue组件显示数据列表,使用v-for循环渲染条目。 - 添加表单组件,绑定数据到data属性,提交时调用Axios的POST方法。 - 编辑表单需要传递条目ID,使用Axios的PUT方法。 - 删除按钮触发DELETE请求。 状态管理部分,如果应用简单,可以使用组件内data;复杂的话建议使用Vuex,但根据用户需求,可能先展示组件内管理的方式。 此外,需要确保代码示例中的语法正确,比如使用$符号包裹行内公式(虽然CRUD可能不涉及数学公式,但根据系统指令,其他行内代码或变量可能需要正确格式)。 最后,生成相关问题,可能涉及性能优化、表单验证、与后端集成、状态管理选择等。 总结回答结构: 1. 项目初始化与依赖安装(Vue CLI, Vue Router, Axios) 2. 组件创建(列表、添加、编辑) 3. 路由配置(Vue Router或Nuxt的nuxt-link) 4. API交互(Axios示例代码) 5. 状态管理(Vuex或组件data) 6. 引用中的表单生成库作为优化选项 7. 相关问题:优化方法、表单验证、路由配置、状态管理对比等 需要确保回答中的代码示例正确,比如使用正确的Vue语法,Axios的方法调用,以及路由链接的使用。同时,引用中的库在适当的地方提及,比如在表单生成部分推荐vue-awesome-form或vue-form-json来简化表单创建。</think>以下是如何使用Vue.js实现基本CRUD操作的步骤说明: ### 一、项目初始化 1. 安装Vue CLI并创建项目: ```bash npm install -g @vue/cli vue create crud-app ``` 2. 添加必要依赖: ```bash npm install axios vue-router ``` ### 二、核心实现步骤 #### 1. 组件结构 ```html <!-- ListView.vue --> <template> <div> <button @click="showCreateForm">添加新条目</button> <ul> <li v-for="item in items" :key="item.id"> {{ item.name }} <button @click="editItem(item)">编辑</button> <button @click="deleteItem(item.id)">删除</button> </li> </ul> </div> </template> ``` #### 2. 路由配置(使用Vue Router) ```javascript // router.js import { createRouter, createWebHistory } from 'vue-router' import ListView from './views/ListView.vue' const routes = [ { path: '/', component: ListView }, { path: '/create', component: () => import('./views/CreateView.vue') }, { path: '/edit/:id', component: () => import('./views/EditView.vue') } ] const router = createRouter({ history: createWebHistory(), routes }) ``` #### 3. API交互(Axios示例) ```javascript // api.js import axios from 'axios' const api = axios.create({ baseURL: 'https://api.example.com', timeout: 5000 }) export default { async getItems() { const response = await api.get('/items') return response.data }, async createItem(item) { return await api.post('/items', item) } // 添加update和delete方法... } ``` #### 4. 表单验证(使用vue-form-json) ```javascript // CreateView.vue import FormGenerator from 'vue-form-json' export default { components: { FormGenerator }, data() { return { schema: { fields: [ { type: 'text', label: '名称', model: 'name', required: true } ] } } } } ``` ### 三、优化建议 1. 使用`vue-awesome-form`可快速生成带验证的复杂表单[^1] 2. 通过`vue-generator`自动生成路由配置[^1] 3. 采用Nuxt.js的`<nuxt-link>`实现服务端渲染导航[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值