Vue3中的element-plus表格实现代码

 更新时间:2024年05月05日 10:51:35   作者:G24gg  
这篇文章主要介绍了Vue3中的element-plus表格实现代码,用组件属性实现跳转路由,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下

一、element-plus

1.用组件属性实现跳转路由

<el-menu 
active-text-color="#ffd04b" 
background-color="#232323" 
:default-active="$route.path" //高亮
text-color="#fff"
        router>
        <el-menu-item index="/article/channel">
          <el-icon>
            <Management />
          </el-icon>
          <span>文章分类</span>
        </el-menu-item>

2. el-card 组件

<template>
  <el-card class="page-container">
    <template #header>
      <div class="header">
        <span>文章分类</span>
        <div class="extra">
          <el-button type="primary">添加分类</el-button>
        </div>
      </div>
    </template>
    ...
  </el-card>
</template>
<style lang="scss" scoped>
.page-container {
  min-height: 100%;
  box-sizing: border-box;
  .header {
    display: flex;
    align-items: center;
    justify-content: space-between;
  }
}
</style>

考虑到多个页面复用,封装成组件

  • props 定制标题
  • 默认插槽 default 定制内容主体
  • 具名插槽 extra 定制头部右侧额外的按钮
  • <slot>
<script setup>
defineProps({
  title: {
    required: true,
    type: String
  }
})
</script>
<template>
  <el-card class="page-container">
    <template #header>
      <div class="header">
        <span>{{ title }}</span>
        <div class="extra">
          <slot name="extra"></slot>
        </div>
      </div>
    </template>
    <slot></slot>
  </el-card>
</template>

页面内使用

<template>
  <page-container title="文章分类">
    <template #extra>
      <el-button type="primary"> 添加分类 </el-button>
    </template>
    主体部分
  </page-container>
</template>

3.el-表格(重要)

第一步先调通借口返回数据

第二步封装组件

详情看官网

<el-table :data="channelList" style="width: 100%">
  <el-table-column label="序号" width="100" type="index"> </el-table-column>
  <el-table-column label="分类名称" prop="cate_name"></el-table-column>
  <el-table-column label="分类别名" prop="cate_alias"></el-table-column>
  <el-table-column label="操作" width="100">
    <template #default="{ row }">
      <el-button
        :icon="Edit"
        circle
        plain
        type="primary"
        @click="onEditChannel(row)"
      ></el-button>
      <el-button
        :icon="Delete"
        circle
        plain
        type="danger"
        @click="onDelChannel(row)"
      ></el-button>
    </template>
  </el-table-column>
  <template #empty>
    <el-empty description="没有数据" />
  </template>
</el-table>
const onEditChannel = (row) => {
  console.log(row)
}
const onDelChannel = (row) => {
  console.log(row)
}

4.封装弹层

<script setup>
import { ref } from 'vue'
const dialogVisible = ref(false)
const open = async (row) => {
  dialogVisible.value = true
  console.log(row)
}
defineExpose({
  open
})
</script>
<template>
  <el-dialog v-model="dialogVisible" title="添加弹层" width="30%">
    <div>我是内容部分</div>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary"> 确认 </el-button>
      </span>
    </template>
  </el-dialog>
</template>

二、封装公共组件,下拉菜单

1.新建 article/components/ChannelSelect.vue

<template>
  <el-select>
    <el-option label="新闻" value="新闻"></el-option>
    <el-option label="体育" value="体育"></el-option>
  </el-select>
</template>

2.页面中导入渲染

import ChannelSelect from './components/ChannelSelect.vue'
<el-form-item label="文章分类:">
  <channel-select></channel-select>
</el-form-item>

3.调用接口,动态渲染下拉分类,设计成 v-model 的使用方式

<script setup>
import { artGetChannelsService } from '@/api/article'
import { ref } from 'vue'
defineProps({//子组件接收
  modelValue: {
    type: [Number, String]
  }
})
const emit = defineEmits(['update:modelValue'])//提交父组件方法
const channelList = ref([])//定义数组动态渲染
const getChannelList = async () => {
  const res = await artGetChannelsService()
  channelList.value = res.data.data
}
getChannelList()
</script>
<template>
  <el-select//拆解方法
    :modelValue="modelValue"
    @update:modelValue="emit('update:modelValue', $event)"
  >
    <el-option//动态渲染
      v-for="channel in channelList"
      :key="channel.id"
      :label="channel.cate_name"
      :value="channel.id"
    ></el-option>
  </el-select>
</template>

注意:这里一定要使用大驼峰命名,不然会报错

4.父组件定义参数绑定

const params = ref({//父组件定义数据
  pagenum: 1,
  pagesize: 5,
  cate_id: '',
  state: ''
})
<channel-select v-model="params.cate_id"></channel-select>//拆分开就是子组件的updata方法

vue2和Vue3v-model区别

  • 在Vue 2和Vue 3中,v-model的使用和行为大体上是相似的,都是用来创建表单输入和应用状态之间的双向数据绑定。不过,随着Vue 3的推出,有一些细微的差别和改进:

