Показать сообщение отдельно
  #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 });
Ответить с цитированием