Каждый раз при рендеринге App
вы создаете новое определение для компонента Example
. Он может делать то же самое, что и старый, но это новый компонент. Поэтому react сравнивает элемент из одного рендера с элементом следующего рендера и видит, что у них разные типы компонентов. Таким образом, он вынужден размонтировать старый и смонтировать новый, как если бы вы изменили что-то с <div>
на <span>
. Новый начинает прокручиваться до 0.
Решение этой проблемы - создать пример только один раз вне приложения.
const Example = props => (
<List
className="List"
height={80}
itemCount={props.propsAbc.length}
itemSize={20}
width={300}
itemData={{
dataAbc: props.propsAbc
}}
>
{({ index, style, data }) => (
<div className={index % 2 ? "ListItemOdd" : "ListItemEven"} style={style}>
{data.dataAbc[index]}
</div>
)}
</List>
);
function App() {
const [count, setCount] = useState(0);
let [dataArray, setDataArray] = useState([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
return (
<div className="App">
<h1>Scroll down the blue box, then click the button</h1>
<h2>You clicked {count} times!</h2>
<button onClick={() => setCount(count - 1)}>Decrement</button>
<button onClick={() => setCount(count + 1)}>Increment</button>
<div
style={{ maxHeight: "80px", overflow: "äuto", background: "lightblue" }}
>
<Example propsAbc={dataArray} />
</div>
</div>
);
}
https://codesandbox.io/s/react-hooks-counter-demo-qcjgj