草庐IT

ve-plus:基于 vue3.x 桌面端UI组件库|vue3组件库

web前端项目案例实战 2023-03-28 原文

VE-Plus 自研轻量级 vue3.js 桌面pc端UI组件库

经过一个多月的筹划及开发,今天给大家带来一款全新的Vue3桌面端UI组件库VEPlus。新增了35+常用的组件,采用vue3 setup语法糖开发,在使用上和element-ui比较类似,极易快速上手。

ve-plus 致力数据驱动视图,使用最少的代码量来实现和element-ui一样的功能。极少引入外部插件,高定制化及运行速度快。

整合了之前使用vue3.js开发的两个独立插件vue3-layer弹窗vue3-scrollbar虚拟滚动条组件。

ve-plus遵循简洁直观的UI风格,设计样式、图标和文本、元素的位置等保持一致性。

◆ 安装

npm install ve-plus -S
cnpm install ve-plus -S
yarn add ve-plus

◆ 快速引入

ve-plus 支持全局引入按需引入两种引入方式。

import { createApp } from "vue"
import App from "./App.vue"
import VEPlus from "ve-plus"

const app = createApp(App)
app.use(VEPlus)
app.mount("#app")
import { Button, Input, Checkbox } from "ve-plus"

<Button type="success" round>按钮</Button>
<Input v-model="value" />
<Checkbox v-model="checked" label="选中" />

◆ 快速使用

<Button type="primary">Primary</Button>
<Button type="success">Success</Button>
<Button type="warning" round>Warning</Button>
<Button type="primary" icon="ve-icon-filetext" circle></Button>

<Input v-model="inputVal" placeholder="输入用户名" />

<Checkbox v-model="checkboxValue" label="Checkbox" />

<Select v-model="selectVal" :options="options" size="large" clearable />

...

<script setup>
    const formRuleRef = ref()
    const rules = ref({
        name: [
            { required: true, message: "请输入活动名称", trigger: ["blur", "input"] },
            { min: 3, max: 5, message: "长度在 3 到 5 个字符", trigger: "blur" }
        ],
        region: [
            { required: true, message: "请选择活动区域", trigger: "change" }
        ],
        type: [
            { type: "array", required: true, message: "请至少选择一个活动性质", trigger: "change" }
        ],
        resource: [
            { required: true, message: "请选择活动资源", trigger: "change" }
        ],
        // summary: [
        //     { required: true, message: "请填写活动详情", trigger: "blur" }
        // ]
    })
    const handleSubmit = () => {
        formRuleRef.value.validate(valid => {
            if(valid) {
                console.log("submit")
            }else {
                console.log("error...")
                return false
            }
        })
    }
    const handleReset = () => {
        formRuleRef.value.resetFields()
    }
</script>

<template>
    <Form
        ref="formRuleRef"
        :model="formObj"
        labelWidth="80px"
        :rules="rules"
        style="width: 600px;"
    >
        <FormItem label="活动名称" prop="name">
            <Input v-model="formObj.name" />
        </FormItem>
        <FormItem label="活动区域" prop="region">
            <Select v-model="formObj.region" :options="regionOptions" clearable multiple />
        </FormItem>
        <FormItem label="即时配送" prop="delivery" required message="请勾选即时配送" trigger="change">
            <Switch v-model="formObj.delivery" />
        </FormItem>
        <FormItem label="活动性质" prop="type">
            <CheckboxGroup v-model="formObj.type">
                <Checkbox label="美食/餐厅线上活动" button />
                <Checkbox label="亲子主题" button />
                <Checkbox label="品牌推广" button />
            </CheckboxGroup>
        </FormItem>
        <FormItem label="特殊资源" prop="resource">
            <RadioGroup v-model="formObj.resource">
                <Radio label="线上品牌商赞助" button />
                <Radio label="线下场地免费" button />
            </RadioGroup>
        </FormItem>
        <FormItem label="活动详情" prop="summary" :rule="[{ required: true, message: "请填写活动详情", trigger: "blur" }]">
            <Input v-model="formObj.summary" type="textarea" rows={3} />
        </FormItem>
        <FormItem>
            <Button type="primary" @click="handleSubmit">立即创建</Button>
            <Button @click="handleReset">重置</Button>
        </FormItem>
    </Form>
</template>

<template>
    <Loading v-model="loaded" background="rgba(0,0,0,.75)" spinner="ve-icon-loading" fullscreen="false">
        <template #text><div>加载中...</div></template>
    </Loading>

    <Loading v-model="loaded" text="Loading..." background="rgba(0,0,0,.75)" fullscreen="false" />
</template>

Loading加载组件还支持loading({})函数式调用。

<script setup>
    const handleLoading = () => {
        loading({
            // spinner: "sv-icon-loading",
            text: "Loading...",
            background: "rgba(0,0,0,.75)",
            size: 32,
            // time: 3, // 3s后关闭
            shadeClose: true,
            onOpen: () => {
                console.log("开启loading")
            },
            onClose: () => {
                console.log("关闭loading")
            }
        })
        // setTimeout(() => {
        //     loading.close()
        // }, 3000)
    }
</script>
<template>
    <Button type="primary" @click="handleLoading">全屏loading</Button>
</template>

支持light/dark两种主题提示,设置closable属性可关闭,支持自定义icon图标

<template>
    <Button @click="Message.success("成功提示")">成功</Button>
    <Button @click="Message({title: "警告提示", type: "warning"})">警告</Button>
    <Button @click="Message.danger("错误提示")">错误</Button>
    <Button @click="Message.info("消息提示")">消息</Button>
</template>

<script setup>
    // 设置多选
    const tableToggleRef = ref()
    const toggleSelection = (value) => {
        tableToggleRef.value.setCurrentRow(value)
    }
    const toggleTableData = ref([...Array(5)].map((_, i) => ({
        date: `2023-01-${10+i}`,
        name: "Andy",
        state: "Lindon",
        city: "Los Ageles",
        address: `London Park Road no. ${i}`,
        zip: "CA 90036"
    })))
    const toggleTableColumns = ref([
        {type: "selection", width: 100, fixed: true},
        {prop: "date", label: "Date", width: 150, fixed: true},
        {prop: "name", label: "Name", align: "center", width: 120},
        {prop: "state", label: "State", width: 120},
        {prop: "city", label: "City", width: 120},
        {prop: "address", label: "Address", width: 600},
        {prop: "zip", label: "Zip", width: 120},
        {prop: "action", label: "Action", width: 120, fixed: "right"}
    ])
</script>
<template>
    <Table
        ref="tableToggleRef"
        :dataSource="toggleTableData"
        :columns="toggleTableColumns"
        highlight-current-row
        :highlight-multiple="true"
    />
    <Button block @click="toggleSelection([2,4])">Toggle selection status of third and five rows</Button>
    <Button block @click="toggleSelection()">Clear selection</Button>
</template>

好了,这次分享就先到这里,感兴趣的童靴可以安装体验一下。如果有好的想法或建议,欢迎一起交流讨论哈!

后续还会基于这个ve-plus组件库开发一个全新的Vue3后台管理系统,到时也会分享出来。

 

有关ve-plus:基于 vue3.x 桌面端UI组件库|vue3组件库的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  3. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  6. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  7. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  8. ruby - 在 Rakefile 中动态生成 Rake 测试任务(基于现有的测试文件) - 2

    我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n

  9. ruby - 如何使用 Ruby 基于字母数字字符串生成颜色? - 2

    我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:

  10. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

随机推荐