vue3组件小结table案例经典!

44 篇文章 0 订阅
17 篇文章 6 订阅

table案例

前言在这里插入图片描述

这篇文章介绍vue组件总结的一个table案例!
主要实现axios请求数据,然后渲染到页面,删除当前列表,以及Tag标签,按钮和输入框按需展示,按键修饰符等等。。。
看完不会你打我。哈哈哈,开玩笑的,不多说,上刺刀!!

实现步骤

① 搭建项目的基本结构

② 请求商品列表的数据

③ 封装 MyTable 组件

④ 实现删除功能

⑤ 实现添加标签的功能

1. 搭建项目基本结构

1.1 初始化项目

  1. 在终端运行如下的命令,初始化 vite 项目:
npm init vite-app table-demo
  1. cd 到项目根目录,安装依赖项:
npm install
  1. 安装 less 依赖包:
npm i less -D
  1. 使用 vscode 打开项目,并在 vscode 集成的终端下运行如下的命令,把项目运行起来:
npm run dev

5.安装 axios:

npm install axios@0.21.0 -S

1.2 梳理项目结构

在这里插入图片描述

2. 代码部分

main.js 代码:

import { createApp } from 'vue'
import App from './App.vue'

import axios from 'axios'

import './assets/css/bootstrap.css'
import './index.css'

// 配置axios请求根路径
axios.defaults.baseURL = 'https://www.escook.cn'

const app = createApp(App)

// 将axios挂载到全局
app.config.globalProperties.$http = axios


app.mount('#app')

index.css 代码:

:root {
 font-size: 12px; 
}
body {
 padding: 8px; 
}

MyTable 组件的封装要求

  1. 用户通过名为 data 的 prop 属性,为 MyTable.vue 组件指定数据源

  2. 在 MyTable.vue 组件中,预留名称为 header 的具名插槽

  3. 在 MyTable.vue 组件中,预留名称为 body 的作用域插槽

MyTable.vue 代码:

<template>
  <div>MyTable 组件</div>
  <div>
    <table class="table table-striped">
      <thead>
        <tr>
          <slot name="header"></slot>
        </tr>
      </thead>
      <tbody>
        <tr v-for="(item , index) in data" :key="item.id">
          <!-- 为数据行的 td 预留的“作用域插槽” -->
          <slot name="body" :row="item" :index="index"></slot>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>

export default {
  name: "MyTable",
  props: {
    // 表格的数据源
    data: {
      type: Array,
      default: [],
      require: true,
    },
  },
}
</script>

app.vue 代码:

<template>
  <h2>app根组件</h2>
  <MyTable :data="tablelist">
    <template #header>
      <th>#</th>
      <th>商品名称</th>
      <th>价格</th>
      <th>标签</th>
      <th>操作</th>
    </template>
    <template #body="{row,index}">
      <td>{{ index + 1 }}</td>
      <td>{{ row.goods_name }}</td>
      <td>¥{{ row.goods_price }}</td>
      <td class="mytags">
        <!-- 循环渲染标签信息 -->
        <input 
        type="text" 
        class="form-control form-control-sm ipt-tag" 
        v-focus 
        v-if="row.inputVisible"
        v-model.trim="row.inputValue"
        @blur="onInputConfirm(row)"
        @keyup.enter="onInputConfirm(row)"
        @keyup.esc="row.inputValue = ''"
        >
        <button type="button" class="btn btn-primary btn-sm" v-else @click="row.inputVisible = true">+Tag</button>
        <span class="badge badge-warning ml-2" v-for="item in row.tags" :key="item">{{ item }}</span>
      </td>
      <td>
        <button type="button" class="btn btn-danger btn-sm" @click="onRemove(row.id)">删除</button>
      </td>
    </template>
  </MyTable>
</template>

<script>
import MyTable from './components/my-table/MyTable.vue'

export default {
  name:'MyApp',
  components:{
    MyTable
  },
  data(){
    return{
      tablelist:[]
    }
  },
  created(){
    this.getlist()
  },
  methods: {
    async getlist(){
      const {data:res} = await this.$http('/api/goods')
      if(res.status!==0)return console.log('获取列表数据失败!')
      this.tablelist = res.data
    },
    // 删除功能
    onRemove(id){
      this.tablelist = this.tablelist.filter(x=>x.id !== id)
    },
    onInputConfirm(row){
      // 1. 把用户在文本框中输入的值,预先转存到常量 val 中
      const vla = row.inputValue
      // 2. 清空文本框的值
      row.inputValue = ''
      // 3. 隐藏文本框
      row.inputVisible = false
      // 1.1 判断 val 的值是否为空,如果为空,则不进行添加
      // 1.2 判断 val 的值是否已存在于 tags 数组中,防止重复添加
      if(!vla || row.tags.indexOf(vla) !== -1) return
        // 2. 将用户输入的内容,作为新标签 push 到当前行的 tags 数组中
        row.tags.push(vla)
    }
  },
  directives:{
    focus(el){
      el.focus()
    }
  }
}
</script>

