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

@wsk1113/react-ui-sk

v0.2.1

Published

一个狠好使的React+TS组件库! / a React+TS based highly popular management component ui lib!

Downloads

6

Readme

@安装使用

安装 sk UI

# 没有安装nrm源管理工具时...
npm i -g nrm

# NPM全局切换到官方源
nrm use npm

# 安装石头UI/React
npm i @wsk1113/react-ui-sk

使用 sk 弹窗

  showPopup: boolean;//弹窗状态
  children: ReactNode;//插入dom元素
  toggle: React.Dispatch<React.SetStateAction<boolean>>;//修改弹窗状态
  title: string;//标题
  onConfirm: () => void;//确定事件
import React, { useState } from "react";

// 引入sk弹窗
import { MyPopup } from "@wsk1113/react-ui-sk";

export default function PopupDemo() {
  // 用一个state控制要不要显示弹窗
  const [showPopup, setShowPopup] = useState(false);

  return (
    <div>
      <h3>PopupDemo</h3>
      <button
        onClick={() => {
          console.log(111);
          setShowPopup(true);
        }}
      >
        开启弹窗
      </button>
      <MyPopup
        toggle={setShowPopup}
        showPopup={showPopup}
        title="弹窗标题"
        onConfirm={() => console.log("已确定")}
      >
        <p>This is a modal content</p>
      </MyPopup>
    </div>
  );
}

使用 sk 徽标数

  count?: number | ReactNode;//如果没有count 则显示点点
  overflowCount?: number;//数字超出范围
  color?: string;//徽标颜色
  children: ReactNode;//插入dom元素
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  offset?: Array<number> | any;//[10,10] 修改定位
// 引入sk 徽标数
import { MyBadge } from "@wsk1113/react-ui-sk";

export default function Demo() {
  return (
    <div>
      <MyBadge count={1} overflowCount={999} color="#007bff">
        <p style={{ width: "50px", height: "40px", background: "red" }}>Text</p>
      </MyBadge>
    </div>
  );
}

使用 sk 开关

  checked: boolean; //状态
  onChange: (event: ChangeEvent<HTMLInputElement>) => void; //监听状态变化事件
  bgColor?: string; //开关 开启背景色
// 引入sk 开关
import { MySwitch } from "@wsk1113/react-ui-sk";
import { ChangeEvent, useState } from "react";
export default function Demo() {
  const [isChecked, setIsChecked] = useState(false);
  const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
    setIsChecked(event.target.checked);
  };
  return (
    <div>
      <MySwitch checked={isChecked} onChange={handleChange} bgColor="red" />
    </div>
  );
}

使用 sk 签名组件

  width?: number; // 画布宽度 默认:400
  height?: number; // 画布高度 默认:200
  lineWidth?: number; // 线宽 默认:4
  strokeColor?: string; // 线段颜色 默认:'red'
  lineCap?: string; // 设置线条两端圆角 默认:'round'
  lineJoin?: string; // 线条交汇处圆角 默认:'round'
  bgColor?: string; // 画布背景颜色 默认:'transparent'
  showBtn?: boolean; // true 按钮 false 选中框
  onSave?: (blob: Blob) => void; //当保存时的回调, blob为生成的图片
  onClear?: (canvasContext: CanvasRenderingContext2D) => void; //当画布清空时的回调, 参数为画布的上下文对象,可以直接使用canvas的api
  onDrawEnd?: (canvas: HTMLCanvasElement) => void; //当画布结束时的回调
// 引入sk 签名组件
import { MySignature } from "@wsk1113/react-ui-sk";

export default function Demo() {
  return (
    <div>
      <MySignature width={400} showBtn={true}></MySignature>
    </div>
  );
}

表格数据和类型定义-参考

