【3】Vite Vue3 用户、角色、岗位选择组件封装

news2024/11/27 14:41:40

在当今前端开发的领域里,快速、高效的项目构建工具以及使用最新技术栈是非常关键的。Vite+Vue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。

作为下一代前端构建工具,Vite 在开发中的启动速度和热重载方面具有突出的优势。而Vue3,则以更加简化的API和更高效的响应式系统为开发者带来了更加流畅的开发体验。结合使用Vite和Vue3,你将能够快速搭建稳定、高效的前端项目。

在这个专栏里,我们将通过100+个实战示例,详细介绍Vite+Vue3的各个方面。从项目的创建和配置开始,我们会一步一步地引导你使用Vite搭建项目的基本框架,并深入讲解Vue3的语法和特性。随后,我们将演示如何构建常见的前端组件、路由管理和状态管理,以及与后端API的交互等实际项目开发中常见的场景。

无论你是从零开始学习Vite+Vue3,还是希望进一步提升你的前端开发能力,本专栏都能为你提供实用的知识和实战经验。通过这100+个实战示例的学习,你将能够掌握Vite+Vue3的核心概念和技术,并能够在实际项目中灵活应用。

赶快加入我们吧,开始你的Vite+Vue3项目实战之旅!

一、介绍 ✨ ✨ ✨

用户、角色、岗位、组织等等是我们在项目中最常见的一个选择。每一个组件的实现方式可能也不一样,用户的话可能是一个列表的展示,进行单选多选。
而组织可能是树节点的形式。但不管是哪一种封装的逻辑基本都是一样的。我们需要一个展示框,展示用户选择的数据。同时展示框可以进行点击弹出需要选择的数据。
对于组件来说,无非就是弹出框中展示的数据不一样。本文我们就讲解如何通过一个input框进行用户选择的组件封装。

二、为什么要进行组件封装 🌟 🌟 🌟

1、代码复用 👇 👇

将相似的功能封装成组件可以实现代码复用,减少重复编写类似的代码。这样可以提高开发效率,减少出错的可能性。

2、维护方便 👇 👇

组件化开发可以将复杂的功能拆分成多个小的、独立的模块。这样每个模块可以独自开发和维护,便于团队协作和代码的管理。

3、可拓展性 👇 👇

通过封装成组件,可以将用户、角色和岗位选择器与其他功能模块进行解耦,使系统更加灵活和可拓展。如果以后需求变更或要添加新的选择器,只需修改或新增相应的组件,而不需要改动整个系统的代码。

4、可定制性 👇 👇

组件化开发使得用户、角色和岗位选择器的样式、功能和行为都可以自定义。开发人员可以通过提供组件API,让用户自行配置和定制选择器的外观和行为。


总的来说就是有助于提高开发效率、模块化管理、解耦和可拓展性,同时也增加了系统的灵活性和可定制性。

三、完整代码示例 👇 👇

1、组件封装 👇 👇

<!---------------- 弹框选择组件 ---------------->
<template>
    <div>
        <el-input v-model="modelValue">
            <template #prepend>
                <el-button>
                    <i-carbon-user-avatar />
                </el-button>
            </template>
            <template #append>
                <el-button @click="openDialog">
                    <i-carbon-search />
                </el-button>
            </template>
        </el-input>

        <el-dialog v-model="dialogVisible" :before-close="handleClose" :title="title">
            <el-select v-model="selectValue" placeholder="Select">
                <el-option
                    v-for="item in cities"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value"
                >
                    <span style="float: left">{{ item.label }}</span>
                    <span
                        style="
          float: right;
          color: var(--el-text-color-secondary);
          font-size: 13px;
        "
                    >{{ item.value }}</span
                    >
                </el-option>
            </el-select>
            <template #footer>
          <span class="dialog-footer">
            <el-button @click="confirm">确认</el-button>
            <el-button type="primary" @click="handleClose">
              取消
            </el-button>
          </span>
            </template>
        </el-dialog>
    </div>
</template>

<script lang="ts">
import {defineComponent, onMounted, ref} from "vue";

export default defineComponent({
    name: 'PopupSelection',
    props: ['modelValue', 'title'],
    setup(props, context) {

        const dialogVisible = ref<boolean>(false)

        const selectValue = ref()

        // 假设这是接口请求以后返回的数据
        const cities = ref([
            {
                value: 'Beijing',
                label: 'Beijing',
            },
            {
                value: 'Shanghai',
                label: 'Shanghai',
            },
            {
                value: 'Nanjing',
                label: 'Nanjing',
            },
            {
                value: 'Chengdu',
                label: 'Chengdu',
            },
            {
                value: 'Shenzhen',
                label: 'Shenzhen',
            },
            {
                value: 'Guangzhou',
                label: 'Guangzhou',
            },
        ])

        const openDialog = () => {
            dialogVisible.value = true
        }

        const handleClose = () => {
            dialogVisible.value = false
        }

        const confirm = () => {
            context.emit('update:modelValue', selectValue.value)
            context.emit('change', selectValue.value)
            dialogVisible.value = false
        }

        onMounted(() => {
            if (props.modelValue) {
                selectValue.value = props.modelValue
            }
        })

        return {
            dialogVisible,
            openDialog,
            handleClose,
            cities,
            selectValue,
            confirm,
        }
    }
})
</script>

