Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.05.2018, 23:00
Интересующийся
Отправить личное сообщение для ArtyomZaitsev Посмотреть профиль Найти все сообщения от ArtyomZaitsev
 
Регистрация: 29.11.2017
Сообщений: 11

Получить номер элемента после .map()
ДОбрый день, подскажите пожалуйста, есть ли адекватный способ получать порядковый номер, или заданный id, у компонента Worker после того, как создали и вывели из этих компонентов массив?
class Worker extends React.Component { 
  render() {
    return <div>
      <div>{this.props.name} {this.props.surname}</div> 
      <input value={this.props.zp} onChange={this.props.onChange}/>
      <input value={this.props.days} onChange={this.props.onChange}/>
      <div>{this.props.fullZp}</div>     
    </div>;
  }
}

class App extends React.Component {
  constructor() {
    super();

    this.state = {
      worker:['Petr Petrov 23 150', 'Ivan Ivanov 40 100', 'Stepan Stepanov 3 200']
    };
  }

calcZp=()=>{   
    // метод внутри которого хочется получить id
  }

  render() {
    let list = this.state.worker.map((item, index)=>{
      let arr = item.split(' ')
      let fullZp = arr[2] * arr[3]
      return <li><Worker 
                  name={arr[0]} 
                  surname={arr[1]} 
                  days={arr[2]} 
                  zp={arr[3]} 
                  fullZp={fullZp} 
                  id={index}
                  onChange={this.calcZp} 
          /></li> 
    })
    return <div>
      <ul>
        {list}
      </ul>
    </div>;
  }
}  
ReactDOM.render(
<App />,
document.getElementById('app')
)


event.target.id не помогает. Может я вообще пытаюсь все усложнить и так делать не стоит?
Ответить с цитированием
  #2 (permalink)  
Старый 12.05.2018, 00:51
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Внутри класса Worker оно доступно как this.props.id

Если индекс нужен только внутри какого-либо метода, то можно его передавать туда в качестве аргумента.

Внутри метода App.prototype.render все индексы могут быть получены так:
list.map(v => v.props.children.props.id)
Но это убийственный способ! Лучше хранить ссылку на все экземпляры Worker, тогда его свойства будут доступны проще.

Пример переведён в cтандартный синтаксис ECMA-262, дабы можно было здесь запустить.
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="app"></div>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.3.2/umd/react.production.min.js"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.3.2/umd/react-dom.production.min.js"></script>
	<script>
		
const { createElement, Component } = React;
		
class Worker extends Component {
	render() {
		return createElement("div", {},
			createElement("div", {}, `${this.props.name} ${this.props.surname}`),
			createElement("input", {
				value: this.props.zp,
				onChange: this.props.onChange
			}),
			createElement("input", {
				value: this.props.days,
				onChange: this.props.onChange
			}),
			createElement("div", {}, this.props.fullZp)
		)
	}
}

class App extends Component {
	constructor() {
		super()

		this.state = {
			worker: [
				"Petr Petrov 23 150",
				"Ivan Ivanov 40 100",
				"Stepan Stepanov 3 200"
			]
		}
		
		this.workers = [];
	}

	calcZp(index) {   
		// метод внутри которого хочется получить id
		console.log("calcZp", index, this.workers[index]);
	}

	render() {
		this.workers = this.state.worker.map((item, index) => {
			let arr = item.split(" ")
			let fullZp = arr[2] * arr[3]

			return createElement(Worker, {
				name: arr[0],
				surname: arr[1],
				days: arr[2],
				zp: arr[3],
				fullZp,
				id: index,
				onChange: this.calcZp.bind(this, index)
			})
		})
		
		let list = this.workers.map(worker => createElement("li", {}, worker));
		
		console.log(list.map(v => v.props.children.props.id));

		return createElement("div", {}, 
			createElement("ul", {}, list)
		)
	}
} 
		
ReactDOM.render(createElement(App), document.getElementById("app"));
	</script>
	</body>
</html>


Сообщение от ArtyomZaitsev Посмотреть сообщение
event.target.id не помогает
event.target в примере попадает на input это экземпляр класса HTMLInputElement, который наследует от HTMLElement, который наследует от Element, который наследует от Node, который наследует от EventTarget и который наконец наследует от Object...

а <Worker /> в JSX, если это перевести в JavaScript будет React.createElement(Worker, {});
и это экземпляр вашего собственного класса Worker, который наследует от React.Component и который наследует от Object

Как вы понинаете, у event.target не может быть id от Worker...

Когда вы написали <Worker id={index} /> в JSX, то это тоже самое, что React.createElement(Worker, { id: index });
Ответить с цитированием
  #3 (permalink)  
Старый 12.05.2018, 08:54
Интересующийся
Отправить личное сообщение для ArtyomZaitsev Посмотреть профиль Найти все сообщения от ArtyomZaitsev
 
Регистрация: 29.11.2017
Сообщений: 11

Спасибо большое)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить порядковый номер элемента списка? mbp64 Элементы интерфейса 4 22.05.2014 17:45
Помогу получить индекс элемента массива visman Javascript под браузер 7 03.05.2014 03:23
Текст после элемента Vulkan Events/DOM/Window 3 15.10.2010 11:59
Как получить размер блока сразу после изменения его содержимого? Cooskon Events/DOM/Window 6 17.09.2010 16:15
У элемента img внутри form пропадает событие после onsubmit формы Eugene Events/DOM/Window 2 18.06.2009 19:21