如何正确使用带有 React 功能组件的键?这是我的喜欢按钮:

Posted

技术标签:

【中文标题】如何正确使用带有 React 功能组件的键?这是我的喜欢按钮:【英文标题】:How do I properly use keys with React functional components? Here's my like button: 【发布时间】:2020-11-19 14:04:33 【问题描述】:

我正在尝试使用 React 构建一个类似 Facebook 的按钮,以便更好地处理有状态组件。我不确定问题是什么,但我认为是关键。

Error: Objects are not valid as a React child (found: object with keys numLikes, onSelect). If you meant to render a collection of children, use an array instead.
    in p (at LikeButton.js:8)
    in LikeButton (at App.js:10)
    in App (at src/index.js:9)
    in StrictMode (at src/index.js:8)

这里是 App.js:

import React,  useState  from 'react';
import './App.css';
import LikeButton from './components/LikeButton';

function App() 
  const [likes, updateLikes] = useState(23);
  const [liked, updateLiked] = useState(false);

  return (
    <LikeButton 
    secret='like-button'
    numLikes=likes
    // status=liked
    onSelect=(liked) => 
      if (liked) 
        updateLikes(likes + 1);
        else  updateLikes(likes - 1)
       ;
      updateLiked(!liked);
      
    
    />
    // onClick function here, or in LikeButton.js?
  );


export default App;

这是 LikeButton.js:

import React from 'react';
import FaThumbsUp from 'react-icons/fa';

export default function LikeButton(secret, numLikes, onSelect) 
    return (
      <>
        <div key=secret onClick=onSelect>Like Button</div>
        <p>numLikes</p>
      </>
    );

【问题讨论】:

从 LikeButton.js 中注释掉 &lt;p&gt;numLikes&lt;/p&gt;,如果解决了,控制台记录 numLikes,因为它可能不是你认为的整数 【参考方案1】:

在功能组件中使用属性时,您需要销毁道具,而不是单独使用它们。因为组件的属性是函数中的第一个参数

import React from 'react';
import FaThumbsUp from 'react-icons/fa';

export default function LikeButton(secret, numLikes, onSelect) 
    return (
      <>
        <div key=secret onClick=() => onSelect(true)>Like Button</div>
        <div key=secret onClick=() => onSelect(false)>Dislike Button</div>
        <p>numLikes</p>
      </>
    );

当您收到此类错误时,请知道您正在尝试呈现不是 React 元素或非对象类型数据的属性或变量。

【讨论】:

很高兴它有帮助。干杯! 现在的问题是,likes 只会增加。似乎liked 没有在truefalse 之间交替。 我将修改我的答案以解决该问题。您没有不喜欢按钮,而且您的 onSelect 根本不发送数据。 我试图让点击按钮时减少它,并且状态变量likedtrue。反之亦然,这样按钮就像在 facebook 上一样工作。我认为updateLiked 函数会替换liked 的值,它应该,但由于某种原因,代码块没有触发。我的编辑说liked 已声明但从未使用过。我认为问题在于我的参数liked 并不是我的状态变量liked 你根本不需要liked 标志。只需根据小麦 LikeButton 设置计数器即可。如果你的like按钮只增加,就增加。你根本不需要liked 状态【参考方案2】:

secret、numLikes、onSelect 在 props 对象内。你应该在使用前销毁。

const secret, numLikes, onSelect = props

【讨论】:

以上是关于如何正确使用带有 React 功能组件的键?这是我的喜欢按钮:的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有 TypeScript 的 React-Native 中使用 styled-component 键入无状态功能组件?

如何在 React 上正确使用带有样式组件画布的 TypeScript 类型

如何使用带有钩子的 react-native-action-sheet

如何在 TypeScript 中使用带有 React 无状态功能组件的子组件?

使用带有 Material-UI 自动完成功能的 react-hook-form 控制器的正确方法

如何在 React 功能组件中正确设置 setInterval 计时器?