Vue组件复杂表格高级编辑功能

news2024/11/27 16:52:11

Vue 组件复杂表格高级编辑功能

文章目录

  • Vue 组件复杂表格高级编辑功能
    • 1. sync 父子组件数据同步更新
    • 2. 在 el-table 中开发高级编辑表格功能
    • 3. 参考文献

在vue中组件的定义是希望组件可以做单一的功能,做到高复用,低耦合,所以父子组件之间的通信就比较关键,而在 vue 中 父组件传递给子组件的数据,子组件可以通过 props 接收,而 props 中的属性是不允许更改的,避免子组件直接操作父组件的数据。而有时候我么又需要变更子组件的数据,同时更新父组件的数据,当功能比较简单时,我们可以使用 sync 修饰符来更新父组件的数据。

简单的父子组件之间实时数据更新,可以采用 $emit(‘update:data’, data)1 的方式。

1. sync 父子组件数据同步更新

在这里插入图片描述

简单的父子组件之间的数据更新。

// 父组件
export default {
	data() {
		message: '父组件的消息!'
	}
}

将父组件中的 message 传递给子组件 child-component 中。

<!-- 父组件 -->
<child-component :message.sync="message"></child-component>

子组件中接收父组件从传递过来的消息。

<!-- child-component.vue -->
<div>{{ message }}</div>
<button @click="setMessage">点击</button>

在子组件中更新父组件中的数据并在子组件中显现。

// child-component.vue
export default {
	props: {
		message: {
			type: String,
			default: ''
		}
	},
	data() {
		return {}
	},
	methods: {
		setMessage() {
			this.$emit('update:meessage', '这是新的消息!')
		}
	}
}

当功能比较复杂时就需要其他方式了。

比如复杂的表格编辑功能

演示效果如下
在这里插入图片描述

2. 在 el-table 中开发高级编辑表格功能

<el-table :data="tableData" border>
	<el-table-column type="index" label="序号"></el-table-column>
	<el-table-column label="备注">
	    <template slot-scoped="{ row, $index }">
	        <child-component
	            v-if="row.is_edit"
	            :data="row"
	            @update:data="handleUpdate($event, index)"
	        ></child-component>
	        <!-- 普通文本 -->
	        <div v-else>{{ item.cellName }}</div>
	    </template>
	</el-table-column>
</el-table>
export default {
	data() {
        return {
            tableData: [
                { id: 1, cellType: 1, cellName: 'ZHANGSAN', cellId: -1 },
                { id: 2, cellType: 2, cellName: '张三', cellId: 1 },
                { id: 3, cellType: 3, cellName: 'zhangsan@example.com', cellId: 1 }
            ],
            userList: [
                { userId: 1, username: '张三' },
                { userId: 2, username: '李四' }
            ],
            emailList: [
                { emailId: 1, email: '张三' },
                { emailId: 2, email: '李四' }
            ]
        }
    },
    methods: {
        handleUpdate(update, index) {
            this.tableData[index].cellType = update.cellType
            this.tableData[index].cellId = update.cellId
            this.tableData[index].cellName = update.cellName
        }
    }
}
<template>
	<div>
	    <!-- 类型1:输入框 -->
	    <el-input v-show="row.cellType === 1" v-model="row.cellName" @input="handleChange"></el-input>
	    <!-- 类型2:选择框 -->
	    <el-select v-show="row.cellType === 2" v-model="row.cellId" @change="handleChangeUser">
	        <el-option v-for="(item, index) in userList" :value="item.userId" :label="item.username">
	    </el-select>
	    <!-- 类型3:选择框 -->
	    <el-select v-show="row.cellType === 3" v-model="row.cellId" @change="handleChangeEmail">
	        <el-option v-for="(item, index) in emailList" :value="item.emailId" :label="item.email">
	    </el-select>
	    <el-popover trigger="hover">
	        <el-radio-group v-model="row.cellType" @change="handleRadio">
	            <el-radio :label="1">其他</el-radio>
	            <el-radio :label="2">用户</el-radio>
	            <el-radio :label="3">邮箱</el-radio>
	        </el-radio-group>
	        <el-button slot="reference" type="text" icon="el-icon-more"></el-button>
	    </el-popover>
	</div>
