我已经完成了代码,在那里我可以动态创建一个带有图像的组件并保存状态.

状态在此数组中捕获:

const [UploadLogos, setUploadLogos] = useState([0]);
const dynamicLogos = (id, url) => {
    setUploadLogos((el) => {
      let ArrayLogos = [...el]; 
      ArrayLogos[id] = url; 
      return ArrayLogos 
    })
};

一般来说,代码按其应有的方式工作,但也是如此.在SimpleComponent组件内,有一个输入,我想在其中指定数据并保存此状态:

<input type="number" value={{}} onChange={() => {}} />

拜托,你能告诉我怎么做吗?谢谢!

下面是空心代码:

App.js

import React, { useState } from 'react';
import { SimpleComponent } from './SimpleComponent ';

function App() {

  const [UploadLogos, setUploadLogos] = useState([0]);
  const dynamicLogos = (id, url) => {
        setUploadLogos((el) => {
          let ArrayLogos = [...el]; 
          ArrayLogos[id] = url; 
          return ArrayLogos 
        })
  };
  
  return (
    <div className="App">
      <button
        onClick={() =>
          setUploadLogos([...UploadLogos, UploadLogos.length])
        }
      >
        Add
      </button>
      {UploadLogos.map((logo, i) => (
        <SimpleComponent
          key={i}
          id={i}
          Image={logo}
          setImage={dynamicLogos}
        />
      ))}
    </div>
  );
}

export default App;

SimpleComponent.jsx

export function SimpleComponent({id, Image, setImage}) {
    return (
      <>
        <input 
            type="file" accept="image/*"
            onChange={event => { if (!event.target.files[0]) return; setImage(id, URL.createObjectURL(event.target.files[0])) }} 
        />
        <img src={Image} /> 
        <input type="number" value={{}} onChange={() => {}} />
      </>   
    )
}

推荐答案

假设在SimpleComponent中输入的数字也希望存储在父组件的UploadLogos状态数组中,那么我建议进行以下重构.

  • 更新状态以保存具有idsrcdata属性的对象array.id将是生成的GUID,src是输入的文件源,data是另一个输入的状态.

    function App() {
      const [data, setData] = useState([]);
    
      const addData = () =>
        setData((data) =>
          data.concat({
            id: nanoid(),
            src: "",
            data: ""
          })
        );
    
      const updateData = (id, key, value) =>
        setData((data) =>
          data.map((el) => (el.id === id ? { ...el, [key]: value } : el))
        );
    
      return (
        <div className="App">
          <button onClick={addData}>Add</button>
          <br />
          {data.map((item) => (
            <SimpleComponent key={item.id} item={item} updateData={updateData} />
          ))}
        </div>
      );
    }
    
  • 更新SimpleComponent以传递适当的item.srcitem.data属性,并使用updateData回调将状态更新入队.

    function SimpleComponent({ item, updateData }) {
      return (
        <div>
          <input
            type="file"
            accept="image/*"
            onChange={(event) => {
              if (!event.target.files[0]) return;
              updateData(
                item.id,
                "src",
                URL.createObjectURL(event.target.files[0])
              );
            }}
          />
          <img alt="Simple preview" src={item.src} />
          <input
            type="number"
            value={item.data}
            onChange={(e) => updateData(item.id, "data", e.target.value)}
          />
        </div>
      );
    }
    

enter image description here

Reactjs相关问答推荐

阻止在ShadCN和React中的FormLabel中添加 colored颜色

从`redux—thunk`导入thunk `在stackblitz中不起作用

如何使用Reducer更新全局变量

在Reaction中测试条件组件

为什么我的React App.js只在页面刷新时呈现3次?

for each 子级加载父路由加载器

如何在MUI x图表条形图上放置圆角?

如何清除过滤器搜索的状态

onClick 事件处理程序未应用于样式组件

当 URL 与我声明的任何路由都不匹配时,如何使用不会重定向到错误页面的动态 URL? - react 路由 dom

如何使用服务器中的数据自动填充表单字段?

如何将 npm 包添加到我的 Vite + React 应用程序中?

useEffect 内的 onClick 和 addEventListener 之间的 click 事件顺序差异

是的验证:使用 useFieldArray 访问表单值

如何防止开发人员使用 ESLint 在 React 项目中使用特定的钩子?

如何在 ChartJS 中操作 Y 轴

如何通过 React JS 中的映射将新元素添加到对象数据数组中

如何通过 id 从 useSprings 数组中删除元素

父状态改变后子组件丢失状态

在 Reactjs 中状态发生变化时渲染一个新组件而不替换旧组件