【问题标题】:Too many re-renders. When setting state太多的重新渲染。设置状态时
【发布时间】:2020-11-01 12:37:21
【问题描述】:

我正在尝试使用带有 typescript 的 expo 制作一个电子商务应用程序,但我在加载我的类别页面时遇到了问题。 有两种方式可以访问分类页面

  1. 通过底部导航 - 这个很好用
  2. 通过主页上的按钮

尝试根据通过主页传入的参数设置状态,但它给了我太多重新渲染错误。 以下是我目前拥有的代码。

因为第一种方式进入分类页面,所以需要有默认的,我试过放一个条件作为默认分类,但是再次通过首页访问,第二次分类就不会改变了。

export default function CategoryList(props: Props) {
  let { params } = useRoute<StackRouteProp<'Home'>>()

  const [currentCategory, setCategory] = useState({categories: Categories[0]});

  if (params) {
    setCategory({categories: params.categories})
  }
}

【问题讨论】:

  • 您能否更准确地了解预期的行为应该是什么。下面的答案似乎都认为您只想在组件安装时只setCategory 一次,但是您的回答暗示并非如此。不清楚你想让代码做什么。

标签: reactjs typescript react-native expo


【解决方案1】:

您也可以将useEffect 与useRef 一起使用:

export default function CategoryList(props: Props) {
  let { params } = useRoute<StackRouteProp<'Home'>>()

  const [currentCategory, setCategory] = useState({categories: Categories[0]});
  const canSet = useRef(true)

  useEffect(() => {
    if (params && canSet.current) {
      setCategory({ categories: params.categories })
      canSet.current = false
    } else {
      canSet.current = true
    }
  }, [params])

【讨论】:

  • 感谢@nicodp,与我上面的评论类似的问题,isSet 之后将始终设置为true,所以下次页面被选择不同的类别时,它不会改变
  • 我用canSet ref 编辑了我的答案,看看吧。
  • 是的!谢谢你的帮助。虽然不需要 useRef,完全摆脱它并工作:)
【解决方案2】:

每次调用setCategory,它都会重新渲染组件。然后,每次渲染组件时,如果 params 存在,它将再次调用 setCategory,这将导致另一个渲染,再次调用 setCategory,以此类推,直到达到 React 的渲染限制。

解决此问题的一种可能方法是在第一次之后添加一个布尔值来设置,这将防止它第二次进入 if 块:

const [currentCategory, setCategory] = useState({categories: Categories[0]});
const [hasParamsCategory, setParamsCategory] = useState(false);

if (params && !hasParamsCategory) {
  setCategory({categories: params.categories});
  setParamsCategory(true);
}

这仍然不是完美的,因为通常在渲染期间直接调用状态更改函数不是一个好习惯,但这将作为一种快速而肮脏的解决方法。

【讨论】:

  • 感谢 Peter,不过,setCategory 仍然不会比第一次运行,因为 hasParamsCategory 将始终设置为 true
  • 第一次之后params又变了吗?
  • 是的,它会根据从主页选择的类别而变化。
  • 你在其他地方打电话给setCategory吗?如果没有,您可以将currentCategory 设为let 而不是const 并执行currentCategory = params.categories
  • 不幸的是 setCategory 被多次调用,还有其他建议吗?还是有更好的方法从参数设置状态?
猜你喜欢
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2023-03-09
  • 2021-06-11
相关资源
最近更新 更多