Если вам удобно использовать подход на основе классов, вы можете попробовать что-то вроде этого:
- Создайте класс, который содержит значение свойства для команды.
- Создайте логическое свойствов этом классе, скажем
isHomeWinner
.Это свойство определит победителя. - Затем создайте свойство получателя
winner
, которое будет искать this.isHomeWinner
и даст необходимое значение. - Это позволит вам получить чистую
toggle
функция: this.isHomeWinner = !this.isHomeWinner
.
Вы также можете написать свой toggleWinner
как:
const toggleWinner = (index) => {
const newArr = initialFixtures.slice();
newArr[index].toggle();
return newArr;
};
Это выглядит чисто и декларативно.Обратите внимание, что если неизменность необходима, то требуется только это.Если вам удобны изменяющиеся значения, просто передайте fixture.toggle
вашему компоненту реакции.Вам может потребоваться привязать контекст, но это также должно работать.
Так что это будет выглядеть примерно так:
function Fixtures = ({ fixtures, toggleWinner }) => {
fixtures.map((fixture, index) => (
<div>
<p>{fixture.winner} </p>
<button onClick = {() => fixture.toggle() }> Change Winner</button>
// or
// <button onClick = { fixture.toggle.bind(fixture) }> Change Winner</button>
</div>
))
}
Ниже приведен пример класса и его использования:
class Fixtures {
constructor(home, away, isHomeWinner) {
this.team = {
home,
away
};
this.isHomeWinner = isHomeWinner === undefined ? true : isHomeWinner;
}
get winner() {
return this.isHomeWinner ? this.team.home : this.team.away;
}
toggle() {
this.isHomeWinner = !this.isHomeWinner
}
}
let initialFixtures = [
new Fixtures('Liverpool', 'Manchester Utd'),
new Fixtures('Chelsea', 'Fulham', false),
new Fixtures('Arsenal', 'Tottenham'),
];
const toggleWinner = (index) => {
const newArr = initialFixtures.slice();
newArr[index].toggle();
return newArr;
};
initialFixtures.forEach((fixture) => console.log(fixture.winner))
console.log('----------------')
initialFixtures = toggleWinner(1);
initialFixtures.forEach((fixture) => console.log(fixture.winner))
initialFixtures = toggleWinner(2);
console.log('----------------')
initialFixtures.forEach((fixture) => console.log(fixture.winner))