Javascript 我可以在React+;中使用道具设置初始状态吗;雷杜?

Javascript 我可以在React+;中使用道具设置初始状态吗;雷杜?,javascript,reactjs,redux,lodash,Javascript,Reactjs,Redux,Lodash,我有一个问题,我的状态显示为未定义,我怀疑这可能是因为我将初始状态作为道具传递 下面是useState语句的样子: const [filteredData, setData] = useState(props.cardsToShow); 我将cardsToShow作为MapStateTrops中定义的状态,如下所示 cardsToShow: searchCards(state) 它是根据下面的搜索语句填充的。请注意,棒球是初始数据加载,搜索是存储中的搜索查询 const searchCard

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

下面是useState语句的样子:

const [filteredData, setData] = useState(props.cardsToShow);
我将cardsToShow作为MapStateTrops中定义的状态,如下所示

cardsToShow: searchCards(state)
它是根据下面的搜索语句填充的。请注意,棒球是初始数据加载,搜索是存储中的搜索查询

const searchCards = ({ baseball, search }) => {
  return search
    ? baseball.filter(a =>
        a.title[0].toLowerCase().includes(search.toLowerCase())
      )
    : baseball;
};
如果我使用控制台log
props.cardsToShow
我会得到作为数组对象的数据

如果我使用console log
Filteredata
我会得到一个空对象


有什么想法吗?

如果我理解得很好,您将面临下面所述的问题

根据这篇文章:

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

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

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

根据这篇文章:

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

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

使用Redux有几种方法,您可以使用默认参数设置减速器的初始状态

const defaultState = {
    state: 0
}

function counter(state = defaultState, action) {
...
或者如果你使用选择器

const getSomeValues = store => store.someValue || 1
如果
someValue
undefined
,我们将得到1

要获得更深入的解释:


如果您使用的是lodash,它具有
get
函数,允许您在属性返回未定义时指定默认值

使用Redux有几种方法,您可以使用默认参数设置减速器的初始状态

const defaultState = {
    state: 0
}

function counter(state = defaultState, action) {
...
或者如果你使用选择器

const getSomeValues = store => store.someValue || 1
如果
someValue
undefined
,我们将得到1

要获得更深入的解释:


如果您使用的是lodash,它具有
get
函数,允许您在属性返回未定义时指定默认值

你说过如果你
console.log(props.cardsToShow)
你就能得到正确的数据。它是安装组件后的第一个console.log吗?或者在该日志之前,您收到未定义的?您说过,如果您
console.log(props.cardsToShow)
您将获得正确的数据。它是安装组件后的第一个console.log吗?或者在你收到未定义的日志之前?我刚刚尝试了你的建议Rander,现在它实际上非常有效。你被否决的原因是什么?因为(尽管我是新来的)我认为这是个好建议。谢谢@约翰罗格森:它被否决了,因为它只是一个变通办法,不是一个深层次的修正。下次我会努力改进我的答案。谢谢你的反馈,我刚试过你的建议,Rander,现在它真的很好用。你被否决的原因是什么?因为(尽管我是新来的)我认为这是个好建议。谢谢@约翰罗格森:它被否决了,因为它只是一个变通办法,不是一个深层次的修正。下次我会努力改进我的答案。谢谢你的反馈