【问题标题】:Can I create state variables dynamically in React?我可以在 React 中动态创建状态变量吗?
【发布时间】:2020-10-27 22:50:01
【问题描述】:

这是我正在处理的 React 项目的一个非常简化的版本。基本上,我有一个 JSON 文件(称为 data.json),其中包含一个名为“数据”的属性。该属性包含一个未知数量的对象数组,每个对象都有称为“id”和“值”的键/值对。

JSON文件被导入到App.js中,我需要在其中创建多个状态变量,每个状态变量都基于数组中的一个对象,具有以下先决条件:

  1. 每个状态变量都必须有一个唯一的名称,基于相关对象的“id”属性(例如 data1_state、data2_state 等)
  2. 每个状态变量的初始值必须等于同一个对象的'value'属性
  3. 每个状态变量都必须作为唯一的 <input> 字段的值返回

data.json:

{
    "data": [
        {
            "id": "data1",
            "value": 10
        },
        {
            "id": "data2",
            "value": 3
        },
        {
            "id": "data3",
            "value": 8
        },
        etc...
        etc...
        etc...
    ]
}

这就是我为 App.js 所拥有的

import React, { useState } from 'react';
import Data from './data.json';

const data = Data.data;

const App = () => {
  return <>
    {data.map(item => (
      <div key={item.id}>
        <label>{item.id}: <input type="text" value={/* STATE VARIABLE GOES HERE */} /></label>
      </div>
    ))}
  </>;
}

export default App;

本质上,我正在寻找一种写作方式

const[item.id + '_state', 'set' + item.id + '_state'] = useState(item.value);

对于数据数组中的每个对象(这种方式不起作用)。这可以吗?

【问题讨论】:

  • “有状态对象”是什么意思?你的意思是有状态的组件吗?
  • 我已经重写了问题以使其更清楚。

标签: javascript reactjs react-hooks


【解决方案1】:

创建另一个组件,您将在其中将这些值作为道具传递。您可以使用它们来初始化状态,或者只是在内部渲染它们。

【讨论】:

    【解决方案2】:

    正如你提到的,使用钩子。

    import React, { useState } from 'react';
    import Data from './data.json';
    
    const data = Data.data;
    
    const App = () => {
      const [stateData, setStateData] = useState(data);
      return <>
        {stateData.map(item => (
          <div key={item.id}>
            <p>{item.id}: <strong>{dataX_state}</strong></p>
          </div>
        ))}
      </>;
    }
    
    export default App;

    【讨论】:

    • 感谢您的回复,但这并不能解决我的问题:我需要动态创建可以单独定位的命名状态变量,但我看不出您的解决方案是如何做到的。我已编辑问题以使其更清晰。
    【解决方案3】:

    我喜欢 Aison 的回答,但它的某些方面让我感到困扰。我会做的略有不同。获取组件挂载中的数据(使用useEffect),然后设置状态:

    import React, { useState, useEffect } from 'react';
    
    const App = () => {
      const [stateData, setStateData] = useState(null);
    
      useEffect(() => {
        fetch('./data.json')
          .then(Data => setStateData(Data.data))
      }, [])
    
      return <>
        {stateData && stateData.map(item => (
          <div key={item.id}>
            <p>{item.id}: <strong>{dataX_state}</strong></p>
          </div>
        ))}
      </>;
    }
    
    export default App;
    

    就通常如何完成数据获取而言,这更现实一些。

    【讨论】:

    • 谢谢,但这只会呈现一个空白屏幕。
    • 问题可能在于使用dataData.data 或类似的东西。只有stateData 存在时才会呈现。您最初的示例使用了import Data from './data.json',然后您退出了Data.data...所以请确保当您使用fetch('./data.json) 时,您得到了您所期望的,并且您的.then(Data=&gt; setStateData(Data.data)) 确实填充了您的状态带有一些数据的变量。也许您需要一个简单的.then(data =&gt; setStateData(data))?这取决于你的 json 的结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2020-07-21
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多