Создание поля ввода нажатием кнопки

#javascript #html #reactjs

#javascript #HTML #reactjs

Вопрос:

Поэтому я пытаюсь добавлять поле ввода всякий раз, когда нажимаю кнопку. Это работает, но не имеет значения, какую кнопку я нажимаю, все контейнеры получают этот ввод, я хочу создать кнопку, которая работает на каждом контейнере. Может быть, мне нужно создать для этого другой компонент или есть решение, которое будет работать с моим «основным» компонентом без открытия другого? {Можно использовать только React и JS, я знаю, что в jquery есть способ} У меня есть 4 раздела ПРОДУКТА, поэтому я имел в виду, что кнопка будет запускать каждый из них отдельно в моем коде :

 function Products(props){
    function FunctionClick(){
        let myContainer = document.getElementsByClassName('container');
        for(let i=0;i<myContainer.length;i  ){
            let myInput=document.createElement('input');
            myContainer[i].appendChild(myInput)
        }
        
    };
    

    return(
    <div className='container' id='Container'>
    <span className='namestyle'>{props.name}</span>
    <span className='descriptionstyle'>{props.description}</span>
    <span className='descriptionstyle1'>{props.description1}</span>
    <img className='imgstyle' src={props.img}></img>
    <span className='pricestyle'>{props.price}</span>
    <span className='ratingstyle'>{props.rating}</span>
    <button onClick={FunctionClick} id='plusbut' className='plusbutton'> </button>


    </div>)

}

export default Products;  

Редактировать-
Извините, если вы не поняли, чего я пытаюсь достичь, я надеюсь, что это сделает его лучше-
Я пытаюсь заставить каждую кнопку управлять своим собственным div. Теперь, когда я нажимаю на одну кнопку, все подразделения получают поле ввода, и я хочу, чтобы кнопка запускала только тот div, на который я нажал.
Спасибо, ребята.

Комментарии:

1. Не хотите ли подробнее рассказать о том, чего вы пытаетесь достичь? Я изо всех сил пытаюсь понять это из вашего вопроса

2. Извините за это, я пытаюсь заставить каждую кнопку управлять своим собственным div. Теперь, когда я нажимаю на одну кнопку, все подразделения получают поле ввода, и я хочу, чтобы кнопка запускала только тот div, на который я нажал.

3. Но что должно произойти в конечном итоге? каждый щелчок делает? вызвать новый div? получить входное значение? совокупные значения?

4. Да, у меня есть 4 раздела продукта в моем компоненте приложения. извините за недоразумение, которое я сейчас отредактирую.

5. Кажется, я не понимаю, что вы пытаетесь сделать, но я могу прямо сказать вам, что при использовании react вы действительно не хотите напрямую манипулировать DOM. Вместо этого визуализируйте компоненты react

Ответ №1:

Попробуйте этот подход,

 import React, { useState } from "react";
import "./styles.css";

const products = [
  { id: 1001, name: "Product-1" },
  { id: 1002, name: "Product-2" },
  { id: 1001, name: "Product-3" },
  { id: 1002, name: "Product-4" },
  { id: 1001, name: "Product-5" }
];

export default function App() {
  return (
    <div className="App">
      <h1>Product Demo</h1>
      <Products data={products} />
    </div>
  );
}

const Products = ({ data }) => {
  return (
    <div>
      {data.map((v) => (
        <Product {...v} />
      ))}
    </div>
  );
};

const Product = ({ id, name }) => {
  const [showInput, setVisibility] = useState(false);
  const handleClick = () => {
    setVisibility(!showInput);
  };

  return (
    <div className="container" id="Container">
      Product Name : {name}
      {showInput amp;amp; (
        <div>
          <input type="text" />
        </div>
      )}
      <div>
        <button onClick={handleClick} id="plusbut" className="plusbutton">
           
        </button>
      </div>
    </div>
  );
};
  

Рабочий код — https://codesandbox.io/s/eloquent-goldwasser-yjxil?file=/src/App.js:0-1033

Пожалуйста, дайте мне знать, если ваш вариант использования отличается / или возникают какие-либо проблемы.

Комментарии:

1. Отлично работает, мой друг, спасибо за ваше время. Этот код не в моей лиге

Ответ №2:

Проблема заключается в том, как вы запрашиваете элементы. При использовании document.getElementsByClassName вы запрашиваете весь DOM таким образом, учитывая несколько экземпляров, которые используют divs с одним и тем же классом — вы получите их все.

По сути, вы хотели бы получить компонент, который определяет область его действия. Что-то вроде этого должно выполнить работу:

 function Product(props){
    let renderInputField = false;
  
    function onClick(){
        renderInputField = true;
    };
    
      return(
      <div className='container'>
        { renderInputField ? '<input type="text" value={props.value} />' : ''}
        <span className='namestyle'>{props.name}</span>
        <span className='descriptionstyle'>{props.description}</span>
        <span className='descriptionstyle1'>{props.description1}</span>
        <img className='imgstyle' src={props.img}></img>
        <span className='pricestyle'>{props.price}</span>
        <span className='ratingstyle'>{props.rating}</span>
        <button onClick={onClick} id='plusbut' className='plusbutton'> </button>
      </div>
      )
}

export default Product;
  

Комментарии:

1. Не woking, синтаксис неправильный, но все равно спасибо!

2. Я не линтер 😉 Внесите соответствующие исправления, но суть в том, что вам нужна логика внедрения кода с условной областью действия

3. Не могу понять, что здесь не так, его внешний вид, как вы написали, прекрасен, но он все еще кричит на меня O_o спасибо, Авиад.

4. @Oded Я исправил приведенный выше пример, попробуйте еще раз, пожалуйста 🙂

5. Все тот же Aviad, кажется, что функция onClick не работает.

Ответ №3:

Для этого можно использовать методы JavaScript createElement и appendChild.

 <div id="dynamicCheck">
<input type="button" value="Create Element" onclick="createNewElement();"/>
</div>

<div id="newElementId">New inputbox goes here:</div>
  

Часть Javascript:

 <script type="text/JavaScript">
function createNewElement() {
// First create a DIV element.
var txtNewInputBox = document.createElement('div');

// Then add the content (a new input box) of the element.
txtNewInputBox.innerHTML = "<input type='text' id='newInputBox'>";

// Finally put it where it is supposed to appear.
document.getElementById("newElementId").appendChild(txtNewInputBox);
}
</script>
  

Комментарии:

1. Это кажется немного небезопасным tbh