class Field extends React.Component {
constructor() {
super();
this.handleTdClick = this.handleTdClick.bind(this);
}
handleTdClick(item) {
// проверка и изменение значений в состоянии
// к значению есть доступ, а вот как получить доступ к самой ячейки, чтобы изменить ей класс, не понятно
}
render() {
const { rows } = this.props;
return (
<table className="field">
<tbody>
{
rows.map((row, index) => (
<tr key = { index }>
{
row.map((item, index) => (
item !== 0
? <td
onClick = { this.handleTdClick.bind(this, item) }
key = { index }
className="not-empty">
</td>
: <td
onClick = { this.handleTdClick.bind(this, item) }
key = { index }
className="empty">
</td>
))
}
</tr>
))
}
</tbody>
</table>
);
}
}
как получить доступ к самой ячейке, чтобы изменить ей классНикак не надо получать, все классы вы должны навешивать в render() на основе данных, в этом вся суть Реакта. В обработчике вы изменяете state, автоматически вызывается render(), в DOM выгружается новое состояние. Вы работаете с данными, React работает с DOM.
handleTdClick(item) {
{this.state.rows.map((row, rowIndex) => (
<tr>
{row.map((item, colIndex) => (
<td
onClick={this.onTdClick}
data-row={rowIndex}
data-col={colIndex}
className={item ? 'not-empty' : 'empty'}
>
{item}
</td>
))}
</tr>
))}
onTdClick = ({ target: { dataset: d } }) => {
const row = +d.row;
const col = +d.col;
this.setState(({ rows }) => ({
rows: rows.map((n, i) =>
i === row
? n.map((m, j) => j === col ? +!m : m)
: n
)
}));
}
import createReactClass from 'create-react-class'
const Td = createReactClass({
render () {
return (
<td
onClick = { this.props.handleTdClick(item, e) }
key = { this.props.index }
className={this.props.item.state ===1 "empty" ? "not-empty" :}>
</td>
...
<Td {...props} />