【问题标题】:How to prevent react re-rendering images that are coming from an url?如何防止重新渲染来自 url 的图像?
【发布时间】:2021-02-11 16:15:03
【问题描述】:

这就是我的应用现在的样子:

搜索和排序功能是动态工作的,只要我输入一个字母,它就会找到匹配项,但会重新呈现所有内容。

如果我输入“饥饿”,它会找到饥饿游戏电影,但它会在已有图像时获取图像和渲染。有没有办法让这个过程只做一次,这样我就不用等待每次搜索、每次排序?我使用 Redux,所以数据来自 store,store 从本地 json 文件获取数据。

我想过存储在本地存储上,但我想不通。如您所见,没有 ComponentDidMount 或 Hooks。

这是该页面的代码:

import React from "react";
import "./MoviesAndSeries.css";
import ListShowItem from "./ListShowItem";
import { getVisibleShows } from "../Redux/Selector";
import { connect } from "react-redux";
import FilterShowItems from "./FilterShowItems";
const Movies: React.FC = (props: any) => {
  return (
    <div className="movies">
      <FilterShowItems />
      {props.movies.map((movie: any) => {
        return <ListShowItem key={Math.random()} {...movie} />;
      })}
    </div>
  );
};

const mapStateToProps = (state: any) => {
  return {
    movies: getVisibleShows(state.movies, state.filters),
    filters: state.filters,
  };
};

export default connect(mapStateToProps)(Movies);

【问题讨论】:

  • 再写“getting images”的时候,是不是在向服务器请求图片?这些图片不应该被浏览器自动缓存吗?
  • @terrymorse 看起来它正在从该网址一次又一次地请求图像。否则,同一张图片不应该让我等待它加载。还是只是正常现象?
  • According to the React Docs 对 props 的任何更改都会触发更新,从父级到子级向下发送,因此,您的过滤器会更改,这意味着整个组件将再次重新渲染。更重要的是,你在哪里传递props.filters 我没有看到它传递给FilterShowItems
  • @İlker 你的意思是网络请求?是的,它们是“请求的”,但它们会从缓存中检索,如果您使用的是 chrome,请查看网络选项卡以了解更多信息。
  • @Xavier 我正在使用 Redux,所以它来自 connect() 函数。

标签: javascript json reactjs redux


【解决方案1】:

您正在使用Math.random() 作为键。键一直在变化,React 无法知道项目是否已经存在,因此它会重新渲染所有项目:

<ListShowItem key={Math.random()} {...movie} />;

将密钥更改为稳定且独特的东西,例如电影id(如果你有的话):

<ListShowItem key={movie.id} {...movie} />;

【讨论】:

  • 嗨,我后来改成了“React.Children.toArray”。它做同样的事情。我还应该提供特定的 ID 吗?
  • 是的,你应该这样做。密钥应该是唯一且稳定的,不需要React.Children.toArray
  • 好的最后一个问题,我刚刚给出了来自map函数的索引,key。当该指数稳定时,它还在做同样的事情吗?所以我仍然应该定义一个 id 属性?这就是为什么他们说将索引分配为键,一件坏事吗?
  • 是的,因为在过滤数组的时候,每一项的索引都会发生变化,所以不稳定。添加id或使用电影名称和发行数据等的组合...
  • 非常感谢,基本解决了。正如预期的那样,排序立即生效,搜索也开始了。但是,当我删除搜索词时,它会再次呈现。所以如果我写“hun”饥饿游戏电影会立即显示,但当我删除时,它会呈现。正常的话我就这样放着吧。
猜你喜欢
  • 2020-07-25
  • 2021-05-03
  • 2020-03-09
  • 2020-09-04
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
相关资源
最近更新 更多