</template>
export default {
	props: {
        data: { type: Object, default: () => { return {} } },
        userList: { type: Array, default: () => [] },
        emailList: { type: Array, default: () => [] }
    },
    data() {
        return {
            row: {
                cellType: 1,
                cellName: '',
                cellId: -1
            }
        }
    },
    methods: {
        handleChange(value) {
            this.$emit('update:data', this.row)
        },
        handleChangeUser(value) {
            this.row.cellName = this.userList.find(v => v.userId === value).username
            this.$emit('update:data', this.row)
        }
        handleChangeEmail(value) {
            this.row.cellName = this.emailList.find(v => v.emailId === value).email
            this.$emit('update:data', this.row)
        },
        handleRadio() {
            this.row.cellName = ''
            this.row.cellId = -1
            this.$emit('update:data', this.row)
        }
    }
}

3. 参考文献


  1. CSDN: .sync修饰符与$emit(update:xxx) ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/538018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每日一题/简单模拟题】2446. 判断两个事件是否存在冲突

⭐️前面的话⭐️ 本篇文章介绍【2446. 判断两个事件是否存在冲突】题解&#xff0c;算法标签&#xff1a;【模拟】&#xff0c;【字符串】&#xff0c;展示语言c/java。 &#x1f4d2;博客主页&#xff1a;未见花闻的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x…

某大学信息安全竞赛——栈迁移加强版——只溢出0x8,无限ROP

芝士题目&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1uwFlcSg94MuC2tPi-HCb9w 提取码&#xff1a;joj6 感悟&#xff1a; 之前我只做过溢出超过0x10这样的栈迁移&#xff0c;思路就是找机会去泄露栈空间的地址然后把栈迁移到我们可以控制的栈空间&#xff0c;亦…

Linux_证书_Openssl工具详解

文章目录 OpenSSLopenssl实现对称加密openssl生成密钥对、非对称加密、数字签名根据CA颁布证书生成ca私钥和ca证书根据ca生成证书 小结 OpenSSL OpenSSL 是一个开源项目&#xff0c;其组成主要包括一下三个组件&#xff1a; openssl&#xff1a;多用途的命令行工具 libcrypt…

【滤波专题-第7篇】“类EMD”算法分解后要怎样使用(3)——EMD降噪方法及MATLAB代码实现

使用EMD分解&#xff08;以及其他“类EMD”分解方法&#xff0c;以下为了简便统称EMD&#xff09;做信号降噪&#xff0c;是EMD的一个比较重要的应用方向。EMD可以将复杂的信号分解为一系列的固有模态函数&#xff08;IMFs&#xff09;&#xff0c;每一个IMF都包含了信号的一部…

“源擎”攻破银行核心系统建设痛点

银行业作为操作密集、数据密集、风险密集的行业&#xff0c;在向云转型的过程中面临着诸多独特的挑战&#xff0c;如银行需要具备不间断的业务创新能力&#xff0c;而不被系统开发周期制约&#xff1b;单一系统的开发和升级方式&#xff0c;越来越难以满足日益综合化的业务创新…

chatgpt赋能Python-pycharm关联python

Pycharm关联Python的介绍 Pycharm是一种非常流行的Python集成开发环境&#xff0c;开发人员可以在其中编写、调试和运行Python代码。Pycharm具有许多有用的功能&#xff0c;这些功能可以大大提高代码的效率和质量。其中一个最重要的功能是Pycharm如何关联Python&#xff0c;这…

HTB靶机012-Valentine-WP

012-Valentine 靶机IP&#xff1a;10.10.10.79 Scan nmap端口扫描&#xff1a; ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.79 -F Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-29 00:47 CST Nmap scan report for 10.10.10.79 Host is up (0.30s…

chatgpt赋能Python-pycharm和python关联

PyCharm与Python&#xff1a;超越代码编写的完美结合 如果你是一位Python开发者&#xff0c;那么你肯定需要一个好用的开发环境&#xff0c;以便快速且高效地完成代码任务。而PyCharm就是这样一个优秀的Python开发IDE。它专注于提高Python开发速度和质量&#xff0c;让Python编…

Flowable 生成的表都是干嘛的?(一)

