У меня есть этот фрагмент кода ReactJS, который работал до тех пор, пока я не добавил еще несколько элементов div в верхней части render. В нем есть 3 переключателя начальной загрузки, которые я намеревался связать некоторые начальные значения с начальными значениями в конструкторе, чтобы я мог изменять их только из конструктора.
class Body extends React.Component {
constructor(props) {
super(props);
this.state = {
data : [],
first_active: 'active',
second_active: '',
third_active: '',
joke_id: 1,
dadjoke_id: 1,
tweet_id: 1,
first_checked: 'checked',
second_checked: '',
third_checked: ''
}
}
componentDidMount(){
this.postdata()
}
postdata(){
...
}
render(){
return(
<div>
<div id = "side-nav">
<div className = "btn-group btn-group-toggle" data-toggle = "buttons">
<label className = "btn btn-secondary {first_active}">
<input type = "radio" name = "options" id = "option1" autoComplete = "off" value = "Joke" ref_id = "{joke_id}" {first_checked} onChange = {() => alert('click1')} /> Joke
</label>
<label className = "btn btn-secondary {second_active}">
<input type = "radio" name = "options" id = "option2" autoComplete = "off" value = "DadJokes" ref_id = "{dadjoke_id}" {second_checked} onChange = {() => alert('click2')} /> DadJokes
</label>
<label className = "btn btn-secondary {third_active}">
<input type = "radio" name = "options" id = "option3" autoComplete = "off" value = "Tweet" ref_id = "{tweet_id}" {third_checked} onChange = {() => alert('click3')} /> Tweet
</label>
</div>
</div>
<div className = "col-md-7 top-padding" align = "center">
<span className = "oi oi-reload"></span>
</div>
{this.state.data.length == 0 &&
<div> No options available.</div>
}
{this.state.data.length > 0 &&
<div className = "container top-padding" id = "jokes">
{this.state.data.map(function(item,i){
return(
<div key = {item['key']} className = "card col-md-7">
<div className = "card-body">
{item['text']}
<p><span className = "badge badge-secondary">{item.name}</span></p>
</div>
</div>
)
})}
</div>
}
</div>
)
}
}
который при запуске выдает эту синтаксическую ошибку
SyntaxError: http://35.196.142.180/static/js/react-script.js: Unexpected token (52:120)
50 | <div className = "btn-group btn-group-toggle" data-toggle = "buttons">
51 | <label className = "btn btn-secondary {first_active}">
> 52 | <input type = "radio" name = "options" id = "option1" autoComplete = "off" value = "Joke" ref_id = "{joke_id}" {first_checked} onChange = {() => alert('click1')} /> Joke
| ^
53 | </label>
54 | <label className = "btn btn-secondary {second_active}">
55 | <input type = "radio" name = "options" id = "option2" autoComplete = "off" value = "DadJokes" ref_id = "{dadjoke_id}" {second_checked} onChange = {() => alert('click2')} /> DadJokes
Но то, где он указывает, где ошибка, мне кажется прекрасным.
Это связано с функцией рендеринга и данными, которые она должна получать из переменных, инициализированных в конструкторе.
Я использовал предложение добавить this.state. для проверки, и он работал как этот checked = {this.state.first_checked}
Но это
<label className=`btn btn-secondary ${this.state.first_active}`>
Выдает эту ошибку
SyntaxError: http://35.196.142.180/static/js/react-script.js: JSX value should be either an expression or a quoted JSX text (51:35)
49 | <div id = "side-nav">
50 | <div className = "btn-group btn-group-toggle" data-toggle = "buttons">
> 51 | <label className=`btn btn-secondary ${this.state.first_active}`>
| ^
52 | <input type = "radio" name = "options" id = "option1" autoComplete = "off" value = "Joke" ref_id = "{this.state.joke_id}" checked = {this.state.first_checked} onChange = {() => alert('click1')} /> Joke
53 | </label>
54 | <label className = "btn btn-secondary {this.state.second_active}">
В частности, имя свойства checked
Кроме того, я вижу это в вашем коде: className = "btn btn-secondary {first_active}" - это не способ интерполировать строки, вам нужно либо объединить строку и переменную, либо использовать интерполяцию строк с обратными апострофами и синтаксис ${var} для переменных
Другой способ сделать это - полностью опустить фигурные скобки, если опора является просто логическим значением: <Component booleanProp otherProp = {value} />
@ Jayce444 так что-то вроде этого className = "btn btn-secondary ${first_active}"
Нет, как это: className=`btn btn-secondary ${first_active}` использует обратные кавычки вместо двойных кавычек, чтобы обернуть его
@ Jayce444 метод prop, который вы предложили, бросает этот ReferenceError: first_checked is not defined
Это был не я, я просто предложил название свойства. И это должен быть checked = {this.state.first_checked}, так как значение хранится в состоянии
Если вы хотите опустить значения prop, вы должны деструктурировать их из компонента state следующим образом: const { first_checked, second_checke } = this.state;
@ Jayce444 попробовал использовать обратные кавычки и получил ошибку. Актуализирую вопрос с этим.
К сожалению, обратная кавычка должна быть заключена в фигурные скобки, className = {`something ${blah}`}. Вы можете дважды проверить "строковую интерполяцию в свойстве реакции" для конкретного синтаксиса.





Попробуйте вместо этого:
this.state.first_checked
Попробуйте это
<label className = {`btn btn-secondary ${this.state.first_active}`}>
Я думаю, вам не хватает названия опоры. Должно получиться что-то вроде этого
prop = {first_checked}