gpt4 book ai didi

javascript - 当从父级过滤时,React 子组件会取代另一个子级的状态

转载 作者:行者123 更新时间:2023-11-30 10:57:35 24 4
gpt4 key购买 nike

所以我有一个映射子数组的父组件,这些子组件都有一些状态 Hook 变量——在示例中它是一个字符串,但它可以是任何东西。

当我过滤父组件数组时,子组件神秘地取代了前一个数组的状态值:如果第一个子组件将状态设置为字符串“true”——新数组中的第一个子组件也呈现为“true” .

我知道/认为它与 js 引用有关,但我不知道如何修复它!

parent :

function App() {
const array = ['the', 'cat', 'and', 'the', 'old', 'hat']
const [words, setWords] = useState(array)

const filterWords = (e) => {
setWords(array.filter( a => a.includes(e.target.value)))
}

return (
<div className="App">
<input type='text' onChange={filterWords} />
{
words.map( word => <Sub word={word} />)
}

</div>
);
}

child :

    const [state,
setState] = useState('false')

useEffect( () => console.log('rerendered', state) )
return (
<div>
<>{props.word}</>
<>{state}</>
<button onClick={() => setState('true')}>set state</button>
</div>
)
}

这会呈现一个列表,如下所示:

假的[设置状态]

cat false [设置状态]

...等等

现在我点击第一个按钮,它就开始了

真正的[设置状态]

cat false [设置状态]

...等等

然后我在搜索框中输入字母“o”——现在应用呈现了

true [设置状态]

但是“旧的”子组件状态从未设置为true,对吗?我一定是遗漏了一些基本的东西,但我就是不明白。非常感谢帮助

最佳答案

当您使用 map 渲染 JSX 时,您渲染的元素需要一个唯一的键。键是 React 如何跟踪哪些元素属于哪些被映射的值;没有它们,如果一个元素改变了它在数组中的位置,它可能会导致 React 在重新渲染期间不知道哪个 JSX 元素来自哪个数组元素的问题。

假设数组中的每个单词都是唯一的,您可以这样做:

{
words.map( word => <Sub word={word} key={word} />)
}

如果数组中的单词不是唯一的,您将需要某种方法来为每个元素创建一个唯一的键,即使它们在数组中四处移动也不会改变。

关于javascript - 当从父级过滤时,React 子组件会取代另一个子级的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59377370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com