【问题标题】:How to pass the data from useSelector to useState to prevent re render如何将数据从 useSelector 传递给 useState 以防止重新渲染
【发布时间】:2020-07-22 13:25:21
【问题描述】:

我想将数据从 redux 传递给 useState,但这会导致多次重新渲染。它是另一种变体吗?

这是我目前正在使用的变体

export default function Test(){
 const dispatch = useDispatch();

 const currentData= useSelector(state => state.currentData);
 const [value, setValue] = React.useState(null);
 
 React.useEffect(() => {
  dispatch(getData());
 },[dispatch]);

 React.useEffect(() => {
  setValue(currentData.item);
 },[data])

 return (
   <Autocomplete
    options={data}
    value={value}
   />
 )
}

谢谢!对不起我的英语

【问题讨论】:

  • 您为什么还要在当地保存一份商店价值的副本?它们在功能上是相同的,只需使用商店中的那个。

标签: reactjs react-redux react-hooks


【解决方案1】:

如果您只想存储来自商店的新值而不进行第二次渲染,则可以使用useRef,以防您需要在事件处理程序中保存和读取该值。

如果您只需要 currentData.item 部分只是用于当前渲染,我看不出使用任何钩子的理由,而只是普通的 JS 变量或直接将 currentData.item 传递给您的依赖组件。这是useRef 的样子。

export default function Test(){
 const dispatch = useDispatch();

 const currentData= useSelector(state => state.currentData);
 const value = React.useRef(null);
 value.current = currentData.item;
 
 React.useEffect(() => {
  dispatch(getData());
 },[dispatch]);

 return (
   <Autocomplete
    options={data}
    value={value.current}
   />
 )
}

编辑:

基于提供的沙盒,我创建了一个fork。请注意,我在 index.js 中删除了React.StrictMode。这使仅在开发中(按设计)的渲染数量增加了一倍。我还将国家和位置合并到一个状态对象中,所以现在调用 setState 将导致 1 个额外的渲染,而不是像以前那样的 2 个。在 init 上总共渲染了 2 次 - 首先是通常的渲染,第二次渲染是因为在效果中设置了状态。

【讨论】:

  • 我使用钩子的原因是,如果我更改 Autocomplete 的值,我需要在提交之前将其存储在某个地方
  • 假设 我需要在提交之前将其存储在某处意味着在某些事件处理程序中使用它,在这种情况下您可以使用useRef 方法。
  • 也许最好分享一个重现问题的小代码框。
  • 所以您想在profile 更改时运行效果,并且不想在执行后进行多次渲染?
猜你喜欢
  • 2021-01-07
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 2017-11-21
  • 2020-07-25
  • 1970-01-01
  • 2021-10-21
  • 2020-03-17
相关资源
最近更新 更多