An open API service indexing awesome lists of open source software.

https://github.com/ymzuiku/react-event-manager

内聚且高性能的事件管理
https://github.com/ymzuiku/react-event-manager

form react react-event-handlers react-form

Last synced: about 2 months ago
JSON representation

内聚且高性能的事件管理

Awesome Lists containing this project

README

        

# 内聚的事件管理器

使用之前,请先阅读我的一篇文章,如果你的应用不够复杂,你或许不需要此库:

[我们或许不需要 React 的 Form 组件](https://juejin.im/post/5cbda50e6fb9a03212505511)

## 克隆 & 使用

懒得编译发布了, 进入项目

```sh
cd your-project/components
```

拷贝并执行以下命令, 将会只克隆组件代码

```sh
clone-by-ymzuiku(){
git clone --depth=1 https://github.com/ymzuiku/$1.git && rm -rf $1/.git $1/.gitignore
}
clone-by-ymzuiku react-event-manager
```

直接引用

```js
import Manager from 'components/react-event-manager';
```

## API

### Manager API

| key | 类型 | 说明 |
| ----------- | ------------------ | ----------------------------------------------------------------------------- |
| datas | Object | Manager 的数据集合, 具体内容参考 datas API |
| onEvent | Function | 当 Event 的事件触发时, 进行回调 |
| onDidMount | Function | 当 Manager DidMount 时, 进行回调 |
| onUnMount | Function | 当 Manager UnMount 时, 进行回调 |
| group | String | 默认为 'handle', 如果多个Manger嵌套, 希望父集捕获子集时, 可以修改group, 然后在子集注入多个 handle |

### Handle API

我们可以为一个组件注入以下props, Manger会递归子组件, 根据这些props注入相应的

| key | 类型 | 说明 |
| ------------ | ------------- | ------------------------------------------------ |
| handle | String | handle 请确保同一个 Manager 下 所有 handle 是唯一的, Manager 的数据集合 |
| valuekey | String | 该 Event 会触发的值, 默认为 'value' |
| events | String | 该 Event 会触发的值和事件, 默认为 'onChange, onKeyEnter' |
| defvalue | any | 默认设置给 value 的值 |
| SubManager | Boolean | SubManager 标记为 true, 会被注入 SubManager 组件, 用于跨组件捕获事件至父 Manager |

### datas API

| key | 类型 | 说明 |
| --------- | -------------------- | -------------------------------------------------------------- |
| handle | String | 触发事件的 handle 名称 |
| value | Any | onEvent 返回的值, 如果是 DOM 对象返回的是 event.target.value |
| values | {[handle]:value, ...} | 由 handle 名和 value 组合而成的对象 |
| ref | React.element | 当前触发的 React 对象 |
| refs | Array | 所有被 包裹的 React 对象的集合 |
| update | (handleName, nextProps)=>void | 更新某个子组件的函数, 参数会作为 Props 传递给子组件 |
| eventHandle | any | 触发 onEvent 的类型, 如 onChange, onClick |
| eventArgs | Array | 触发 onEvent 的类型的默认参数 |

## 基本使用方式

Manger本身不包含DOM, 所以需要将他放在一个标签内, 如 div 内:

```js
export default ()=> {
return (







)
}
```

接下来的例子, 我们默认 Manager 在一个 div 内

## 捕获事件

Manager 内的组件添加一个 handle 属性, Manager 即可捕获其的事件, 默认捕获 `onChange, onKeyEnter`

```js
// 所有值, ref, update事件, 联动对象, 都在 datas 中
console.log(datas)}>

```

## 触发其他事件

主动触发非常简单, 主动设置 events 类型如: `onMouseEnter, onMouseLeave`

```js
console.log(event, datas)}>

```

在原有的事件上扩展事件, 默认事件为 onChange, onKeyEnter, 在此基础上扩展, 可使用 `...` 符号:

```js
console.log(event, datas)}>

```

## 跨组件捕获

1. 声明一个组件为 SubManager

```js
console.log(event, datas)}>

```

2. 该组件会被注入一个 SubManager 组件, SubManager 将捕获的事件返回到父 Manager

```js
function HeaderBar({SubManager}){
return (





)
}
```

## 联动

```js
// 所有值, ref, update事件, 联动对象, 都在 事件的返回值中
{
// 如果username包含 404, 就更新 password
if (values.username.index('404') >= 0) {
update('password', {
value: '被联动修改了',
style:{{ color:'#f00' }},
})
}
}}>

```

## 根据条件执行事件

```js
// refs 中包含所有 Event 子组件的ref, 根据条件执行事件即可
{
if (value === '...') {
refs.button.save();
}
}}
>

我是标题

```

## 获取 Manager 数据

我们在 onChange 中可以获取 Manager 数据, 亦可直接传递 datas 获取 Manager 数据

```js
const datas = {};

// ManagerDatas 将会存储在 datas 对象中

```

## 捕获键盘

捕获 D 键

```js