首页 > 其他分享 >vue + ele 下拉选择框和下拉多选选择框处理

vue + ele 下拉选择框和下拉多选选择框处理

时间:2023-08-01 11:55:14浏览次数:37  
标签:node leader vue const name 下拉多选 ele org id

效果图如下:

	<!-- 添加项目的弹框 -->
<el-dialog v-model="addDlg"  class="pro_dialog" title="添加项目" width="40%">
	<el-form :model="addForm">
		<el-form-item label="项目名"><el-input v-model="addForm.name" autocomplete="off" class="input-field"/></el-form-item>
		<el-form-item label="部门">
		<el-tree
		ref="departmentTreeRef"
		:data="departmentTree"
		:props="departmentTreeProps"
		show-checkbox
		highlight-current
		node-key="id"
		v-model="addForm.org"
		></el-tree>
		</el-form-item>
		<el-form-item label="负责人" >
			<el-select v-model="addForm.leader" autocomplete="off" multiple filterable class="input-field">
			<el-option 
			v-for="leader in filterLeaders" 
			:key="leader.id" 
			:label="leader.userName" 
			:value="leader.id"></el-option>
			</el-select>
		</el-form-item>
	</el-form>
	<template #footer>
		<span class="dialog-footer">
			<el-button @click="addDlg = false" size="mini">取消</el-button>
			<el-button type="primary" @click="addPro" size="mini">确定</el-button>
		</span>
	</template>
</el-dialog>

	// 获取所有用户
	async getLeaders() {
		try {
			const response = await this.$api.getUsers();
			this.leaders = response.data.result.records;
		} catch (error) {
			console.error(error);
		}},
	// 获取所有机构
	async getorgInfo() {
		try {
			const response = await this.$api.getOrgInfo();
			if (response.data.code === "0"){
				this.departmentTree = [response.data.result];
			}
		} catch (error) {
			console.error(error);
		}},
	// 点击进入项目
	clickView(pro) {
		// 将选中的项目信息保存的vuex
		this.selectPro(pro);
		// 路由跳转
		this.$router.push({ name: 'home' });
	},
	// 点击添加项目按钮
	clickAdd() {
		// 将添加表单置空
		this.addForm = {
			name: '',
			leader: [],
			org:[]
		};
		// 显示模态框
		this.addDlg = true;
	},
	// 点击编辑项目按钮
	clickEdit(item) {
		this.updateForm = {
			id:item.id,
			name:item.name,
			leader:item.leader.map(leader => leader.userId),
			org:item.org.map(org => this.findOrgNodeById(this.departmentTree,org.orgId))
		};
		this.defaultCheckedKeys =  this.updateForm.org.map(org => org.id);
		// 保存默认值
		const temp = [...this.defaultCheckedKeys];  
		this.updateDlg = true;
		this.$nextTick(() => {
			if (this.$refs.departmentTreeRef){
				// 用$refs清空已勾选的,否则不生效,重新勾选,
				this.$refs.departmentTreeRef.setCheckedKeys([]);
				this.defaultCheckedKeys = temp;
			}		
		})
	},
	// 点击删除按钮
	clickDelete(id) {
		ElMessageBox.confirm('确定要删除该项目吗?', '提示', {
			confirmButtonText: '确定',
			cancelButtonText: '取消',
			type: 'warning'
		})
			.then(() => {
				this.deletePro(id);
			})
			.catch(() => {
				ElMessage({
					type: 'info',
					message: '取消删除'
				});
			});
	},
	//在机构列表中根据id查找对应节点的label
	findOrgNodeById(nodes, id) {
		for (const node of nodes) {
		if (node.id === id) {
			return node;
		}
		// 递归查找子节点
		if (node.childOrg && node.childOrg.length > 0) {
			const foundNode = this.findOrgNodeById(node.childOrg, id);
			if (foundNode) {
			return foundNode;
			}}}
		return null;
	},
	// 添加项目
	async addPro() {
		// 获取选中的部门id
		const selectedOrgIds = this.$refs.departmentTreeRef.getCheckedNodes().map(node => node.id);
		//根据部门查找部门名称
		const selectedOrgLabels = selectedOrgIds.map(orgId => {
			const orgNode = this.findOrgNodeById(this.departmentTree, orgId);
			return orgNode && orgNode.name ? orgNode.name : "";
		});
		//组装部门数据
		const orgData = selectedOrgIds.map((id, index) => {
				return { orgId: id, orgName: selectedOrgLabels[index] };
				});
		//组装请求数据
		const data = {
			name: this.addForm.name,
			org:orgData,
			// 根据id获取用户名
			leader: this.addForm.leader.map(id => {
				const leaderinfo = this.leaders.find(leader => leader.id==id);
				return{
					userId:id,
					userName:leaderinfo.userName
				}})};
		const response = await this.$api.createProjects(data);
		if (response.status === 201) {
			this.$message({
				message: '添加成功!',
				type: 'success',
				duration: 1000
			});
			// 刷新页面数据
			this.getAllPro();
			this.addDlg = false;
		}},

