import * as React from 'react'; import { FocusZone, FocusZoneDirection } from '@fluentui/react/lib/FocusZone'; import { DefaultButton } from '@fluentui/react/lib/Button'; import { Dropdown, IDropdownOption } from '@fluentui/react/lib/Dropdown'; import { List, ScrollToMode, IList } from '@fluentui/react/lib/List'; import { TextField } from '@fluentui/react/lib/TextField'; import { createListItems, IExampleItem } from '@fluentui/example-data'; import { mergeStyleSets, getTheme, normalize } from '@fluentui/react/lib/Styling'; import { useConst } from '@fluentui/react-hooks'; const evenItemHeight = 25; const oddItemHeight = 50; const numberOfItemsOnPage = 10; const theme = getTheme(); const dropdownOptions = [ { key: 'auto', text: 'Auto' }, { key: 'top', text: 'Top' }, { key: 'bottom', text: 'Bottom' }, { key: 'center', text: 'Center' }, ]; const styles = mergeStyleSets({ container: { overflow: 'auto', maxHeight: 400, border: '1px solid #CCC', marginTop: 20, selectors: { '.ms-List-cell:nth-child(odd)': { height: 50, lineHeight: 50, background: theme.palette.neutralLighter, }, '.ms-List-cell:nth-child(even)': { height: 25, lineHeight: 25, }, }, }, itemContent: [ theme.fonts.medium, normalize, { position: 'relative', boxSizing: 'border-box', display: 'block', borderLeft: '3px solid ' + theme.palette.themePrimary, paddingLeft: 27, }, ], }); const onRenderCell = (item: IExampleItem, index: number): JSX.Element => { return (
{index}   {item.name}
); }; export const ListScrollingExample: React.FunctionComponent = () => { const items = useConst(() => createListItems(5000)); const [selectedIndex, setSelectedIndex] = React.useState(0); const [scrollToMode, setScrollToMode] = React.useState(ScrollToMode.auto); const listRef: React.RefObject = React.useRef(null); const scroll = (index: number, propScrollToMode: ScrollToMode): void => { const updatedSelectedIndex = Math.min(Math.max(index, 0), items.length - 1); setSelectedIndex(updatedSelectedIndex); setScrollToMode(propScrollToMode); listRef.current?.scrollToIndex( updatedSelectedIndex, idx => (idx % 2 === 0 ? evenItemHeight : oddItemHeight), scrollToMode, ); }; const getPageHeight = (idx: number): number => { let h = 0; for (let i = idx; i < idx + numberOfItemsOnPage; ++i) { const isEvenRow = i % 2 === 0; h += isEvenRow ? evenItemHeight : oddItemHeight; } return h; }; const scrollRelative = (delta: number): (() => void) => { return (): void => { scroll(selectedIndex + delta, scrollToMode); }; }; const onChangeText = (ev: React.FormEvent, value: string): void => { scroll(parseInt(value, 10) || 0, scrollToMode); }; const onDropdownChange = (event: React.FormEvent, option: IDropdownOption) => { let scrollMode = scrollToMode; switch (option.key) { case 'auto': scrollMode = ScrollToMode.auto; break; case 'top': scrollMode = ScrollToMode.top; break; case 'bottom': scrollMode = ScrollToMode.bottom; break; case 'center': scrollMode = ScrollToMode.center; break; } scroll(selectedIndex, scrollMode); }; return (
-10 -1 +1 +10
Scroll item index:
); };