我遇到了一个非常令人沮丧的问题,关于我的函数参数中的对象解构.我在一个组件中有以下代码:

import React from "react";
import { range } from "../../utils";
import { checkGuess } from "../../game-helpers";

function Guess({ guess, answer }) {
  const guessEmpty = guess === undefined ? true : false;
  const letters = !guessEmpty && checkGuess(guess.value, answer);

  function renderLetter({ letter = undefined, status = undefined } = {}, num) {
    return (
      <span className={`cell ${status}`} key={num}>
        {letter}
      </span>
    );
  }

  return (
    <>
      {
        <p className="guess">
          {range(5).map((num) => renderLetter(letters[num], num))}
        </p>
      }
    </>
  );
}

export default Guess;

letters常量是一个数组,它将设置为false或由对象列表组成,具体取决于Guess函数的guess输入参数是否为空.

当我将letters[num](它可以是一个对象,也可以是undefined)传递到renderLetter函数中时,我的letterstatus输入参数要么被转换为undefined,要么被转换为字符串,这取决于通过对象解构的输入.一切都很顺利.

但是,我现在不是使用renderLetter函数来呈现<span>个元素,而是希望将其移动到一个新组件.此组件的代码为:

import React from "react";

function Letter({ letter = undefined, status = undefined } = {}) {
  return (
    <>
      <span className={`cell ${status}`}>{letter}</span>
    </>
  );
}

export default Letter;

与我调用renderLetter函数的方式类似,我现在正在try 呈现组件:

return (
    <>
      {
        <p className="guess">
          {range(5).map((num) => (
            <Letter letter={letters[num]} num={num} />
          ))}
        </p>
      }
    </>
  );
}

但是,当在Letter组件中记录letterstatus参数时,letter参数返回一个对象,status参数返回undefined.因此,我假设我在正确地解构输入时搞砸了.

然而,我不明白为什么,因为当在同一组件中使用函数时,这种完全相同的方法确实有效,而当将代码转移到单独的组件时,它不起作用.

任何帮助弄清楚这一点的人都将不胜感激!

推荐答案

按照定义Letter组件的方式,它需要两个props :letterstatus,它们都应该是字符串或未定义的.

<Letter letter={letters[num]} num={num} />会将object传递给letterprops ,不传递给statusprops ,并将数字传递给不存在(因此被忽略)的numprops .相反,你想要的是

<Letter letter={letters[num]?.letter} status={letters[num]?.status} key={num} />

或更简单

<Letter {...letters[num]} key={num} />

您的问题不是解构,而是组件的使用与函数调用的工作方式不同.


顺便说一句,在函数组件中,您不需要将参数缺省为空对象,也不必将任何值缺省为undefined(尽管您可能希望将status缺省为空字符串).写一封信就足够了

export default function Letter({ letter, status='' }) {
  return (
    <span className={`cell ${status}`}>{letter}</span>
  );
}

Javascript相关问答推荐

从连接字符串创建客户端时,NodeJS连接到CosmosDB失败

如何解决这个未能在响应上执行json:body stream已读问题?

如何访问Json返回的ASP.NET Core 6中的导航图像属性

类型脚本中只有字符串或数字键而不是符号键的对象

如何添加绘图条形图图例单击角形事件

这个值总是返回未定义的-Reaction

在浏览器中触发插入事件时检索编码值的能力

使用js构造一个html<;ath&>元素并不能使其正确呈现

映射类型定义,其中值对应于键

根据一个条件,如何从处理过的数组中移除一项并将其移动到另一个数组?

从逗号和破折号分隔的给定字符串中查找所有有效的星期几

是否可以将异步调用与useState(UnctionName)一起使用

如何在Jest中模拟函数

在ChartJS中使用spanGaps时,是否获取空值的坐标?

在Java脚本中构建接口的对象

$GTE的mongoose 问题

如何向内部有文本输入字段的HTML表添加行?

使用python,我如何判断一个html复选框是否被隐藏,以及它是否被S选中?

暂停后只有一次旋转JS

与find()方法一起使用时,Mongoose中的$or运算符没有提供所有必需的数据