-
Notifications
You must be signed in to change notification settings - Fork 934
/
windowing-with-react-virtualized.js
80 lines (78 loc) · 2.33 KB
/
windowing-with-react-virtualized.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import React from 'react'
import {List} from 'react-virtualized'
import matchSorter from 'match-sorter'
import Downshift from '../../src'
import countries from '../countries'
function advancedFilter(theItems, value) {
return value
? matchSorter(theItems, value, {
keys: ['name', 'code'],
})
: theItems
}
// Render your list
class Example extends React.Component {
state = {items: countries, inputValue: ''}
handleStateChange = changes => {
if (changes.hasOwnProperty('inputValue')) {
const {inputValue} = changes
this.setState({inputValue, items: advancedFilter(countries, inputValue)})
}
}
render() {
const {items, inputValue} = this.state
return (
<div>
<h1>Windowing example</h1>
<div>
<Downshift
inputValue={inputValue}
itemToString={i => (i ? i.name : '')}
onStateChange={this.handleStateChange}
itemCount={items.length}
>
{({
getInputProps,
getItemProps,
isOpen,
selectedItem,
highlightedIndex,
}) => (
<div>
<input {...getInputProps()} />
{isOpen ? (
<List
width={300}
scrollToIndex={highlightedIndex || 0}
height={200}
rowCount={items.length}
rowHeight={20}
rowRenderer={({key, index, style}) => (
<div
key={key}
{...getItemProps({
item: items[index],
index,
style: {
...style,
backgroundColor:
highlightedIndex === index ? 'gray' : 'white',
fontWeight:
selectedItem === items[index] ? 'bold' : 'normal',
},
})}
>
{items[index].name}
</div>
)}
/>
) : null}
</div>
)}
</Downshift>
</div>
</div>
)
}
}
export default Example