【问题标题】:useSelector not updating value after dispatch调度后useSelector不更新值
【发布时间】:2021-10-15 15:59:16
【问题描述】:

我在网上找不到解决方案,我一直在网上学习教程,这似乎是更新我的商店然后检索更新值的正确方法,但它不起作用。

这是我的代码:

我的行动

dispatch({type: 'RESPONSE_TIME'})

我的减速器

  case "RESPONSE_TIME":

      const newState = {
        ...state,
        filters: {
          ...state.filters,
          response_time: '12',
        }
      }
      return newState;

我的看法

const filters = useSelector(state => state.ad.filters);

useEffect(() => {
    console.log('look', filters.response_time)
  }, [filters.response_time])

我的问题是过滤器值在我看来没有更新,即使当我检查减速器内部的状态时,它也已更新。

【问题讨论】:

  • 这是有道理的,因为你的状态看起来像这样:state.filters.response_time 所以它可能应该是 state.filters.ads
  • 是的,但是如果每次使用 dispatch 你设置 response_time12 redux 状态不会更新,useEffect 将永远不会被触发......
  • @GiovanniEsposito 它的初始值为'all',所以当我第一次将它设置为'12'时它应该最少重新渲染。
  • 我同意你的看法。当然,这个第一次设置应该来自一个在调用调度之前已经在useSelector 中读取all 值的组件。你验证了吗?将response_time 放入html:你应该看到all。然后单击发送更改的按钮。您现在应该看到12。你能做这个测试吗?
  • @GiovanniEsposito 我已经进行了很多次测试,它确实显示了所有内容,第一次渲染但它不会重新渲染,这就是我发表这篇文章的原因。

标签: reactjs react-native redux react-redux react-hooks


【解决方案1】:

它可以是嵌套的useEffect 依赖,你可以试试下面吗?

const { response_time } = useSelector(state => state.ad.filters);

useEffect(() => {
    console.log('look', response_time)
  }, [response_time])

【讨论】:

    【解决方案2】:

    它可能已更新,但您使用的 console.log() 不在 useEffect 函数中,因此它不考虑状态变化,试试这个:

    const filters = useSelector(state => state.ad.filters);
    useEffect(() => {
        console.log('look', filters.response_time)
    }, [filters.response_time])
    

    而不是这个:

    const filters = useSelector(state => state.ad.filters);
    console.log('look', filters.response_time)
    

    【讨论】:

    • 我试过了,但是dispatch后还是没有控制台记录新值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2021-06-17
    • 2021-10-15
    • 2022-01-24
    • 2023-03-27
    相关资源
    最近更新 更多