【问题标题】:useState does not rerender unless I copy the array除非我复制数组,否则 useState 不会重新渲染
【发布时间】:2019-10-19 15:03:00
【问题描述】:

在一个 react-native 项目中,我使用的是 react-native-camera-roll-picker。这个想法是用户选择一个图像,并且标题更改为“x selected”之类的内容。试图用钩子来解决这个问题。代码如下:

import React, { useState } from 'react';
import RNCameraRollPicker from 'react-native-camera-roll-picker';
import { Header } from './header';
import { Container, Content } from 'native-base';

export const CameraRollPicker = props => {
  const [images, setImages] = useState([]);

  return (
    <Container>
      <Header title={images.length + ' Selected'} />
      <Content>
        <RNCameraRollPicker
          selected={images}
          callback={imgs => setImages(imgs)}
          groupTypes="All"
        />
      </Content>
    </Container>
  );
};

When an image is selected the above does not re-render the component.

现在,如果我将回调线更改为:

callback={imgs => setImages(imgs.map(i => i))}

繁荣它的工作原理。现在我怀疑setState 不知何故没有检测到状态的变化,因此不会再次渲染组件。因此,我认为我应该创建一个数组的副本(例如map),这似乎可以解决问题。我是钩子的新手(实际上是我的第一个钩子组件),我看不到反应教程中明确提到的任何内容来解释这一点。我敢肯定你们中的一个聪明人对此有解释吗? :)

【问题讨论】:

    标签: reactjs react-native react-hooks


    【解决方案1】:

    来自文档https://reactjs.org/docs/hooks-reference.html#bailing-out-of-a-state-update

    如果您将 State Hook 更新为与当前状态相同的值,React 将退出而不渲染子级或触发效果。 (React 使用 Object.is comparison algorithm。)


    react-native-camera-roll-picker 用一个变异数组调用callback(selected, image)(即“与当前状态相同的值”,即使它内部包含不同的项目)。

    【讨论】:

    • 感谢您的回复。好吧,我明白这一点,但是在我的情况下,设置为状态的数组会发生变化。我的意思是数组的长度发生了变化,内容发生了变化等等。我不确定我是否理解,但为什么反应认为状态没有变化。
    • 这与a = []; b = a; b.push(1); console.log(a) // [1] 中的相同 - 如果您改变 1 个数组,则无论有多少变量指向该 1 个数组,都只有 1 个数组。
    • 问题基本上是同一个数组发生了变异,因此在技术上没有改变。这是有道理的,应该已经很明显了。总之谢谢
    猜你喜欢
    • 2022-11-21
    • 2018-02-11
    • 1970-01-01
    • 2021-03-24
    • 2021-11-18
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    相关资源
    最近更新 更多