【问题标题】:React: rendering name-value pairs as React.FCReact:将名称-值对呈现为 React.FC
【发布时间】:2021-08-02 00:30:35
【问题描述】:

我有一个简单的名称-值对定义为接口NameValuePair

interface NameValuePair {
    [key: number]: string; 
}

使用此接口,React.useEffect 正在初始化状态值,例如

const NameValuePairFC = () => {
    const [nameValuePairs, setNameValuePairs] = React.useState<NameValuePair>();
     
     React.useEffect(() => {        
         const tempNameValueMap: NameValuePair = {};
         tempNameValueMap[0] = "Zero";
         tempNameValueMap[1] = "One";
         tempNameValueMap[2] = "Two";
         setNameValuePairs(tempNameValueMap);
     }, [nameValuePairs]);
 
     return (
       <div className="content">
       Rendering name value pairs
           {          
               Object.keys(nameValuePairs).map((key) => {
                   const nv = nameValuePairs[key];       
                   console.log("name: " + key + "; value: " + nv[key]);
       
                   <div key={key}>
                       Key: {key} and value: {nv[key]}
                   </div>;
               })
           };   
       </div>
     );
};

我看到控制台没有打印任何内容,也没有渲染任何片段。 我期望打印定义的 3 个名称值对 0: Zero, 1: One, 2: Two 并且不确定我做错了什么。 请告诉我。我已经把它放在我正在尝试做的codepen 中。

【问题讨论】:

  • 发布此内容后,我对代码进行了一些改进,并且可以看到控制台正在遍历键:值对。
  • 另外,考虑到你有const nv = nameValuePairs[key];,那么nv[key] 是无效的,因为你基本上是在尝试做"Zero"[0]。您应该直接从那里使用nv,因为它包含实际值。
  • 没错@zhulien。我也更新了codepen。谢谢。

标签: reactjs typescript


【解决方案1】:

首先,nameValuePairs 始终是默认值。 useEffect 未执行,因此状态未更新。尝试使用一个小的依赖数组。

此外,您不会从 map 函数返回任何内容。添加return 语句。所以你的代码不会呈现这些对。

您的代码应如下所示:

interface NameValuePair {
    [key: number]: string;
}

const NameValuePairFC = () => {
    const [nameValuePairs, setNameValuePairs] = React.useState<NameValuePair>();

    React.useEffect(() => {
        const tempNameValueMap: NameValuePair = {};
        tempNameValueMap[0] = "Zero";
        tempNameValueMap[1] = "One";
        tempNameValueMap[2] = "Two";
        setNameValuePairs(tempNameValueMap);
    }, []); // empty dependency array added, `useEffect` executed once, on first render

    return (
        <div className="content">
            Rendering name value pairs
            {nameValuePairs &&
                Object.keys(nameValuePairs).map((value, index, array) => {
                    console.log(
                        "NameValuePairFC name: " + index + "; value: " + nameValuePairs[index]
                    );
                    return (<div key={index}> // return statement added
                        Key: {index} and value: {nameValuePairs[index]}
                    </div>)
                })}
            ;
        </div>
    );
};

ReactDOM.render(<NameValuePairFC />, document.getElementById('root'));

【讨论】:

  • 谢谢@Riwen,请您详细说明或指出一个为map函数添加return语句的示例。
  • 更新了答案。
  • 是的,从 map 函数返回,它起作用了。感谢您快速回复解决方案。这很有帮助。你拯救了我的一天。
猜你喜欢
  • 1970-01-01
  • 2021-07-15
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多