Vue 2 中的 v-model

  • 基于对象属性:Vue 2 使用 v-model 实现双向绑定时,实际上是在使用 value 属性和 input 事件的一个语法糖。
  • 组件实现:自定义组件需要定义 value 属性和 input 事件来配合 v-model 的工作。
  • model 选项:在Vue 2的自定义组件中,可以使用 model 选项来指定一个自定义的事件,而不是默认的 input 事件。

Vue 3 中的 v-model

  • 基于 createModel 函数:Vue 3 引入了一个新的 createModel 函数,它允许更灵活的双向绑定实现。
  • 组件实现改进:自定义组件可以使用 modelValue 属性和 update:modelValue 事件来代替Vue 2中的 value 和 input
  • 模板中的变化:在Vue 3的模板中,应该使用 update:modelValue 来监听更新事件,如上一个警告信息所述,这要求使用全小写并用连字符分隔的事件名。
  • 性能优化:Vue 3中的 v-model 可以利用Vue 3的性能优化,例如通过避免不必要的渲染来提高效率。

共同点

  • 在两种版本中,v-model 都是用于创建用户输入和应用状态之间的同步。
  • 它们都允许开发者在模板中以一种简洁的方式处理表单输入和应用状态的绑定。

迁移注意事项

如果你正在从Vue 2迁移到Vue 3,需要注意以下几点:

  • 确保在Vue 3中将 v-model 的更新事件监听器更改为使用全小写的连字符命名法,如 update:modelValue
  • 自定义组件可能需要更新以使用新的 modelValue 属性和 update:modelValue 事件。
  • 利用Vue 3的组合式API(如 refreactive)来更好地管理响应式状态。

总的来说,v-model 在Vue 2和Vue 3中的核心概念保持不变,但Vue 3对其进行了一些现代化的改进和优化。

三、el-表格(进阶)

1.封装格式化日期工具函数

1.新建 utils/format.js 封装格式化日期函数

import { dayjs } from 'element-plus'
export const formatTime = (time) => dayjs(time).format('YYYY年MM月DD日')

2.导入使用 import { formatTime } from '@/utils/format'

注意这里要用插槽,

 <el-table-column label="发表时间" prop="pub_date">
        <template #default="{ row }">
          {{ formatTime(row.pub_date) }}
        </template>
      </el-table-column>

2.分页渲染 [element-plus 分页]

1.分页组件

<el-pagination
  v-model:current-page="params.pagenum"
  v-model:page-size="params.pagesize"
  :page-sizes="[2, 3, 4, 5, 10]"
  layout="jumper, total, sizes, prev, pager, next"
  background
  :total="total"
  @size-change="onSizeChange"
  @current-change="onCurrentChange"
  style="margin-top: 20px; justify-content: flex-end"
/>
const onSizeChange = (size) => {
  params.value.pagenum = 1
  params.value.pagesize = size
  getArticleList()
}
const onCurrentChange = (page) => {
  params.value.pagenum = page
  getArticleList()
}

2.提供分页修改逻辑

loading效果

到此这篇关于Vue3中的element-plus表格的文章就介绍到这了,更多相关Vue3 element-plus表格内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue中transition标签的基本使用教程

    Vue中transition标签的基本使用教程

    Vue提供了transition的封装组件,可以给任何元素和组件添加进入/离开过渡,下面这篇文章主要给大家介绍了关于Vue中transition标签基本使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Vue.js第四天学习笔记(组件)

    Vue.js第四天学习笔记(组件)

    这篇文章主要为大家详细介绍了Vue.js第四天的学习笔记,一个简单的组件示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解

    vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解

    这篇文章主要介绍了vue 百度地图(vue-baidu-map)绘制方向箭头折线,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • vue uniapp实现分段器效果

    vue uniapp实现分段器效果

    这篇文章主要为大家详细介绍了vue uniapp实现分段器效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • vue实现全匹配搜索列表内容

    vue实现全匹配搜索列表内容

    这篇文章主要为大家详细介绍了vue实现全匹配搜索列表内容,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • Vue2.0 实现移动端图片上传功能

    Vue2.0 实现移动端图片上传功能

    本文主要介绍VUE2.0图片上传功能的实现。原理是通过js控制和input标签的方式完成这一效果,无需加载其他组件。具体实例大家大家参考下本文
    2018-05-05
  • Vue3 Watch踩坑实战之watch监听无效

    Vue3 Watch踩坑实战之watch监听无效

    Vue.js中的watch选项用于监听Vue实例上某个特定的数据变化,下面这篇文章主要给大家介绍了关于Vue3 Watch踩坑实战之watch监听无效的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • vue mixins代码复用的项目实践

    vue mixins代码复用的项目实践

    本文主要介绍了vue mixins代码复用的项目实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • vue3.0封装轮播图组件的步骤

    vue3.0封装轮播图组件的步骤

    这篇文章主要介绍了vue3.0封装轮播图组件的步骤,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下
    2021-03-03
  • vue3父组件调用子组件的方法例子

    vue3父组件调用子组件的方法例子

    这篇文章主要给大家介绍了关于vue3父组件调用子组件的方法例子,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-07-07

最新评论