<style scoped lang="scss">
</style>

2、组件的使用 👇 👇

<template>
    <popup-selection v-model="currentValue" @change="changeValue" />
</template>

<script lang="ts">
import PopupSelection from "@/components/popupSelection.vue";
import {defineComponent, ref} from "vue";

export default defineComponent({
    components: {PopupSelection},

    setup() {

        const currentValue = ref()

        const changeValue = (value) => {
            console.log('👉👉👉-----------------', value)
        }

        return {
            currentValue,
            changeValue
        }
    }
})
</script>

四、核心代码解析 👇 👇

1、子组件与父组件组件数据和事件传递

const confirm = () => {
    context.emit('update:modelValue', selectValue.value)
    context.emit('change', selectValue.value)
    dialogVisible.value = false
}

我是Etc.End。每一次进步都值得庆祝,每一次努力都值得赞赏。不要忽视自己的成长,每一步都是向前迈进的力量。如果我的文章对你有所帮助的话,希望能留下你的点赞和收藏。😍。

👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇

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

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

相关文章

攻不下dfs不参加比赛(十三)

标题 为什么练dfs题目为什么练dfs 相信学过数据结构的朋友都知道dfs(深度优先搜索)是里面相当重要的一种搜索算法,可能直接说大家感受不到有条件的大家可以去看看一些算法比赛。这些比赛中每一届或多或少都会牵扯到dfs,可能提到dfs大家都知道但是我们为了避免眼高手低有的东…

24 - 数组和广义表 - 二维数组

