簡單介紹三個React組件吧。javascript
一個用於加載/預覽圖片的組件react
loading
和error
狀態, 並顯示不一樣提示.IntersectionObserver
來實現圖片懶加載Preview
來進行圖片預覽group
來管理圖片預覽列表, 同一個group
的圖片會出如今預覽列表中import { Image } from '@zzwing/react-image'
<Image src='any.jpg' width='200px' height='200px' onClick={this.onClick}/>
複製代碼
圖片瀏覽器, 能夠放大/移動/切換等. 已集成到Image
中, 能夠經過preview={false}
關閉預覽功能. 也能夠直接經過api
調用git
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)
複製代碼
可固定表頭及兩側的表格.chrome
antd
的表格也能知足該功能, 但也有幾個不足點(我我的以爲)api
width
用來固定列寬: 經過拆分thead
和tbody
來固定表頭, 經過colgroup
來完成列寬的固定antd
的表格功能太強大, 有不少功能我是用不上, 無形中增長了代碼.指定表格的scrollTarget
, 既滾動
的目標, 默認是document.scrollingElement
.瀏覽器
transform
固定,因爲屬於同一個table
, 這樣能解決tbody
和thead
不對齊的問題.table
冗餘實現(antd也是如此), 但只會冗餘須要固定的部分。經過absolute
+ padding
實現兩側固定.scroller
來模擬橫向滾動條, 也就是說任什麼時候候均可以拉動滾動條. (固然也能夠經過shift
+ 滾輪完成滾動)thead
使用了transform
, 所以也帶來了幾個問題
thead
設了transform
以後, border
會失效, 所以使用了box-shadow
來模擬border
. 固然,mousewheel
來設置transform
的時候, 由於滾動和視圖更新有延遲, 在firfox
和safari
會有抖動, 在chrome
下表現良好.
chrome
和firfox
分別加入window.addEventListener('scroll', console.log)
, 鼠標滾動一次, 會發現ff
下會觸發屢次回調, 而chrome
只會觸發一次safari
下, thead
在被固定後的box-shadow
會失效.和antd
相似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'/>
複製代碼
封裝了onChange
和value
的高階組件, 與antd
的form
組件相似 不過只包含最基礎的數據綁定, 也可經過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} </> ) } } 複製代碼
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
對應的數據
// 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
}
複製代碼
get
操做, 則能夠直接從chain[path]
中獲取數據set
操做, 則能夠直接修改chain['a.b.c'].d = 'str'
, 最後修改chain['a.b.c.d'] = 'str
set
操做會同步chain.a
和chain.a.b
antd
是一個功能很全的UI庫 但又正由於它功能很全,而大部分我是不須要,無形中可能添加了很多的代碼量 因此我更喜歡是參考antd
的實現,去開發知足我的需求的組件 本身開發的組件,本身會更清楚,使用起來更加順手,擴展起來也會很方便 不過對於DatePicker
這類組件,我想我仍是直接用antd
的吧
但願這幾個組件能幫到你.