const columns = [
  { key: "id", label: "ID", type: "sort" },
  { key: "name", label: "缴纳项目", type: "normal" },
  { key: "personage", label: "个人", type: "normal" },
  { key: "firm", label: "企业", type: "sort" },
  { key: "img", label: "照片", type: "image" },
  {
    key: "linkname",
    label: "链接",
    type: "link",
    color: "",
    render: (_label: string, record: object) => {
      getLink(record);
    },
  },
  { key: "total", label: "合计", type: "normal" },
  {
    key: "Controls",
    label: "操作",
    type: "controls",
    render: (_: string, record: object) => (
      <>
        <button onClick={() => handleEdit(record)}>Edit</button>
        <button onClick={() => handleDelete(record)}>Delete</button>
      </>
    ),
  },
];
const [row, setRow] = useState([
  {
    id: 1,
    name: "养老保险",
    personage: 40,
    firm: 35,
    img: "/public/vite.svg",
    linkname: "百度",
    link: "https://www.baidu.com/",
    total: 1200,
  },
  {
    id: 2,
    name: "医疗保险",
    personage: 100,
    firm: 30,
    img: "/public/vite.svg",
    linkname: "百度",
    link: "https://www.baidu.com/",
    total: 1200,
  },
  {
    id: 3,
    name: "失业保险",
    personage: 25,
    firm: 35,
    img: "/public/vite.svg",
    linkname: "百度",
    link: "https://www.baidu.com/",
    total: 1200,
  },
  {
    id: 4,
    name: "养老保险",
    personage: 40,
    firm: 25,
    img: "/public/vite.svg",
    linkname: "百度",
    link: "https://www.baidu.com/",
    total: 1200,
  },
  {
    id: 5,
    name: "医疗保险",
    personage: 100,
    firm: 30,
    img: "/public/vite.svg",
    linkname: "百度",
    link: "https://www.baidu.com/",
    total: 1200,
  },
  {
    id: 6,
    name: "失业保险",
    personage: 25,
    firm: 35,
    img: "/public/vite.svg",
    linkname: "百度",
    link: "https://www.baidu.com/",
    total: 1200,
  },
  {
    id: 7,
    name: "养老保险",
    personage: 40,
    firm: 25,
    img: "/public/vite.svg",
    linkname: "百度",
    link: "https://www.baidu.com/",
    total: 1200,
  },
  {
    id: 8,
    name: "医疗保险",
    personage: 100,
    firm: 30,
    img: "/public/vite.svg",
    linkname: "百度",
    link: "https://www.baidu.com/",
    total: 1200,
  },
  {
    id: 9,
    name: "失业保险",
    personage: 25,
    firm: 35,
    img: "/public/vite.svg",
    linkname: "百度",
    link: "https://www.baidu.com/",
    total: 1200,
  },
  {
    id: 10,
    name: "养老保险",
    personage: 40,
    firm: 25,
    img: "/public/vite.svg",
    linkname: "百度",
    link: "https://www.baidu.com/",
    total: 1200,
  },
]);

使用 sk Export 导出组件

interface DataSourceItem {
  [key: string]: string | number;
}

export interface ExportColumnItem {
    label: string;
    [key: string]: string | number | any;
}
export type ExportRefType = Ref<{ exportXlsx: () => void }>;

interface MyExportProps {
    children: ReactNode;
    dataSource: DataSourceItem[];// 数据源数组
    columns: ExportColumnItem[]// 列定义数组
    filename?:string;//导出的文件名
}
type ExportXlsx = {
    props:MyExportProps,
    ref:ExportRefType
}
// 引入sk 导出组件
import { MyExport, ExportRefType } from "@wsk1113/react-ui-sk";

export default function Demo() {
  const ExportRef: ExportRefType = useRef(null);
  const exportXlsx = () => {
    if (ExportRef.current) {
      ExportRef.current.exportXlsx();
    }
  };
  return (
    <div>
      <MyExport dataSource={row} columns={columns} ref={ExportRef}>
        <button onClick={exportXlsx}>导出</button>
      </MyExport>
    </div>
  );
}

使用 sk 导入组件

