У меня есть кнопки Mic-off и Mic-on, которые переключаются с помощью тройной операции. events (массив JSON) - это список объектов JSON с event_name и date_time.
{this.props.events.map((event) => (
<div key = {event.event_name}>
<div> {this.state.micStates[event.event_name]?
<span onClick = {()=>this.stopRecord(event.event_name)}> <MicOn />
</span>
:<span onClick = {()=>this.startRecord(event.event_name)}><MicOff />
</span>}
</div>
<li style = {{color:'pink',}}>{event.date_time}</li>
</div> ))
}
Два метода: startRecord, StopRecord
startRecord: он начнет запись и сохранит в кусках и удалит предыдущее состояние события, либо установит для него значение false, если щелкнуть более одного раза
stopRecord: остановит mediaRecorder и сохранит файл в формате formData и установите для события текущего состояния значение false.
constructor(props) {
super(props);
this.state = {
mics :{},
}
}
startRecord = event => {
var size=Object.keys(this.state.mics).length
if (size<1){
let {mics}=this.state;
mics[event]=mics[event]? false : true;
this.setState({ mics });
// do the work here
}
else{
this.setState(prevState=>({
mics:{},
}));
console.info("switch other state off");
}
}
stopRecord = event => {
let {mics}=this.state;
mics[event]=mics[event]? false : true;
this.setState({ mics });
console.info(Object.keys(this.state.mics).length);
}
Я не хочу переключать несколько кнопок одновременно, если одно событие истинно, тогда как другое, присутствующее в mics, должно быть ложным.
@ShubhamKhatri Я уже передал уникальный ключ обоим методам, если вы посмотрите, Хотя я сделал, и проблема решена, и она работает, но не так, как я хотел, обновил свой код если и еще условие ..... я хочу, чтобы я сделал mics[event] истинным для одного при щелчке по текущему событию предыдущие микрофоны [событие] должны стать ложными. Это означает, что единственная разница, с которой я сейчас сталкиваюсь, заключается в том, что если я щелкну другое событие, все микрофоны будут пустыми, поэтому они будут отключены, а для предыдущих
@ShubhamKhatri, вопрос в том, как мне получить доступ к предыдущему элементу объекта в состоянии else, тогда я мог бы легко установить его false и позволить току, который я передаю, быть только истинным ...
Вы поддерживаете объект микрофона, вместо этого я бы предложил сохранить одну переменную, если это сработает для вас.
@ShubhamKhatri, потому что я использовал тернарную операцию для каждого уникального элемента this.state.mics[event], там должен быть объект



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


Поскольку this.state.micStates - это массив. Установите флажок типа "isPlaying: true / false". По умолчанию это будет false. Как только вы вызовете play / start record, передайте индекс массива и выполните простую операцию поиска и обновления массива. Только для этого переданного ключа будет установлено значение true, а для остальных - false, поскольку вы будете выполнять цикл.
Но в этом проблема: я не хочу устанавливать несколько событий как истинные, должно быть одно событие, которое могло бы быть истинным. Если я вызываю startRecord для двух событий, то в истинном состоянии будут два события.
сохранить идентификатор активного события, например, если вы start_record для одного события, которое
id: 123, тогда активным идентификатором будет123, и только для этого идентификатора вы можете выполнить действие customn