vue三级联动组件

news2024/11/18 5:32:29

背景

  • 项目中经常出现三级下拉框组件的要求,这种组件其中一级发生变化,子级的组件就会发生变化
  • 如果这一个组件,单独作为搜索条件使用,很好写,同时作为搜索条件和form回写组件,回显就比较困难

子组件代码

  • 将与父组件通信的属性定义在props中: 在这里插入图片描述
  • 定义三个handler处理值的变化 ,同时绑定在对应下拉框
    在这里插入图片描述
  • 对于prop的值,不可以直接在子组件中修改,只能通知父组件修改

在这里插入图片描述

  • 有时候子组件的根性有延迟,导致出现问题,可以使用父组件传递过来的值,或者使用next函数
    在这里插入图片描述
<script>
import {getSonMenuList} from "@/api/maintain/classfiy";

export default {
  name: "costClassify",
  props: {
    proProcedureId: Number,
    costElementId: Number,
    costPartitionId: Number,
  },
  data() {
    return {
      proProcedureList: [],
      costElementList: [],
      costPartitionList: [],
    };
  },
  watch: {},
  methods: {
    proProcedureIdHandler(value) {
      this.$emit('update:proProcedureId', value);

      this.costElementList = []
      // this.costElementId = null  避免这种操作 不要在子组件中直接修改prop的值, 一般来说,prop是不应该被修改的,它是父组件传递给子组件的数据,子组件应该保持对prop只读,不应该修改它的值。
      // 如果一定要修改,可以通过$emit事件的方式,通知父组件修改prop的值,再通过prop的值的变化,来触发子组件的重新渲染。
      this.costElementIdHandler(null)

      if (!value) {
        return
      }

      getSonMenuList(value).then((response) => {
        this.costElementList = response.data
      })
    },
    costElementIdHandler(value) {
      this.$emit('update:costElementId', value);

      this.costPartitionList = []
      // this.costPartitionId = null

      // 通知外层
      this.costPartitionIdHandler(null)

      if (!value) {

        return
      }
      getSonMenuList(value).then((response) => {
        this.costPartitionList = response.data
      })

    },
    costPartitionIdHandler(value) {
      this.$emit('update:costPartitionId', value);
      if (!value) {
        return
      }

    },
    // 初始化
    init() {
      console.log('costClassify init')
      console.log(this)
      // 获取一级目录  生产工序
      getSonMenuList(-1).then((response) => {
        this.proProcedureList = response.data
      })
      // 如果是打开的编辑页面  自带参数  需要初始化
      if (this.proProcedureId) {
        this.proProcedureIdHandler(this.proProcedureId)
      }
      if (this.costElementId) {
        this.costElementIdHandler(this.costElementId)
      }
      if (this.costPartitionId) {
        this.costPartitionIdHandler(this.costPartitionId)
      }
    },
    refresh(proProcedureId, costElementId, costPartitionId) {
      this.$nextTick(() =>{
        console.log('costClassify refresh')
        // 获取一级目录  生产工序
        getSonMenuList(-1).then((response) => {
          this.proProcedureList = response.data
        })
        // 如果是打开的编辑页面  自带参数  需要初始化
        if (proProcedureId) {
          getSonMenuList(proProcedureId).then((response) => {
            this.costElementList = response.data
          })
        }
        if (costElementId) {
          console.log('三级列表执行'+costElementId)
          getSonMenuList(costElementId).then((response) => {
            this.costPartitionList = response.data
          })
          console.log('三级列表执行成功')
        }
        if (costPartitionId) {

        }
      })

    }
  },
  mounted() {
    console.log('costClassify mounted')
    this.init()
  },
};

</script>

<template>
  <span>
    <el-form-item label="生产工序" prop="proProcedureId">
      <el-select v-model="proProcedureId" placeholder="请输入生产工序" clearable size="mini"
                 @change="proProcedureIdHandler">
        <el-option v-for="proProcedure in proProcedureList" :key="proProcedure.id" :label="proProcedure.name"
                   :value="proProcedure.id"/>
      </el-select>
    </el-form-item>
    <el-form-item label="成本要素" prop="costElementId">
      <el-select v-model="costElementId" placeholder="请输入成本要素" clearable size="mini"
                 @change="costElementIdHandler">
        <el-option v-for="costElement in costElementList" :key="costElement.id" :label="costElement.name"
                   :value="costElement.id"/>
      </el-select>
    </el-form-item>
    <el-form-item label="费用细分" prop="costPartitionId">
      <el-select v-model="costPartitionId" placeholder="请输入费用细分" clearable size="mini"
                 @change="costPartitionIdHandler">
        <el-option v-for="costPartition in costPartitionList" :key="costPartition.id" :label="costPartition.name"
                   :value="costPartition.id"/>
      </el-select>
    </el-form-item>
  </span>