一.简介 Flowable 默认一共生成了 79 张数据表&#xff0c;了解这些数据表&#xff0c;有助于我们更好的理解 Flowable 中的各种 API。 接下来我们就对这 79 张表进行一个简单的分类整理。 ACT_APP_*&#xff08;5&#xff09;ACT_CMMN_*&#xff08;12&#xff09;ACT_CO_*…

chatgpt赋能Python-pycharm取消所有断点

Pycharm取消所有断点&#xff1a;提高编程效率的必备技巧 Pycharm作为Python程序员必备的开发工具之一&#xff0c;其强大的调试功能广受好评。但是&#xff0c;在开发过程中&#xff0c;我们可能会设置过多的断点或者设置了错误的断点&#xff0c;这样会让程序的运行速度变慢…

Java面向对象程序设计实验报告(实验四 抽象类的练习)

✨作者&#xff1a;命运之光 ✨专栏&#xff1a;Java面向对象程序设计实验报告 ​ 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录&#xff1a;源程序代码&#xff08;带注释&#xff09; demo4类 Car类 Circle类 Shape…

谷歌chrome浏览器无法自动播放video标签视频的问题

问题根源详见&#xff1a;Chrome中的自动播放政策>> https://developer.chrome.com/blog/autoplay/ The Autoplay Policy launched in Chrome 66 for audio and video elements and is effectively blocking roughly half of unwanted media autoplays in Chrome. For t…

基于数组实现的顺序表(SeqList)

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 它的详细定义如下&#xff1a; 顺序表是一种数据结构&#xff0c;用于存储一组具有相同数据类型的元素&#xff0c;并按照元素在内存中的…

数据库【库,表操作】

目录 简单了解1.连接数据库服务器2.创建数据库3.创建表4.使用数据库5.数据库框架6.SQL的分类7.存储引擎 库操作1.创建数据库2.查看系统默认字符集以及校验规则3.查看数据库支持的字符集和校验规则4.查看数据库5.显示数据库语句6.删除数据库7.修改数据库8.备份和恢复9.查看连接情…

20 SQL——多表查询 (消除无效笛卡尔积)

create table dept(id int primary key auto_increment,name varchar(15))comment 部门;insert into dept(id, name) values (1,研发部),(2,市场部),(3,财务部),(4,销售部),(5,总经办),(6,人事部);create table staff (id int primary key auto_increment commentID,name …

【面试篇】Redis持久化面试题

文章目录 Redis持久化&#x1f64e;‍♂️面试官&#xff1a;什么是Redis持久化&#xff1f; AOF日志AOF日志原理&#x1f64e;‍♂️面试官&#xff1a;AOF日志是怎么工作的/AOF写入磁盘的流程&#xff1f;&#x1f64e;‍♂️面试官&#xff1a; 刚刚说到了Redis先执行写入的…

Discourse Math 插件

概述Discourse Math 使用 MathJax (默认) 或者 KaTeX 来让你在你的 Discourse 中使用数学公式。 仓库链接GitHub - discourse/discourse-math: Official MathJax support for Discourse Install Guide如何在 Discourse 中安装插件 这个插件是 Discourse 官方提供的插件&#x…

javascript基础一:Javscript数组的常用方法有哪些?

在日常开发中&#xff0c;我们对数组可以说操作最多&#xff0c;这里我们来整理下数组的一下最常用的方法 数组基本操作可以归纳为 增、删、改、查&#xff0c;需要留意的是哪些方法会对原数组产生影响&#xff0c;哪些方法不会 下面对数组常用的操作方法做一个归纳 一、基本…

ChatGPT国内免费使用的方法有哪些?

目录 一、ChatGpt是什么&#xff1f; 二、ChatGPT国内免费使用的方法&#xff1a; 第一点&#xff1a;电脑端 第二点&#xff1a;手机端 三、结语&#xff1a; 一、ChatGpt是什么&#xff1f; ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…

【C++数据结构】二叉搜索树的使用和模拟实现及其应用--K模型和KV模型

文章目录 一、二叉搜索树的概念二、二叉搜索树的操作及其实现(非递归)1.二叉搜索树节点和类的定义2.二叉搜索树的构造函数3.二叉搜索树的拷贝构造4.二叉树搜索树的赋值重载5.二叉搜索树的析构函数6.二叉搜索树的中序遍历7.二叉搜索树的查找8.二叉搜索树的插入9.二叉搜索树的删除…