微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

react native中useEffect中数据更新后如何加载UI

如何解决react native中useEffect中数据更新后如何加载UI

我正在使用 useEffect 将来自 redux 的所有数据保存在一个状态中。

下面是我的代码

const [items,setItems] = useState();
React.useEffect(() => {
    setItems(createMenuReducer.data.product);
    console.log("item",items);
},[items]);

<ScrollView>
    {createMenuReducer &&
        items?.map((item,index) => {
            return (
                <ItemComponent
                    item={item}
                />
            );
        })}
</ScrollView>

console.log 输出

item undefined

但是当我再次单击保存时,所有项目都得到了安慰:

item (10) [{…},{…},{…}]

我尝试更新状态,认为它也会更新 UI,但这并没有发生。第一次加载时我得到一个空白页面,但是当我再次单击保存时,所有项目都显示在 UI 中。如何解决此问题,以便在应用加载时所有项目都在屏幕上?

解决方法

要知道状态更新受闭包的影响并且是异步的,因此在调用 setItems 后不会立即处理您的项目值,但它将在下一次渲染中可用。

另请注意,您必须在 createMenuReducer 数据更新时更新您的项目,因此将其添加为 useEffect 而不是项目的依赖项

const [items,setItems] = useState([]);
React.useEffect(() => {
    setItems(createMenuReducer.data.product);
},[createMenuReducer?.data.product]);

console.log(items);

<ScrollView>
    {items.map((item,index) => {
            return (
                <ItemComponent
                    item={item}
                />
            );
        })}
</ScrollView>

但是在大​​多数情况下,您不需要将 props 值复制到 state 中,而应该直接使用 props 中的数据

<ScrollView>
        {createMenuReducer?.data?.product?.map((item,index) => {
                return (
                    <ItemComponent
                        item={item}
                    />
                );
            })}
    </ScrollView>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。