</template>

<style scoped lang="scss">

</style>

父组件调用

  • refs获取子组件的引用
  • 第一次的时候子组件没有渲染完毕,找不到refresh函数,要使用nextTick延迟调用
/** 修改按钮操作 */
handleUpdate(row) {
  this.reset();
  const id = row.id || this.ids
  this.form = Object.assign({}, row);
  this.open = true;
  this.editFlag = true;
  this.title = "修改月度费用";
  console.log(this.form.proProcedureId, this.form.costElementId, this.form.costPartitionId)
  this.$nextTick(() => {
    this.$refs.costClassifyRef.refresh(this.form.proProcedureId, this.form.costElementId, this.form.costPartitionId);
  })
},

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

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

相关文章

2.搜索游戏中不可见的数据坐标

内容参考于&#xff1a; 易道云信息技术研究院VIP课 首先一般游戏在设计时会把人物相关的属性放到一起&#xff0c;在 1.搜索游戏中的数据与环境搭建 里也能证实&#xff0c;角色的等级、攻击力、生命值、经验等它们的内存地址都是相差4字节也就是用int类型存储的&#xff0c;…

简单的TCP网络程序:英译汉服务器

一、服务器的初始化 下面介绍程序中用到的socket API,这些函数都在sys/socket.h中。 1.创建套接字 socket()&#xff1a; ⭐参数介绍&#xff1a; socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符;应用程序可以像读写文件一样用read/write在网…

AIGC实践|探索用AI实现小游戏开发全流程

前言&#xff1a; 在上一篇中&#xff0c;我们已经深入探讨了AI工具在动态绘本创作中的应用&#xff0c;体验了AI在创意内容生成上的魅力。本篇文章将带领大家进入一个全新的探索领域——游戏开发。 本文将详细介绍如何利用AI工具探索实现游戏开发的全过程&#xff0c;从概念…

提升代码简洁,MVEL 表达式和责任链设计模式应用实践

导读 本文主要讲解了MVEL表达式和责任链设计模式相结合一起的消息处理解决方案设计、解耦消息处理节点以及方便代码维护扩展。通过“订单拆单消息”的接入作为具体实践案例&#xff0c;简要阐述了MVEL表达式和Apache Chain职责链设计模式应用场景。希望通过本文&#xff0c;读…

【C/C++笔试练习】TCP、IP广播、ARP协议、IP路由器、MAC协议、三次握手、TCP/IP、子网划分年、会抽奖、抄送列表

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;TCP&#xff08;2&#xff09;IP广播&#xff08;3&#xff09;ARP协议&#xff08;4&#xff09;IP路由器&#xff08;5&#xff09;MAC协议&#xff08;6&#xff09;三次握手&#xff08;7&#xff09;TCP/IP&#xf…

Vue 3入门指南

title: Vue 3入门指南 date: 2024/5/23 19:37:34 updated: 2024/5/23 19:37:34 categories: 前端开发 tags: 框架对比环境搭建基础语法组件开发响应式系统状态管理路由配置 第1章&#xff1a;Vue 3简介 1.1 Vue.js的历史与发展 Vue.js由前谷歌工程师尤雨溪&#xff08;Eva…

JVM学习-垃圾回收(三)

System.gc 通过System.gc()或Runtime.getRuntime().gc()的调用&#xff0c;会显示触发Full GC&#xff0c;同时对老年代和方法区进行回收&#xff0c;尝试释放被丢弃对象占用的内存然后System.gc()调用附带一个免责声明&#xff0c;无法保证对垃圾收集器的调用JVM实现者可以通…

第3天 Web源码拓展_小迪网络安全笔记

1.关于web源码目录结构 #数据库配置文件 后台目录 模板目录 数据库目录 1.1数据库配置文件: 1.1就拿wordpress来说,先到官网下载源码:Download – WordPress.org,解压源码之后: 2.2找到目录下名为 wp-config-sample.php的文件,这就是数据库配置文件: 设想: 我们在渗透…

K8S集群再搭建

前述&#xff1a;总体是非常简单的&#xff0c;就是过程繁琐&#xff0c;不过都是些重复的操作 master成员: [controller-manager, scheduler, api-server, etcd, proxy,kubelet] node成员: [kubelet, proxy] master要修改的配置文件有 1. vi /etc/etcd/etcd.conf # 数…

