У меня есть поле input, в котором есть класс 'from-control':
<input
name = "title"
className = "form-control"
type = "text"
placeholder = "Write title..."
value = {this.state.title}
onChange = {this.onChange}
/>
Теперь я хочу переключить класс 'form-control-danger', не затрагивая класс 'form-control' (когда this.state.error - это true или false)
примечание: я уже искал в Google и StackOverflow, но не нашел подходящего решения
Here is my full code in snippet:
class PostForm extends React.Component {
constructor(props) {
super(props)
this.state = {
title: '',
body: '',
fetching: false,
error: false
}
}
onChange = e => {
this.setState({
[e.target.name]: e.target.value
})
}
handleFormSubmit = (e) => {
e.preventDefault()
if (!this.state.title || !this.state.body) {
this.setState({
error: true
})
return false;
}
this.setState({
fetching: true
})
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
body: JSON.stringify({
title: this.state.title,
body: this.state.body
}),
headers: {
'Content-type': 'Application/json'
}
})
.then(res => res.json())
.then(res => {
console.info(res)
this.setState({
fetching: false,
title: '',
body: '',
error: false
})
})
}
render() {
return (
<div className = "container">
<div className = "row justify-content-center">
<div className = "col-8">
<form onSubmit = {this.handleFormSubmit}>
<div className = "form-group">
<label>Post Title:</label>
<input
name = "title"
className = "form-control"
type = "text"
placeholder = "Write title..."
value = {this.state.title}
onChange = {this.onChange}
/>
</div>
<div className = "form-group">
<label>Post Body:</label>
<textarea
name = "body"
className = "form-control"
placeholder = "Write body text..."
value = {this.state.body}
onChange = {this.onChange}
></textarea>
</div>
<div className = "form-group">
<button
type = "submit"
className = "btn btn-success"
>
{
this.state.fetching ? 'Fetching Post' : 'Submit'
}
</button>
{this.state.error && 'title or content cannot be empty'}
</div>
</form>
</div>
</div>
</div>
)
}
}
ReactDOM.render(<PostForm />, document.getElementById('app'));<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity = "sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin = "anonymous">
<div id = "app"></div>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что-то вроде этого?
<input
name = "title"
className = {this.state.error ? "form-control form-control-danger" : "form-control"}
type = "text"
placeholder = "Write title..."
value = {this.state.title}
onChange = {this.onChange}
/>
Если у вас много классов по умолчанию, вы можете сделать: className = {"c1 c2 c3" + this.state.error ? " error" : ""} (обратите внимание на пробел в " error"). Или создайте функцию, если вы используете ее во многих местах: className = {this.classForInput()}.
Тогда я не совсем понимаю, что вы имеете в виду, говоря «не затрагивать существующий класс». В чем будет разница?