即使使用useTranation(),输入速度也很慢

lx0bsm1f  于 2022-09-21  发布在  React
关注(0)|答案(2)|浏览(986)

我正在玩在Reaction 18中添加的新useTransition()钩子。

我创建了一款应用程序,突出显示匹配的名字。如果匹配,则该项目变为绿色,否则变为红色。下面是我是如何做到的:

import { useState, useTransition } from 'react';
import people from './people.json'; // 20k items

const PeopleList = ({ people, highlight, isLoading }) => {
    return (
        <>
            <div>{isLoading ? 'Loading...' : 'Ready'}</div>
            <ol>
                {people.map((name, index) => (
                    <li
                        key={index}
                        style={{
                            color: (
                                name.toLowerCase().includes(highlight)
                                ? 'lime'
                                : 'red'
                            )
                        }}
                    >
                        {name}
                    </li>
                ))}
            </ol>
        </>
    );
};

const App = () => {
    const [needle, setNeedle] = useState('');
    const [highlight, setHighlight] = useState('');
    const [isPending, startTransition] = useTransition();

    return (
        <div>
            <input
                type="text"
                value={needle}
                onChange={event => {
                    setNeedle(event.target.value);
                    startTransition(
                        () => setHighlight(event.target.value.toLowerCase())
                    );
                }}
            />
            <PeopleList
                people={people}
                highlight={highlight}
                isLoading={isPending}
            />
        </div>
    );
};

export default App;

JSON文件包含一个20,000人的数组。不幸的是,在这种情况下,useTransition()似乎并没有提高性能。无论我是否使用它,输入都非常滞后,每个字符之间大约有0.5s的延迟。

我的第一个想法是,这么大的DOM树可能会导致输入延迟,但在原始的HTML页面中似乎不是这样。

在我的示例中,为什么useTransition()不能让输入变得流畅?

whlutmcx

whlutmcx1#

原因是你的应用程序运行在Reaction 17模式下。

消息来源:https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html#deprecations
REACTION-DOM:ReactDOM.Render已弃用。使用它将发出警告,并在Reaction 17模式下运行您的应用程序。

gev0vcfq

gev0vcfq2#

将PeopleList组件 Package 在备忘录中如何?

据我所知。每次调用setNeedle时,<App/>组件都会重新呈现,然后<PeopleList/>组件也会重新呈现,即使<PeopleList/>组件中没有任何更改。

相关问题