首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组形式的动态属性

数组形式的动态属性
EN

Stack Overflow用户
提问于 2022-07-07 20:01:24
回答 1查看 71关注 0票数 1

我想做这样的事。

代码语言:javascript
复制
  <form onSubmit={submitForm} className=''>        
  <div> 
  // this array is a dynamic set of fields inside the form           
     {items.map((input, i)=> (
       <div className="col-md-1 mb-4">
    <label htmlFor="inputResponse" className="form-label text-center" >
      <h5> Texto </h5>
    </label>              
  </div>
  <div className="row align-items-center row" key={i}>             
    <div className='col-10'>
      <input
        placeholder="desdeComponent"
        id={i}
        className='form-control mt-3'                    
        name={button value} // i would like the value of the button here.
        onChange= {handleChange((e) => e.target.name)}               
        type="text"
        required
      />
    </div>             
    ))
    }
  </div>
  
  <button className="btn btn-success me-4 mt-5"  type='submit'>AddSubmit</button>
</form>

我会有3个按钮‘添加文本’‘添加标题’添加链接‘的问题是,我想要动态地添加字段在我的形式,每次用户点击按钮。

我希望重用‘输入’,并像param一样将按钮值传递给name={按钮值},然后提交包含所有字段的表单。

问题是,当我单击'Add‘时,名称值是text name='text’。当单击“Add”时,我在表单中创建一个新字段,但新字段的名称和旧字段的名称将更改为我单击的最后一个按钮的name值。

对于同一字段数组中的每个字段,是否有某种方法具有此属性?

代码语言:javascript
复制
const itemDataObject = {
    title_item_lateral: '' ,
    text_item_lateral: [],
    image_lateral: [
      {
        title_image_lateral: '',
        path_image_lateral: '',
      }
    ],
    document_lateral: [],
    links: [
      {
        title_link:'' ,
        link: ''
      }
    ]
  };

函数添加字段:

代码语言:javascript
复制
let buttonPressed;
const addFields = (e) => {
    buttonPressed = e.target.value;
    setNameValue(buttonPressed);
    let newItemField = {itemDataObject};
      setItems([...items, newItemField]);          
    }

我的一些想法是如何重用并将值发送到每个字段中的名称。谢谢

这是完整的代码:(按钮和类名来自Bootstrap 5)

代码语言:javascript
复制
import { useState } from "react";

const DemoLateral = () => {  
  
  const itemDataObject = {
    title_item_lateral: '' ,
    text_item_lateral: [],
    image_lateral: [
      {
        title_image_lateral: '',
        path_image_lateral: '',
      }
    ],
    document_lateral: [],
    links: [
      {
        title_link:'' ,
        link: ''
      }
    ]
  }; 
  
  let buttonPressed;
  const [nameValue, setNameValue] = useState(['inicial']);
  const addFields = (e) => {
    buttonPressed = e.target.value;
    setNameValue(buttonPressed);
    console.log(buttonPressed);      
    let newItemField;    
    newItemField = {itemDataObject};
    setItems([...items, newItemField]);    
  };
  
  const [items, setItems] = useState([]); 
  console.log(items);
  
  const handleChange = (name) => {
    console.log(name);
  };
  
  const submitForm = (e) => {
    e.preventDefault();   
  };
  
  return (
    <>      
      <h3 className="ms-5 mb-5"> AÑADIR ITEMS   </h3>
      <div className="container">
        <form onSubmit={submitForm} className=''>        
          <div> 
            {items.map((input, i, e)=> (
              <h2 key={i} name={e.target.value}> Hola {i}</h2>
            ))
            }
          </div>
          
          <button className="btn btn-success me-4 mt-5"  type='submit'>AddSubmit</button>
        </form>
        <div className="mt-5 text-center">          
          {/*  <button className="btn btn-primary me-4"  onClick={addTextItem}>Add Text</button> */}
          <button className="btn btn-primary me-4 mb-4" value='text' onClick={addFields}>Add Text</button>
          <button className="btn btn-primary me-4 mb-4" value='title' onClick={addFields}>Add Subtitle</button>
          <button className="btn btn-primary me-4 mb-4" value='image' onClick={addFields}>Add Image</button>
          <button className="btn btn-primary me-4 mb-4" value='document' onClick={addFields}>Add document</button>
          <button className="btn btn-primary me-4 mb-4" value='links' onClick={addFields}>Add Links</button>
          <button className="btn btn-primary me-4 mb-4" value='items' onClick={addFields}>Add Items</button>
        </div>
      </div>
    </>
  );
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-08 13:40:42

我发现的问题是,您使用的是如下所示,第三个参数'e‘是整个数组,而不是事件,因此e.target是未定义的。我在这里添加了对象的类型,newItemField = { ...itemDataObject, button_pressed: buttonPressed };

代码语言:javascript
复制
<div> 
   {items.map((input, i, e)=> ( 
      <h2 key={i} name={e.target.value}> Hola {i}</h2>
      ))
   }
</div>

也许这能给你一个开始:

代码语言:javascript
复制
import { useState } from 'react';

const DemoLateral = () => {
    const itemDataObject = {
        title_item_lateral: '',
        text_item_lateral: [],
        image_lateral: [
            {
                title_image_lateral: '',
                path_image_lateral: '',
            },
        ],
        document_lateral: [],
        links: [
            {
                title_link: '',
                link: '',
            },
        ],
    };

    let buttonPressed;

    const [nameValue, setNameValue] = useState(['inicial']);

    const addFields = (e) => {
        buttonPressed = e.target.value;
        setNameValue(buttonPressed);
        console.log('setNameValue: ', buttonPressed);
        let newItemField;
        newItemField = { ...itemDataObject, button_pressed: buttonPressed };
        setItems([...items, newItemField]);
        console.log('Items: ', items);
    };

    const [items, setItems] = useState([]);

    const handleChange = (name) => {
        console.log(name);
    };

    const submitForm = (e) => {
        e.preventDefault();
    };

    return (
        <>
            <h3 className="ms-5 mb-5"> AÑADIR ITEMS </h3>
            <div className="container">
                <div className="mt-5 text-center">
                    {/*  <button className="btn btn-primary me-4"  onClick={addTextItem}>Add Text</button> */}
                    <button className="btn btn-primary me-4 mb-4" value="text" onClick={addFields}>
                        Add Text
                    </button>
                    <button className="btn btn-primary me-4 mb-4" value="title" onClick={addFields}>
                        Add Subtitle
                    </button>
                    <button className="btn btn-primary me-4 mb-4" value="image" onClick={addFields}>
                        Add Image
                    </button>
                    <button className="btn btn-primary me-4 mb-4" value="document" onClick={addFields}>
                        Add document
                    </button>
                    <button className="btn btn-primary me-4 mb-4" value="links" onClick={addFields}>
                        Add Links
                    </button>
                    <button className="btn btn-primary me-4 mb-4" value="items" onClick={addFields}>
                        Add Items
                    </button>
                    <button className="btn btn-success me-4 mt-5" value="submit" onClick={addFields}>
                        AddSubmit
                    </button>
                </div>
                <form onSubmit={submitForm} className="">
                    <div>
                        {items.map((input, i) => (
                            <h3 key={i} name={input.button_pressed}>
                                {input.button_pressed} {i}
                            </h3>
                        ))}
                    </div>
                </form>
            </div>
        </>
    );
};

export default DemoLateral;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72903599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档