【Linux取经路】一个简单的日志模块

文章目录 一、可变参数的使用二、Log2.1 日志打印2.1.1 时间获取2.1.2 日志分块打印 2.2 打印模式选择2.3 Log 使用样例2.4 Log 完整源码 三、结语 一、可变参数的使用 int sum(int n, ...) {va_list s; // va_list 本质上就是一个指针va_start(s, n); int sum 0;while(n){su…

vue3 + antd-vue@4 a-table单元格合并,rowSpan(行合并),colSpan(列合并)详解, 表头合并详解, 表头自定义详解

一、解释 1、rowSpan 1&#xff09;、行合并 2&#xff09;、当为0时&#xff1a;去掉边框 3&#xff09;、当为1时&#xff1a;不合并 4&#xff09;、大于1的x时&#xff1a;包含当前单元格行合并x个单元格 2、colSpan 1&#xff09;、列合并 2&#xff09;、当为0时&#xf…

反序列化漏洞(JBoss、apache log4、apache Shiro、JWT)Weblogic未授权访问、代码执行、任意上传

1.1什么是反序列化 就是把一个对象变成可以传输的字符串&#xff0c;目的就是为了方便传输。假设&#xff0c;我们写了一个class&#xff0c;这个class里面存有一些变量。当这个class被实例化了之后&#xff0c;在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到…

CTF网络安全大赛简单web题目:eval

题目来源于&#xff1a;bugku 题目难度&#xff1a;简单 一道简单web的题目 题目源代码&#xff1a; <?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?> 这个PHP脚本有几个关键部分&#xff0c;但…

Salesforce ADFS SSO 配置

1.set up 中 Certificate and Key Management创建认证 2.setup中Single Sign-On Settings新建SSO&#xff0c;输入必填 3.setup中My Domain Settings设置登录跳转&#xff1a; 最后将Single Sign-On Settings中metadata.xml下载下来给ADFS端使用&#xff1a; 最后效果&#xff…

快手二面准备【面试准备】

快手二面准备【面试准备】 前言版权快手二面准备秋招一面中的问题实习一面中的问题计算机网络和操作系统论坛项目登录注册ThreadLocal代替session存储用户秒杀项目登录注册->阿里验证码->rpcsession为什么改为token实现&#xff0c;redis存储用户信息由binlog的用法->…

新火种AI|净利润上升628%,英伟达财报说明AI热潮还将持续

作者&#xff1a;一号 编辑&#xff1a;美美 AI大潮仍未放缓&#xff0c;英伟达再次超越预期。 今天凌晨&#xff0c;全球AI算力芯片龙头&#xff0c;被称为“AI时代卖铲人”的英伟达&#xff0c;正式公布了截至2024年4月28日的2025财年第一财季财报&#xff0c;其中第一财季…

【九十三】【算法分析与设计】719. 找出第 K 小的数对距离,N 台电脑的最长时间,二分答案法

719. 找出第 K 小的数对距离 - 力扣&#xff08;LeetCode&#xff09; 数对 (a,b) 由整数 a 和 b 组成&#xff0c;其数对距离定义为 a 和 b 的绝对差值。 给你一个整数数组 nums 和一个整数 k &#xff0c;数对由 nums[i] 和 nums[j] 组成且满足 0 < i < j < nums.le…

uniapp星空效果

uniapp星空效果 背景实现思路代码实现尾巴 背景 之前在网上看到过一个视频&#xff0c;使用纯css实现过一个星空效果。具体出处找不到了&#xff0c;我们按照他那个思路来实现一个类似的效果&#xff0c;还是先上一张图镇楼&#xff1a; 实现思路 首先我们这个效果使用的是…

es数据备份和迁移Elasticsearch

Elasticsearch数据备份与恢复 前提 # 注意&#xff1a; 1.在进行本地备份时使用--type需要备份索引和数据&#xff08;mapping,data&#xff09; 2.在将数据备份到另外一台ES节点时需要比本地备份多备份一种数据类型&#xff08;analyzer,mapping,data,template&#xff09; …

JAVA开发面试超详细

一、Java 基础 1.JDK 和 JRE 有什么区别&#xff1f; jdk&#xff1a;java development kit jre&#xff1a;java runtime Environment jdk是面向开发人员的&#xff0c;是开发工具包&#xff0c;包括开发人员需要用到的一些类。 jre是java运行时环境&#xff0c;包括java虚拟机…