<style lang="less" scoped>
.mytags{
  display: flex;
}
.form-control{
  width: 80px;
}
</style>

3. 功能演示

实现删除功能,单机即可删除当前项

在这里插入图片描述

实现添加标签的功能

回车或者input输入框失去焦点都判断,vla不为空,或者不重复,就添加到标签。

在这里插入图片描述

input失去焦点,标签添加,展示+Tag按钮。

在这里插入图片描述

写在最后

✨个人笔记博客✨

星月前端博客
http://blog.yhxweb.top/

✨原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️评论,你的意见是我进步的财富!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 Vue 3 中封装一个 table 组件,您需要做以下几步: 1. 定义组件:使用 Vue 3 的 defineComponent 函数定义组件。 2. 定义模板:使用 template 属性定义组件的 HTML 模板。 3. 定义数据:使用 props 属性定义组件所需的数据。 4. 定义方法:使用 methods 属性定义组件的方法。 5. 在组件中使用数据和方法:在模板中使用绑定和事件处理程序来使用数据和方法。 例如,下面是一个简单的 table 组件的示例: ``` import { defineComponent } from 'vue'; export default defineComponent({ name: 'MyTable', props: { rows: { type: Array, required: true } }, methods: { sort(column) { this.rows.sort((a, b) => a[column] > b[column]); } }, template: ` <table> <thead> <tr> <th v-for="column in columns" @click="sort(column)"> {{ column }} </th> </tr> </thead> <tbody> <tr v-for="row in rows"> <td v-for="column in columns"> {{ row[column] }} </td> </tr> </tbody> </table> ` }); ``` 这个组件使用了 props 来接收外部传入的 rows 数据,并使用 methods 定义了一个 sort 方法来排序 rows。在模板中,使用 v-for 指令来循环遍历 rows 和 columns,并使用 @click 指令来处理点击事件,调用 sort 方法。 ### 回答2: Vue3是一款轻量级的JavaScript框架,它允许开发者构建高效且易于维护的用户界面。在Vue3中,我们可以通过封装组件来实现代码的复用和模块化。现在我将用300字的篇幅来回答如何封装一个table组件。 首先,我们需要创建一个新的Vue组件,可以命名为Table。在Table组件中,我们可以通过props来接收传入的属性,例如表格的数据源和列定义。 接下来,我们可以在Table组件的模板中使用Vue的指令和语法来渲染表格。使用v-for指令可以遍历数据源,并根据列定义动态生成表头和表格内容。 在表头部分,我们可以遍历列定义数组,使用v-if指令来判断是否需要显示该列,并根据列定义中的标题属性来渲染表头文字。 在表格内容部分,我们可以利用v-for指令循环遍历数据源,并使用列定义中的字段属性来获取数据,并渲染表格内容。 在Table组件中,我们还可以添加一些事件处理函数,例如点击表头可以进行排序。使用Vue的事件绑定可以实现这一功能。 此外,我们还可以为Table组件添加一些样式,并通过CSS类名动态绑定来实现外部样式的自定义。 最后,我们可以在其他Vue组件中引入Table组件,并传入需要的属性值。这样就可以在应用中多次使用Table组件,实现代码的复用和模块化。 总结起来,封装一个table组件可以通过创建一个Vue组件,并利用Vue的指令和语法来动态渲染表格的表头和内容。通过props来接收传入的属性值,使用事件绑定来实现一些交互功能,还可以为组件添加样式。 ### 回答3: Vue3的封装Table组件可以通过以下步骤实现: 1. 创建一个Table组件的.vue文件,命名为Table.vue。 2. 在Table.vue中,定义组件的模板结构,包括表格的表头和表体。可以使用Vue3语法中的`<template>`标签来编写模板。 3. 定义Table组件的props属性,以接收父组件传入的数据。可以使用Vue3语法中的`<script setup>`标签来定义props。 4. 在Table.vue中,使用Vue3语法中的`<script setup>`标签,引入自定义的composable函数,用于获取和处理表格数据。可以使用Vue3提供的Composition API来编写composable函数。例如,可以使用`onMounted`函数来在组件挂载时获取数据,使用`computed`函数来计算表格的列数等。 5. 在Table.vue中,使用Vue3语法中的`<script setup>`标签,导出Table组件及其props属性。 6. 在父组件中,引入Table组件,并使用`<Table :data="tableData" />`的方式传递数据给Table组件。其中,tableData是父组件中定义的data属性,用于存储表格数据。 7. 在父组件中,可以使用`<script>`标签定义tableData属性,并赋初值。 通过以上步骤,我们可以完成Vue3中Table组件的封装。在实际使用中,可以根据具体需求对Table组件进行进一步的功能扩展和样式优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星月前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值