前面我们学习了一维数组、今天来看看二维数组,比一维数组更加复杂! 数组的特点 存储的空间连续 存储类型相同 可以使用地址+偏移快速访问 二维数组定义 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,语法格式如下: 类型说明符 数组名[常量表达式][常量表达…

977.有序数组的平方

977.有序数组的平方 1.暴力排序 这道题最直观的方法在于&#xff0c;将数组中的每个数平方之后&#xff0c;排个序 public int[] sortedSquares(int[] nums) {int[]ans new int[nums.length];for(int i0;i<nums.length;i){ans[i] nums[i]*nums[i];} Arrays.sort(ans);ret…

人工智能LLM模型:奖励模型的训练、PPO 强化学习的训练、RLHF

人工智能LLM模型&#xff1a;奖励模型的训练、PPO 强化学习的训练 1.奖励模型的训练 1.1大语言模型中奖励模型的概念 在大语言模型完成 SFT 监督微调后&#xff0c;下一阶段是构建一个奖励模型来对问答对作出得分评价。奖励模型源于强化学习中的奖励函数&#xff0c;能对当前…

高通芯片android进入EDL模式 下载 热启动 串口指令

参考&#xff1a;高通方案的Android设备几种开机模式的进入与退出_edl模式怎么退出_Rookie20190715的博客-CSDN博客 切换为EDL模式 向串口发送 4b 65 01 00 54 0f 7e 或者adb reboot edl

Ceph的安装部署

文章目录 一、存储基础1.1 单机存储设备1.2 单机存储的问题1.3分布式存储&#xff08;软件定义的存储 SDS&#xff09; 二、Ceph 简介2.1 Ceph 优势2.2 Ceph 架构2.3 Ceph 核心组件2.4 Pool、PG 和 OSD 的关系&#xff1a;2.5 OSD 存储后端2.6 Ceph 数据的存储过程2.7 Ceph 版本…

PID控制系列--(1、最形象的PID)

目录 1、 比例控制系统的标准结构2、最简单的例子3、第二个例子4、积分控制器6、微分控制7 总结 今天 看到了B站上一个叫洋葱auto的UP主搬来的介绍PID控制的视频&#xff0c;感觉讲得形象易懂&#xff0c;为便于让和我一样看了无数文章还是不能很好理解PID控制本质的人共同分享…

2. DATASETS DATALOADERS

2. DATASETS & DATALOADERS PyTorch提供了两个数据基元&#xff1a;torch.utils.data.DataLoader和torch.uutils.data.data集&#xff0c;允许使用预加载的数据集以及自己的数据。数据集存储样本及其相应的标签&#xff0c;DataLoader在数据集周围包装了一个可迭代项&…

Sentinel整合OpenFegin

之前学习了openFeign的使用&#xff0c;我是超链接 现在学习通过Sentinel来进行整合OpenFegin。 引入OpenFegin 我们需要在当前的8084项目中引入对应的依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sta…

网络套接字编程(一)(UDP)

gitee仓库&#xff1a;https://gitee.com/WangZihao64/linux/tree/master/chat_udp 预备知识 源IP地址和目的IP地址 它是用来标识网络中不同主机的地址。两台主机进行通信时&#xff0c;发送方需要知道自己往哪一台主机发送&#xff0c;这就需要知道接受方主机的的IP地址&am…

【数学建模】利用C语言来实现 太阳赤纬 太阳高度角 太阳方位角 计算和求解分析 树木树冠阴影面积与种植间距的编程计算分析研究

太阳赤纬的计算 #include <stdio.h> #include <math.h>double calculateDelta(int year, int month, int day, int hour, int minute, int second) {int n, n0;double t, theta, delta;// 计算n和n0n month * 30 day;n0 79.6764 0.2422 * (year - 1985) - ((y…

35+大龄程序员从焦虑到收入飙升:我的搞钱副业分享。

37岁大龄程序员&#xff0c;一度觉得自己的职场生涯到头了。既没有晋升和加薪的机会&#xff0c;外面的公司要么接不住我的薪资&#xff0c;要么就是卷得不行&#xff0c;无法兼顾工作和家庭&#xff0c;感觉陷入了死局…… 好在我又重新振作起来&#xff0c;决定用副业和兼职填…

2.3Listbox列表部件

2.3Listbox列表部件 创建主窗口 window tk.Tk() window.title(my window) window.geometry(200x200)创建一个label用于显示 var1 tk.StringVar() #创建变量 l tk.Label(window,bgyellow,width4,textvariablevar1) l.pack()创建一个方法用于按钮的点击事件 def print_s…

DateTimePicker基本用法

作用&#xff1a;日期时间控件&#xff0c;用于手动选择日期与时间。 常用属性&#xff1a; 常用事件&#xff1a; 后台代码示范&#xff1a; //日期变化时获取日期private void dateTimePicker1_ValueChanged(object sender, EventArgs e){textBox2.Text dateTimePicker1.Te…

(原创)适合小白的AI算法学习路线

大家好啊&#xff0c;我是董董灿。 之前写了一篇文章&#xff1a;有前途&#xff01;大模型也需要AI算子开发岗&#xff01;有同学看了之后&#xff0c;在问AI算子开发需要如何学习&#xff0c;有没有学习路线? 当然是有的了。 今天周末在家&#xff0c;就梳理了一下该岗位需…

pdf水印在哪里设置?超实用解决方法分享

在工作中&#xff0c;我们常常需要发送PDF文件给他人&#xff0c;为了保护文件的安全性&#xff0c;防止被他人盗用或篡改&#xff0c;我们通常会给PDF文件添加水印。添加水印可以有效地标识文件的所有权&#xff0c;并增加文件的可追溯性。然而&#xff0c;有许多人不清楚如何…

2023牛客多校第一场B Anticomplementary Triangle

①&#xff1a;有结论&#xff1a;面积最大的三角形即为所求 证明&#xff1a;若有点在面积最大的三角形对应 “ A n t i c o m p l e m e n t a r y T r i a n g l e ” “Anticomplementary Triangle” “AnticomplementaryTriangle”之外&#xff0c;一定能取得更大的面积。…

14款奔驰R400升级ACC自适应巡航系统,解放您双脚

有的时候你是否厌倦了不停的刹车、加油&#xff1f;是不是讨厌急刹车&#xff0c;为掌握不好车距而烦恼&#xff1f;如果是这样&#xff0c;那么就升级奔驰原厂ACC自适应式巡航控制系统&#xff0c;带排队自动辅助和行车距离警报功能&#xff0c;感受现代科技带给你的舒适安全和…

实时监测与报警,探索CMS系统在半导体设备安全管理中的作用

在半导体制造行业&#xff0c;设备的安全管理对于保障生产运行和员工安全至关重要。中央设备状态监控系统CMS&#xff08;central monitoring system&#xff09;是一种关键的解决方案&#xff0c;为企业提供实时监测和报警功能&#xff0c;有效应对设备安全管理的挑战。本文将…

【IDEA2023】解决IDEA中快捷键Alt+Enter不能引入局部变量

1、打开设置 File ➡️ Settings ➡️ Editor ➡️ Intentions 搜索refactorings&#xff0c;将Introduce local variable这个选项勾选上 将Introduce local variable这个选项勾选上 OK&#xff0c;Apply