zWingz / my-blog-config

my-blog-config
MIT License
2 stars 0 forks source link

介绍三个React组件 #30

Open zWingz opened 5 years ago

zWingz commented 5 years ago

keywords:

React-Image

源码 Demo

一个用于加载/预览图片的组件

Image

import { Image } from '@zzwing/react-image'

<Image src='any.jpg' width='200px' height='200px' onClick={this.onClick}/>

Preview

图片浏览器, 可以放大/移动/切换等. 已集成到Image中, 可以通过 preview={false}关闭预览功能. 也可以直接通过api调用

import { PreviewApi } from '@zzwing/react-image'
const list = ['1.jpg', '2.jpg', '3.jpg']
// use index
PreviewApi.preview(2, list)
// or use src
PreviewApi.preview('2.jpg', list)

  

React-Table

源码 Demo

可固定表头及两侧的表格.

antd的表格

antd的表格也能满足该功能, 但也有几个不足点(我个人觉得)

解决方法

指定表格的scrollTarget, 既滚动的目标, 默认是document.scrollingElement.

不足点

使用方式

antd类似

import { Table } from '@zzwing/react-table'
const data = [{key1: '123', keyn: '123'}]
const columns = [{
    title: 'column1',
    fixed: 'left',
    dataIndex: 'key1'
}, { /* ... */} , {
    title: 'column2',
    fixed: 'right',
    dataIndex: 'keyn'
}]

<Table dataSource={data} columns={columns} rowKey='key1'/>

React-Form-Wrapper

源码 Demo

封装了onChangevalue的高阶组件, 与antdform组件类似 不过只包含最基础的数据绑定, 也可通过options来自定义数据的读写.

import FormWrapperHoc from '@zzwing/react-form-wrapper'

class Test extends React.PureComponent {
  render() {
    const { itemWrapper, getState } = this.props.formWrapper
    const Input = itemWrapper('valueKey', {/* options */})(<input />)
    const value = getState().valueKey
    return (
      <>
        {Input}
        you can get value for {value}
      </>
    )
  }
}

链式key的读写实现

const Input = itemWrapper('a.b.c.d')(<input />)

按照一般实现, 会通过遍历每一层来set/get数据.

const _state = {}
const pathArr = path.split('.')
let tmp = _state
pathArr.forEach((each, index) => {
    if(index === pathArr.length - 1) {
        // do something
    }
    if(each in tmp) {
        tmp = tmp[each]
    } else {
        tmp[each] = {}
        tmp = tmp[each]
    }
})

最近改了一种实现方法, 通过一个chain对象直接存储path对应的数据 Edit chain object

// a.b.c.d
const chain = {
    a: {b: chain['a.b']},
    'a.b': {c: chain['a.b.c']},
    'a.b.c': {d: chain['a.b.c.d']},
    'a.b.c.d': undefined
}

最后

antd是一个功能很全的UI库 但又正因为它功能很全,而大部分我是不需要,无形中可能添加了不少的代码量 所以我更喜欢是参考antd的实现,去开发满足个人需求的组件 自己开发的组件,自己会更清楚,使用起来更加顺手,扩展起来也会很方便 不过对于DatePicker这类组件,我想我还是直接用antd的吧


希望这几个组件能帮到你.