【问题标题】:react native - when changing a property in state all other properties are then empty反应原生 - 当更改状态中的属性时,所有其他属性都为空
【发布时间】:2021-05-21 12:22:57
【问题描述】:

嗨,这是我的第一个问题,所以请放轻松。我是本机反应的新手,我无法使以下代码正常工作:

const [posts, setPost] = useState(props.post);
const [isLiked, setIsLiked] = useState(false);
const onLikePress = async () => {
    setPost({likes: posts.items.likes + 1})
};

上述代码的最终目标是增加帖子的点赞数,道具从主页传递并且一切正常,但是然后点击点赞按钮似乎帖子状态为空并且所有字段变为空。

下面是来自世博会的屏幕截图,在按下类似图标之前,道具中的所有内容都显示正常。

感谢任何帮助理解为什么会发生这种情况

编辑:

感谢您的帮助,它现在可以正常工作,但我仍然有点困惑,当我将状态设置为以下所有尝试错误时。

const [posts, setPost] = useState(props.post);

但是如果我把这条线改成

const [posts, setPost] = useState(props.post.item);

我可以更新喜欢的内容

setPost({...posts, likes:posts.likes+1})

谁能帮我理解为什么 props.posts 与 item 和 item 中包含的数据一起传递,这是使用平面列表的怪癖

【问题讨论】:

  • 您正在用新的 obj 覆盖帖子状态,您能否提供帖子状态的数据结构示例?
  • 您好,感谢您的回复,道具从一个平面列表传递,如下所示,索引:0 项目:cmets:[] 描述:““这是我的错误””喜欢:19 股: 14 songImage: """" videoUri: "d8vywknz0hvjw.cloudfront.net/fitenium-media-prod/videos/…" __v: 0 _id: "602e37930d86848198e599cc"
  • 我是新手,如果您想要更好的格式,请告诉我
  • 没关系,如果我正确理解您的数据帖子:[...anyProperty, likes:Integer] 结构,这应该可以工作: setPost(posts.map(post=> {return{...post , 点赞:post.likes+1}})
  • 嗨,这给出了类型错误 posts.map 不是函数

标签: node.js reactjs react-native


【解决方案1】:

您已覆盖状态。在这种情况下,您可以尝试以下代码:

setPosts({...posts,"likes": posts.items.likes + 1});

更多信息可以参考https://codesandbox.io/s/naughty-meadow-9dkj3?file=/src/App.js

【讨论】:

    【解决方案2】:

    就像 Jason 在 cmets 中提到的那样,您正在完全覆盖状态变量。 请尝试使用以下语法:

    var person={name:"my name","age":21}
    setPerson({...person,"birth":1999});
    

    上面的预期结果是:person={name:"my name","age":21,"birth":1999}

    【讨论】:

    • 您好,感谢您的回复,我不确定我是否理解这里,您是说我需要创建一个我使用 useState(props.post) 设置的道具的新对象,但忽略了我的属性想要更新然后在 setPosts 中添加该属性?我确定我在这里错得离谱
    • “...”被称为扩展运算符。它为您创建了一个新对象。对于您的特定用例,您可以使用 {...post, "like" : value} 它应该按预期工作
    猜你喜欢
    • 2014-11-25
    • 2018-03-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多