【问题标题】:Can I Set Initial State with Props in React + Redux?我可以在 React + Redux 中使用 Props 设置初始状态吗?
【发布时间】:2019-11-23 23:19:32
【问题描述】:

我遇到了一个问题,我的状态显示为未定义,我怀疑这可能是因为我将初始状态作为道具传递。

useState 语句如下所示:

const [filteredData, setData] = useState(props.cardsToShow);

我有 cardsToShow 作为在 MapStateToProps 中定义的状态

cardsToShow: searchCards(state)

它是根据我拥有的以下搜索语句填充的。请注意,棒球是初始数据加载,搜索是存储中的搜索查询。

const searchCards = ({ baseball, search }) => {
  return search
    ? baseball.filter(a =>
        a.title[0].toLowerCase().includes(search.toLowerCase())
      )
    : baseball;
};

如果我控制台日志props.cardsToShow 我得到的数据是一个数组的对象。

如果我控制台日志filteredData 我得到一个空对象。

有什么想法吗?

【问题讨论】:

  • 你说如果你console.log(props.cardsToShow)你得到正确的数据。它是组件挂载后的第一个 console.log 吗?还是在该日志之前您收到未定义?

标签: javascript reactjs redux lodash


【解决方案1】:

使用 Redux 有几种方法,您可以使用默认参数为您的 reducer 设置初始状态。

const defaultState = {
    state: 0
}

function counter(state = defaultState, action) {
...

或者如果你使用选择器

const getSomeValues = store => store.someValue || 1

如果someValueundefined,我们将得到1。

更深入的解释:https://redux.js.org/recipes/structuring-reducers/initializing-state

如果您使用的是 lodash,它有 get 函数,它允许您在属性返回未定义时指定默认值。 https://lodash.com/docs/#get

【讨论】:

    【解决方案2】:

    如果我理解得很好,那么您将面临以下问题。

    根据这篇文章:

    https://learnwithparam.com/blog/how-to-pass-props-to-state-properly-in-react-hooks/

    useState 不会在 props 更改时初始化,因此您应该在 useEffect 上设置状态

    useEffect(() => {
        setData(props.cardsToShow);
    }, [props]);
    

    【讨论】:

    • 我刚刚尝试了您的 Rander 建议,现在它实际上运行良好。您是否有理由被否决,因为(虽然我是新人)我认为这是一个很好的建议。谢谢!
    • @JohnRogerson 它被否决了,因为它只是一种解决方法,而不是深度修复
    • 下次我会努力改进我的答案。感谢您的两个反馈
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 2019-12-05
    • 1970-01-01
    • 2016-10-15
    • 2021-06-04
    • 2021-03-10
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多