【问题标题】:React child component overtakes state from another child when filtered from parent从父级过滤时,反应子组件从另一个子组件中超越状态
【发布时间】:2020-04-10 03:23:15
【问题描述】:

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

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

我知道/认为这与 js 引用有关,但我不知道如何解决它!

父母:

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>
  );
}

孩子:

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

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

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

false [设置状态]

cat false [设置状态]

...等

现在我点击第一个按钮就可以了

真正的[设置状态]

cat false [设置状态]

...等

然后我在搜索框中输入字母“o” - 现在应用程序呈现

true [设置状态]

但是 "old" 子组件状态从未设置为 true 对吗?我一定错过了一些基本的东西,但我就是不明白..非常感谢帮助

【问题讨论】:

标签: javascript reactjs react-hooks


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢,这当然是原因 - 实际上这在教程等中通常没有得到很好的解释。
【解决方案2】:

我想是因为你没有钥匙。试试这个:

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

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 2020-04-01
    • 2019-09-17
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多