Я нахожу здесь две проблемы, препятствующие достижению желаемого результата.
Когда вы используете значения из DOM, вы всегда получаете строку. Поскольку вы используете '===', оно никогда не оценивается как true и, следовательно, className не изменяется.
clickHandle = (e) => {
this.setState({
selected: parseInt(e.target.innerText, 10)
})
}
Вы также должны использовать ключ при использовании повторяющихся элементов, чтобы улучшить производительность.
generate = () => {
console.log('generate');
let tags = [];
for(let i = 0; i<31; i++){
tags.push(<div key={'keyname'+i} className={this.state.selected === (i+1) ? 'selected' : ''}>{i+1}</div>);
}
return tags;
}