npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

quick-form-vue3

v0.2.6

Published

``` npm install quick-form

Downloads

8

Readme

Quick Form

A Form dynamic build tools

--- for Vue 3.2.x and Element-Plus
动态表单快速构建工具 基于 vue 3.2.x 和 Element-plus

demo: https://allensunjian.github.io/quick-form-example/

Getting Start

npm install quick-form

Certified components

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import "element-plus/dist/index.css";
import "../lib/quickFromInsideSty.scss";
import "../lib/quickFromOutsideSty.scss";
createApp(App).use(ElementPlus).use(QuickFrom).mount('#app')

Introduce Type 介绍

支持 Form 元素类型:
  • 1 text 文本类型类型
  • 2 container 容器类型
  • 3 icon 图标类型
  • 4 input 输入类型
  • 5 inputNumber 数字输入类型
  • 5 select 选择器类型
  • 6 button 按钮类型
  • 7 checkbox 复选类型
  • 8 radio 单选类型
  • 9 upload 上传类型
  • 10 imgList 图片列表类型
  • 12 date 日期类型
  • 13 time 时间类型
  • 14 slot 插槽类型
支持的指令:
  • sif 控制显示隐藏
支持字符串类型的模板语法
  • {{value}}
支持异步依赖
  • depOptions

简单示例


<template>
  <quick-form :form-data="FromData" :quickOptions="QuickForm" :rules="Rules" @form-change="FromChange"
    @form-event="FormEvent" ref="QuickFrom">
  </quick-form>
  <el-button @click="submit">提交</el-button>
</template>
<script lang="ts" >
import { Plus, Calendar } from "@element-plus/icons-vue";
import { defineComponent, reactive, getCurrentInstance } from "vue";
const setup = function () {
  const Ins: any = getCurrentInstance();
  // 表单数据依赖
  const FromData = reactive({
    account: "",
    bankType: null,
    othersAccount: "",
    amount: 0,
    remark: 1111,
    date: "2022-05-25",
    timeData: new Date(2000, 1, 1, 12, 0, 0),
    daterangeData: ["2022-05-01", "2022-05-05"],
    state: 2,
    checkboxData: [2],
    fileList: [],
    switchData: false
  });
  // 表单验证规则依赖
  const Rules = reactive({
    bankType: [
      { required: true, message: "请选择申请类型", trigger: "change" },
    ],
    account: [
      { required: true, message: "请输入金额", trigger: "blur" },
    ]
  })
  // 表单配置依赖,不要用 reactive | ref 进行代理 可以使用shadow 或者 raw 或者 一个原生对象, 否则会导致响应更新栈溢出
  const QuickForm: any = {
    // 表单 条目 配置项
    formOptions: [
      {
        formElementLabel: "开户行",
        formElementType: "select",
        key: "bankType",
        placeholder: "请选择银行",
        options: [
          { label: "中国银行", value: 1 },
          { label: "建设银行", value: 2 },
          { label: "农业银行", value: 3 },
          { label: "建设银行", value: 4 },
        ],
      },
      {
        tirrgerEvents: ["mouseover"],
        formElementLabel: "账号:",
        formElementType: "input",
        key: "account",
        placeholder: "请填写银行账号",
      },
      {
        formElementLabel: "对方账号:",
        formElementType: "input",
        key: "othersAccount",
        placeholder: "请填写对方账号",
      },
      {
        formElementLabel: "转账金额:",
        // formElementType: "container", // 如果没有第一层级的 type 那么默认是container
        childrenOptions: [
          {
            formElementType: "input:number",
            key: "amount", // mountModelValue: "amount", mountModelValue 绑定优先级大于 key
          },
          {
            formElementType: "text",
            textValue: "元",
            style: "margin-left: 10px; color:red",
          },
        ],
      },
      {
        formElementLabel: "备注",
        formElementType: "input:textarea",
        placeholder: "请填写备注",
        key: "remark",
      },
      {
        formElementLabel: "到账类型",
        formElementType: "radio",
        key: "state",
        childrenOptions: [
          { label: 1, children: ["立即"] },
          { label: 2, children: ["延时"] },
        ],
      },
      {
        formElementLabel: "日期",
        directives: [["sif", "scope.state == 2"]],
        childrenOptions: [
          {
            formElementType: "date",
            key: "date",
            type: "date",
            placeholder: "预约日期",
            format: "YYYY/MM/DD",
            valueFormat: "YYYY-MM-DD",
          },
          {
            formElementType: "time",
            key: "timeData",
            type: "time",
            placeholder: "时间",
          },
        ],
      },
      {
        formElementLabel: "日期",
        formElementType: "text",
        textValue: "{{date}}   {{timeData}}",
      },
      {
        formElementLabel: "通知类型",
        formElementType: "checkbox",
        key: "checkboxData",
        childrenOptions: [
          { label: 1, children: ["电话通知"] },
          { label: 2, children: ["短信通知"] },
          { label: 3, children: ["邮件通知"] },
        ],
      },
      {
        formElementLabel: "上传凭证",
        formElementType: "upload",
        key: "fileList",
        action: "#",
        listType: "picture-card",
        autoUpload: false,
        children: [
          {
            formElementType: "icon",
            children: [Plus]
          },
        ],
      },
      {
        formElementLabel: "开关",
        formElementType: "switch",
        key: "switchData"
      }
    ],
    // form配置项 与 element-plus 配置一致
    layout: {
      labelWidth: 100,
      size: "default",
      labelPosition: "right",
    },
  };
  // FromChange 事件--表单数据发生改变 或 抛出改变时 会执行该事件
  const FromChange = (opt: any) => {
    console.log(44, opt);
    // console.log(55, FromData);s
  };
  // FormEvent 主动监听的表单事件会执行这里
  const FormEvent = (e) => {
    console.log("FormEvent", e);
  }
  const submit = () => {
    // 拿到表单示例
    const From = Ins.refs.QuickFrom;
    // 调用 验证
    From.getFrom().validate((valid, fields) => {
      if (valid) {
        console.log("submit!");
      } else {
        console.log("error submit!", fields);
      }
    });
  };
  return {
    QuickForm,
    FromData,
    FromChange,
    FormEvent,
    Rules,
    submit,
  };
};
export default defineComponent({
  setup,
});
</script>

配置
  • :form-data -- 表单数据 需要 reactive 或者 ref 代理
  • :quickOptions -- 表单配置 注意不要用 reactive 或 ref 代理 否则性能会出现严重的问题 1 formOptions 表单元素配置 2 layout 表达全局布局 属性同 element-plus el-form 的全局属性 写法 如:label-width 属性 需要写成 labelWidth 小驼峰格式
  • depOptions 外部依赖
formOptions 配置
  • formElementType 表单元素类型(见 form 元素类型)
  • formElementLabel 表单 label
  • key 元素的 key 一般情况下用于 与 formdata 中的值进行绑定所有该值尽可能保证存在于 formdata 中, 还用于事件反回时的识别 KEY
  • mountModelValue 与 key 类似, 用与主动绑定的值, 绑定级别高于 key, 与 key 同时存在时优先绑定 mountModelValue
  • tirrgerEvents 接收一个数组 传入事件名称如["click", "change"] , 特殊的组件如 upload 等有自己的事件 可参阅 element-plus 的事件文档, 都可以被支持, 一般 FORM 元素的默认事件是 change,text 类型默认事件是 click.
  • options 配合 formElementType 为 select 时使用, 接收 一个数组 作为 option 的选项,或者接收一个字符串 作为依赖映射到 depOptions 中的 相应值 作为 异步依赖让插件动态加载。
  • placeholder 占位文字 在 input input:textarea select 等 INPUT 类型元素生效
  • textValue 在元 formElementType 类型是 text 时生效, 用于定义文本内容, 支持模板语法, 但是依赖必须存在于 formdata 或 depOptions 中。
  • children 内层嵌套元素, 可以是一个组件 可以是文本 抑或是一段元素配置。 代表的是子元素
  • itemStyle 元素的内联样式 对象格式
  • accept 用于 upload 上传时限制文件类型
  • preventDefaultEvent 阻止默认事件, 如自动更新表单数据
  • directives 自定义指令, 目前只有一个指令 sif 用户动态展示隐藏元素 写法: directives: [["sif", "scope.key == 1 && ture"]] 支持联合判断 scope.为固定写法 key 必须存在与 formdata 或者 depOptions 中 否则 始终为 false
  • component formElementType 为 slot 时 需要传入自定义组件, 组件为任意 可被 vue3.2.x 版本编译的组件。
  • slotOptions 对插槽中 自定义组件 值绑定 的描述 包含: 1 props 接收一个数组 [{prop: "data", value: "depData"}] 表示在 component 上绑定一个 data 值 使用 formdata 或 depOptions 中的 depData, 数组代表的可以绑定多个值 2 receiver 表示要侦听 自定义 component 的某个事件 如: receiver: ["preview"] 如果自定义的 component 中有 preview 事件, 那么一旦触发会被转发到 formEvent 中
  • optionLabelKey formElementType 为 select 时 option 中 label 的别名
  • optionValueKey formElementType 为 select 时 option 中 value 的别名
  • alias formElementType 为 upload 时 文件列表的别名{name: "fileName", url: "fileUrl"}} 把 name 映射到 fileName 上 把 url 映射到 fileUrl 上, 默认展示的列表 格式只包含 name, url 字段。 如果是其他字段 可用 alias 来配置别名映射
事件
  • formChange 表单数据变化或者用户主动监听的事件(tirrgerEvents)
  • formEvent 表单事件
子类型
在表单元素中部分类型格式是 父类型:子类型 中间使用:分割 父类型和子类型 广义上是一类 但是行为和样式上有所区别。
  • input 子类型 number, textarea, text 默认 text 写法为: input | input:number | input:textarea
  • upload 子类型 detail, 写法 upload:detail
元素类型配置--input 类型
{
    formElementType: "input", // 同 input:number / input:textarea
    formElementLabel: "输入类型",
    key: "inputvalue",
    placeholder: "xxxxxxx",
    size: "small",
}
元素类型配置--select 类型
// 写法一: 用于 固定option
{
    formElementType: "select",
    formElementLabel: "选择类型",
    key: "selectValue",
    options: [
          { label: "中国银行", value: 1 },
          { label: "建设银行", value: 2 },
          { label: "农业银行", value: 3 },
          { label: "建设银行", value: 4 }
     ]
}
// 写法二: 用于动态或异步option

首先在depOption中定义一个options字段(名字随便起)
{
    options: [
          { label1: "中国银行", value2: 1 },
          { label1: "建设银行", value2: 2 },
          { label1: "农业银行", value2: 3 },
          { label1: "建设银行", value2: 4 }
    ]
}

{
    formElementType: "select",
    formElementLabel: "选择类型",
    key: "selectValue",
    options: "options",   // 传入一个字符串 确保与 depOptions中的字段一致
    optionLabelKey: "name1",
    optionValueKey: "value2"
}
元素类型配置--radio 类型
{
    formElementType: "radio",
    formLabel: "radioGroup",
    key: "raidoValue",
    childrenOptions: [
          { label: 1, children: ["立即"] },
          { label: 2, children: ["延时"] },
        ]
}

// childrenOptions 用于定义 radio / checkbox 的组
元素类型配置--checkbox 类型
{
    formElementType: "checkbox",
    formLabel: "radioGroup",
    key: "checkboxValue",  // 初始值必须是数组 否则会报错
    childrenOptions: [
          { label: 1, children: ["立即"] },
          { label: 2, children: ["延时"] },
        ]
}

// childrenOptions 用于定义 radio / checkbox 的组
元素类型配置-- upload 类型

1 upload 类型 用于解决 上传 文件和图片 配置 同 element-plus upload

{ formElementType: "upload", key: "fileList", // 指定了 key, 会自动绑定生成文件|图片列表 fomElementLabel; "上传", action: "#", // 不设置上传路径 autoUpload: false, // 手动上传 tirrgerEvents: ["preview"], // 侦听 upload 的 preview 事件 当图片发生改变则在 formChange 进行触发 children: [ { formElementType: "icon", children: [Plus]} // 填入一个自定义 svgicon 这里是引用 element-plus 的 icon ] }

。。。未完