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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@aotoo/react-hooks-zhuan

v1.0.7

Published

--- theme: juejin ---

Readme


theme: juejin

react-hooks-zhuan

砌墙需要砖,这个 hooks 就是 react 的一块砖,想往哪搬往哪搬,基于 react18, typescript

Install

xxx add @aotoo/react-hooks-zhuan

基础用法

Item 用法

import { useItem } from '@aotoo/react-hooks-zhuan';
const [ref, ItemUI] = useItem({ title: 'hello' });
return <ItemUI />;

List 用法
List 组件是 Item 组件的集合

import { useList } from '@aotoo/react-hooks-zhuan';
const [ref, ListUI] = useItem({ data: [{ title: 'hello' }, { title: 'world' }] });
React.useEffect(() => {
  setTimeout(() => {
    ref.current.append({ title: '我是一块砖' });
  }, 2000);
}, []);
return <ListUI />;

事件绑定
react-hooks-zhuan 扩展了 react 的事件对象,支持三个参数 event, param, ref,event 为 react 原生事件对象,param 参数暂时没有定义,默认值为{},ref 则为操作对象的实例

import { useItem } from '@aotoo/react-hooks-zhuan';
const [ref, ItemUI] = useItem({
  title: 'hello',
  onClick(e, param, ItemRef) {
    ItemRef.current.addClass('active');
  },
});

return <ItemUI />; // 也可直接配置 <ItemUI onClick={...}>

子结构

import { useItem } from '@aotoo/react-hooks-zhuan';
const [ref, ItemUI] = useItem({
  title: 'hello',
  bodyClass: 'body-class-name',
  body: [
    { title: 'body item 1', className: 'body-item' },
    {
      title: 'body item 2',
      onClick(e, param, btRef) {
        btRef.current.hide();
      },
    },
  ],
});

return <ItemUI />;

嵌套结构

import { useItem } from '@aotoo/react-hooks-zhuan';
const [ref, ItemUI] = useItem({
  title: 'hello',
  bodyClass: 'body-class-name',
  body: [
    {title: 'body item 1', className: 'body-item'},
    {
      title: 'body item 2',
        body: [
          {title: 'body item 3', body: [...]}
          {title: 'body item 4', onClick(e, param, btRef){
            btRef.current.hide()
          }}
      ]
    }
  ]
});

return <ItemUI />;

All Hooks

  1. useItem(param: ItemProps):
    基础 Item 钩子,包含各种钩子的方法,会在内存中注册实例
  2. useList({data: Array<ItemProps>, className, style}):
    基础 List 钩子,包含各种钩子的方法,会在内存中注册实例
  3. usePureItem(param: ItemProps):
    输出纯的 Item 组件结构
  4. usePureList({data: Array<ItemProps>, className, style}):
    输出纯的 List 组件结构

Item 组件配置属性

完整的 Item 组件包含 body, footer, dot, titles数组子结构,可通过配置实现项目需求结构。其中body, footer, titles会包裹一层 div,支持控制样式,数据,显示,隐藏等方法。dot较为特殊,它的子元素将作为父级的直接子元素,方便定制那些有浮动需求的结构

ItemProps

Item 组件的配置项

interface ItemProps {
  title?: React.ReactNode | Array<ItemProps>;
  className?: string;
  style?: {};
  img?: string | string[] | IImg | Array<IImg>;
  url?: string | IUrl;
  attr?: {};

  // 子容器
  body?: Array<React.ReactNode | ItemProps>;
  footer?: Array<React.ReactNode | ItemProps>;
  dot?: Array<React.ReactNode | ItemProps>;

  // 子容器属性
  titleClass?: string;
  titleStyle?: {};
  titleProps?: {};

  bodyClass?: string;
  bodyStyle?: {};
  bodyProps?: {};

  footerClass?: string;
  footerStyle?: {};
  footerProps?: {};
}

titles 结构
没有专门的 titles 属性相对应,直接将 title 属性定义为数组即可