接口返回的数据结构如下:

标签:node,leader,vue,const,name,下拉多选,ele,org,id
From: https://www.cnblogs.com/xchuan/p/17596081.html

相关文章

  • InfluxDB+TDengine+Telegraf+Grafana 搭建监控平台
    LinuxCentOS环境1.InstallInfluxDB(1)首先访问InfluxDB官网(点击访问),找到选择合适的版本参考文档:https://docs.influxdata.com/influxdb/v2.7/install/?t=Docker下载并运行InfluxDBv2.7dockerrun--nameinfluxdb-p8086:8086influxdb:2.7.0将数据持久化到InfluxD......
  • element-ui中的$comfirm点击取消后空格键和回车键依然执行删除操作
    原因: $comfirm会在上一次执行操作的按钮上自动聚焦选中如果这时点击回车或者空格键相当于又触发了一次删除按钮上的点击事件,而且默认回车和空格键会触发弹层上的确认按钮的点击事件,用户没有将鼠标定在确认按钮,这是组件自己封装的自动聚焦事件以及确认提交事件解决方法:强制取消键......
  • 使用elementui中el-input时无法输入问题
    因为要生成动态查询,所以想把查询字段转为动态添加的,然后使用el-input时候,发现el-input无法输入,然后打印出来的话就只能显示输入的第一个字符,后来查询了网上的办法发现,这是因为嵌套太深了,办法是需要$forceUpdate()强制刷新输入框:<el-inputstyle="width:150px;margin-top:......
  • 7种方法!教你如何使用Telerik UI for ASP.NET定制编辑器
    TelerikUIforASP.NETCore是用于跨平台响应式Web和云开发的最完整的UI工具集,拥有超过60个由KendoUI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格,提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。TelerikUIforASP.NETCore的编辑器是一个多功能的所......
  • vue 使用 eruda(移动端H5调试工具)
    <scriptsrc="https://cdn.bootcdn.net/ajax/libs/eruda/2.3.3/eruda.min.js"></script><script>eruda.init()</script> ......
  • vue中使用provide和inject依赖注入组件之间进行父子组件传值(也适用于嵌套路由)
      父组件中:provide:function(){return{reload:this.reload//父组件中的方法}}子组件中:inject:['reload']使用:this.reload()//也可传入参数......
  • Custom Elements 和 Shadow DOM了解一下?
    Why在最近参与的一个项目中,有使用Vue创建CustomElements的代码,与传统的单Vue实例render到DOM节点有很大不同。所以有了本文。CustomElements首先我们来看看怎么创建一个自定义元素,假如我们要实现一个抽屉元素:classAppDrawerElementextendsHTMLElement{...}win......
  • vue-scrollmagic 滚动动画制作插件
     1、需求:在做网站的时候、需要加一个根据页面滚动位置进行页面变化的效果。2、实现方案:自己写个滚动监听也不是很复杂、但是管理维护起来比较乱。所以直接找了这个插件官网:vue-scrollmagic、插件地址3、使用:安装npmivue-scrollmagic--save载入//main.jsimportV......
  • vue循环生成echarts图表
    1.效果图2.引入echartsnpminstallecharts--save3.main.js全局引入4.页面data数据是从后台接口中返回的,需要通过watch监听来获取created方法中获取到的数据。用mounted由于是异步调用,是获取不到created中的数据的。4.后台数据我这里是根据实际业务场景返回的map......
  • sqlserver SELECT显示和PRINT打印超长的字符
    步骤一:SSMS里返回的列值长度限制,问题没有解决步骤二:使用如下方式”Cast或FORXMLPATH;问题还是一样printCast(@AgentListastext)select@AgentListforxmlPath('')selectCAST(@AgentListasXML)分析问题:一直只显示50字符,最终找到问题所在,是定义的变量长度的问题,@Agen......