我对Reaction还很陌生,我遇到这个问题:当try 将一个数组映射到Reaction有状态组件列表时,我的所有组件都会失go 其状态.我的代码是:

const { useState, useEffect} = React;

const htmlRoot = document.getElementById('root');
const reactRoot = ReactDOM.createRoot(htmlRoot);

const App = () => {
    const Item = (props) => {
        const [count, setCount] = useState(0);
        useEffect(() => {
            const timer = setInterval(() => {
                setCount((lastCount) => lastCount + 1);
            }, 1000);
            return () => clearInterval(timer);
        }, []);
        return <h1>{props.children + ' ' + count}</h1>;
    };

    const arr = [1, 2, 3];
    const [arrState, setArrState] = useState(arr);
    const clickHandler = () => {
        setArrState((lastArrState) => [
            ...lastArrState,
            lastArrState.at(-1) + 1,
        ]);
    };
    return (
        // Unfortunately, Stack Snippets don't support the shorthand form
        // of fragments
        <React.Fragment>
            {arrState.map((num, index) => (
                <Item key={index}>{num}</Item>
            ))}
            <button onClick={clickHandler}>Click Me</button>
        </React.Fragment>
    );
};

reactRoot.render(<App />);
<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.development.js"></script>

对他们来说,这有可能保持他们的状态吗?如果是,那是怎么回事? 最新情况:

推荐答案

每次调用App组件进行呈现时,都会创建一个new Item组件.由于后续渲染使用先前渲染的different个组件,因此Reaction将删除先前的实例并创建具有新状态的新实例.

相反,定义您的Item组件outside App,然后在以下范围内使用它:

const { useState, useEffect } = React;

const htmlRoot = document.getElementById('root');
const reactRoot = ReactDOM.createRoot(htmlRoot);

const Item = (props) => {
    const [count, setCount] = useState(0);
    useEffect(() => {
        const timer = setInterval(() => {
            setCount((lastCount) => lastCount + 1);
        }, 1000);
        return () => clearInterval(timer);
    }, []);
    return <h1>{props.children + ' ' + count}</h1>;
};

const App = () => {
    const arr = [1, 2, 3];
    const [arrState, setArrState] = useState(arr);
    const clickHandler = () => {
        setArrState((lastArrState) => [
            ...lastArrState,
            lastArrState.at(-1) + 1,
        ]);
    };
    return (
        // (Sadly, Stack Snippets don't support the shorthand form
        // of fragments.)
        <React.Fragment>
            {arrState.map((num, index) => (
                <Item key={index}>{num}</Item>
            ))}
            <button onClick={clickHandler}>Click Me</button>
        </React.Fragment>
    );
};

reactRoot.render(<App />);
<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.development.js"></script>


另外,不要用index代替key(除非列表是静态的或不断增长的,并且从未重新排序--您的列表属于后一类,但我猜在某个时候您会从列表中删除项目).详细说明为什么是in the documentationthe article it links to.相反,要确保列出的东西具有某种形式的唯一、可重复使用的标识符.

Javascript相关问答推荐

try 在addEventHandler内设置表单的文件输入.值=空

vue3类型脚本中可能未定义对象''

Mongodb拥有5亿个文档,我想根据JavaScript驱动程序中的两个字段使用regEx进行搜索,而不是模式

使用typeof运算符获取对象值类型-接收字符串而不是数组

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

Redux工具包查询(RTKQ)端点无效并重新验证多次触发

网页自检测外部元素无法加载

TypeScript索引签名模板限制

数字时钟在JavaScript中不动态更新

你怎么看啦啦队的回应?

VUE 3捕获错误并呈现另一个组件

Reaction Native中的范围滑块

如何使用JavaScript拆分带空格的单词

用于在路径之间移动图像的查询

Angular 形式,从DOM中删除不会删除指定索引处的内容,但会删除最后一项

为什么客户端没有收到来自服务器的响应消息?

DOM不自动更新,尽管运行倒计时TS,JS

如何在我的Next.js项目中.blob()我的图像文件?

如何防止ionic 输入中的特殊字符.?

Reaction useState和useLoaderData的组合使用引发无限循环错误