const [ref, ItemUI] = useItem({
  title: [{ title: '标题' }],
  body: [{ title: 'body title' }],
});

上例中我们同时设定了 titles、body 两组结构

实例方法

使用useItem, useList创建的结构,会在内存中注册该组件的链状数据,这些实例包含以下方法

Item 实例方法

type ItemRef = {
  getData: () => ItemProps,
  getClassName: () => string,
  addClass: (className: string, cb?: () => void) => void,
  removeClass: (className: string, cb?: () => void) => void,
  hasClass: (className: string) => boolean,
  toggleClass: (className: string, cb?: () => void) => void,
  css: (style: object) => void,
  show: () => void,
  hide: () => void,
  update: (cb: (partsData) => Array<ItemProps>) => void,
  updateContent: (param: Pick<ItemProps, 'title' | 'img' | 'url'>) => void,
  children: (className: string | number) => Array<ItemRef>,
  parent: (className: string | number) => Array<ItemRef>,
  siblings: (className: string) => Array<ItemRef>,
  remove: () => void,
  getUniqId: () => string,
  getData: () => Array<ItemProps>,

  // 子容器实例
  body?: PartsRefProps,
  footer?: PartsRefProps,
  titles?: PartsRefProps,
  dot?: Pick<PartsRefProps, 'update' | 'children'>,
};

查找父子组件

// 一级子组件
const childs = itemRef.current.children(1);

// 所有子组件,子组件中的嵌套子组件都将返回
const childs = itemRef.current.children();

// 查找指定样式子组件
const childs = itemRef.current.children('class-name');

// 一级父组件
const parent = itemRef.current.parent(1);

// 所有父级组件
const parents = itemRef.current.parent();

// 查找指定样式的父级组件
const parents = itemRef.current.parent('class-name');

Item 组件更新
全局更新会触发所有子结构渲染,请注意使用

itemRef.current.update((state)=>{
  const newState = {...state, ......}
  return newState
})

子结构实例方法

在 Item 实例中包含 body, footer, dot, titles 子结构,它们有自己的执行方法,这提升了渲染精度,不会导致大面积更新结构

type PartsRefProps = {
  getClassName: () => string,
  addClass: (className: string, cb?: () => void) => void,
  removeClass: (className: string, cb?: () => void) => void,
  hasClass: (className: string) => boolean,
  toggleClass: (className: string, cb?: () => void) => void,
  css: (style: object) => void,
  show: () => void,
  hide: () => void,
  update: (cb: (partsData) => Array<BodyProps | FooterProps | TitlesProps | DotProps>) => void,
  children: () => Array<ItemRef>,
};

子组件更新
全局更新会触发所有 body 内子结构渲染,请注意使用

itemRef.current.body.update((state)=>{
  const newState = {...state, ......}
  return newState
})

List 实例方法

type ListRef = {
  getData: () => Array<ItemProps>,
  getClassName: () => string,
  addClass: (className: string, cb?: () => void) => void,
  removeClass: (className: string, cb?: () => void) => void,
  hasClass: (className: string) => boolean,
  toggleClass: (className: string, cb?: () => void) => void,
  css: (style: object) => void,
  show: () => void,
  hide: () => void,
  getUniqId: () => string,
  update: (cb: (partsData) => Array<ItemProps>) => void,
  children: (className: string | number) => Array<ItemRef>,
  parent: (className: string | number) => Array<ItemRef>,
  remove: () => void,
  append: (param: ItemProps) => void,
  prepend: (param: ItemProps) => void,
  delete: (uid: string | number) => void,
  keys: () => Array<{
    id: string,
    uniqId: string,
    title: string | number | ItemProps | ItemProps[] | React.ReactElement,
    attr: {},
  }>,
};

List 组件更新
全局更新会触发所有子结构渲染,请注意使用

listRef.current.update(({data})=>{
  const newData = {...data, ......}
  return newData
})