export interface ImportColumnItem {
  [key: string]: string | number | any;
}
interface MyImportProps {
    columns: ImportColumnItem[]// 定义导入列名数组
    importXlsx: (data: Array<object>) => void //调用函数,获取导入的数据
    inputShow?: boolean;//按钮形式:false;上传边框样式:ture
    width?:string;//边框宽度
    height?:string;//边框高度
}
// 引入sk 导入组件
import { MyImport } from "@wsk1113/react-ui-sk";

export default function Demo() {
  const importXlsx = (data: Array<any>) => {
    console.log(data);
  };
  return (
    <div>
      <MyImport
        columns={columns}
        importXlsx={importXlsx}
        inputShow={false}
      ></MyImport>
    </div>
  );
}

使用 sk 提示组件

title: string; //标题
duration: number; //延迟时间
type: string; //类型 成功success、失败error、警告warning、提示tips
// 引入sk 提示组件
import { useMessage } from "@wsk1113/react-ui-sk";
export default function Demo() {
  const [MessageJSX, openMessage] = useMessage({
    title: "哥的窗窗",
    duration: 1000,
    type: "tips",
  });
  return (
    <div>
      <button
        onClick={() => {
          openMessage();
        }}
      >
        显示提示
      </button>
      弹窗JSX
      {MessageJSX}
    </div>
  );
}

使用 sk 表格组件

interface Column {
  key: string;
  label: string;
  type: ("normal" & "controls" & "imges" & "link" & "sort") | string;
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  render?:
    | ((_: Array<object> | string, item: TableDataItem) => ReactNode)
    | any;
  color?: string; //行中字体颜色
}

export interface TableDataItem {
  id: number;
  [key: string]: string | number | undefined;
}

interface CustomTableProps {
  columns: Column[]; //表头及数据类型
  data: TableDataItem[]; //表格数据
  width?: string; //表格的整体宽度
  lineHeight?: string; //行高
}
// 引入sk 表单组件
import { MyTable } from "@wsk1113/react-ui-sk";
export default function Demo() {
  //columns和rows可以看--表格数据和类型定义-参考
  return (
    <div>
      <MyTable columns={columns} data={rows} lineHeight="45px" width="600px" />
    </div>
  );
}

使用 sk 搜索筛选组件

export interface InputField {
    key: string;
    placeholder?: string;
    type: 'text' | 'select' | 'datetime-local';
    options?: string[];
    handleChange: (val: string) => void
}
interface SearchBoxProps {
    onSearch: () => void;//搜索
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    onReset?: (() => void | undefined) | any;//重置
    inputFields: InputField[];//每个搜索的类型数据
    inputData: { [key: string]: string | number };//搜索框表单数据
}
// 引入sk 搜索筛选组件
import { MySearchBox,InputField } from "@wsk1113/react-ui-sk";
export default function Demo() {
  const [query, setQuery] = useState("");
  const [category, setCategory] = useState("");
  const [time, setTime] = useState("");
  const inputFields: Array<InputField> = [
    {
      key: "query",
      placeholder: "Enter Value 1",
      type: "text",
      handleChange: (val: string) => {
        setQuery(val);
      },
    },
    {
      key: "category",
      placeholder: "Enter Value 2",
      type: "select",
      options: ["www", "eee", "rrr"],
      handleChange: (val: string) => {
        setCategory(val);
      },
    },
    {
      key: "time",
      placeholder: "Enter Value 3",
      type: "datetime-local",
      handleChange: (val: string) => {
        setTime(val);
      },
    },
  ];
  const handleSearch = () => {
    // 处理搜索逻辑
    console.log("query:", query, "category:", category, "time:", time);
  };
  const handleReset = () => {
    setQuery("");
    setCategory("");
    setTime("");
  };
  return (
    <div>
      <MySearchBox
        onSearch={handleSearch}
        onReset={handleReset}
        inputFields={inputFields}
        inputData={{ query, category, time }}
      ></MySearchBox>
    </div>
  );
}