Как я могу обновить состояние индекса массива индивидуально в компоненте React, не затрагивая весь массив при использовании setState ()? - PullRequest
0 голосов
/ 17 апреля 2019

Я возвращаюсь к старой проблеме, о которой спрашивал, и подхожу к ней по-другому. В настоящее время я хочу обновить индивидуальный массив. В настоящее время происходит то, что при запуске функции onClick удаляется весь массив. Как мне обновить только индекс этого массива, который я пытаюсь указать ???

class App extends React.Component {
    constructor(props) {
        super(props);
        this.scoreFive = this.scoreFive.bind(this);
        this.state = { 
            score: [10, 20]
         }
    }
    scoreFive(key) {
        this.setState((prevState) => {
            return {
                score: [
                    prevState.score[key] + 5
                ]
            }
        })
        console.log(key)
    }


    render() { 
        return ( 
            <div>
                <h1>Dominoes</h1>
                <Player key={1} name="micah" score={this.state.score[0]} scoreFive={() => this.scoreFive(0)} />
                <Player key={2} name="kyndra" score={this.state.score[1]} scoreFive={() => this.scoreFive(1)} />
            </div>
         );
    }
}

Ответы [ 4 ]

0 голосов
/ 17 апреля 2019

обновить счет и установить его. .. 1001 *

   scoreFive(key) {
        let {score} = this.state;
        score[key] += 5;
        this.setState({score});
    }

Edited ----------------------

Итак, после исследования и некоторой негативной маркировки я обнаружил, что делаю это неправильно и изменяю состояние, как указано в сила-не-мутации-данных

Итак, вот обновленная реализация

   scoreFive(key) {
        this.setState({score: this.state.score.map((data, index) => index === key ? data + 5 : data) });
    }

Спасибо за помощь:)

0 голосов
/ 17 апреля 2019

Попробуйте:

   scoreFive(index) {
        this.setState((prevState) => {
            const score = prevState.score; // reference the array
            score[index] + 5; // modify the specific index

            return {
                score: score
            };            
        })
        console.log(key)
    }
0 голосов
/ 17 апреля 2019

Вы должны взять массив из предыдущего состояния, клонировать его, изменить определенный индекс, а затем обновить состояние следующим образом:

 score: prevState.score.map((value, index) => index === key ? value + 5 : value)

Если вы делаете это довольно часто, он довольно повторяющийся,Вы также можете абстрагировать это в помощника:

  const lens = (key, cb) => obj => ({ ...obj, [key]: cb(obj[key]) });
  const index = (index, cb) => array => array.map((v, i) => i === index ? cb(v) : v);

Используется как:

  this.setState(lens("score", index(key, it => it + 5)));
0 голосов
/ 17 апреля 2019
const newArray = this.state.score.map(element => element + 5);

А затем сделайте:

this.setState({score: newArray});

Функция map возвращает новый массив, используя ваше условие.

Любая проблема, дайте мне знать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...