Обновить массив объектов в React redux

Я новичок в react-redux.

const initialState = {
    Low: [
        {
            id: 0,
            type: '',
            count: '',
            allowded: 6,
            level: 'EASY'
        }
    ],
    Medium: [
        {
            id: 0,
            type: '',
            count: '',
            allowded: 7,
            level: 'MEDIUM'
        }
    ],
    High: [
        {
            id: 0,
            type: '',
            count: '',
            allowded: 7,
            level: 'TOUGH'
        }
    ]
}

Это значение моего начального состояния.

После этого ,

onChange(event, tobeupdated, id, type, noc, data) {
   let newData = { ...this.props.data };
    if (newData) {
      let data = newData[type].map((object, index) => {
        if (object.id === id) {
          object[tobeupdated] = event.target.value;
          const tobeData = newData[type];
         this.props.updateLowLevel({tobeData, type}).then(() => {
            let criteria_filled = this.disableAddbutton({ ...this.props.data }, type);
            addedRow = `new${type}RowAdded`;
            this.setState({
              [addedRow]: criteria_filled ? true : false
            })
});
}

Таким образом я обновляю значения объекта. а затем заменить весь объект.

return (dispatch) => {
    dispatch({
      type: QUIZ_DATA,
      data: tobeUpdated,
    });
    return Promise.resolve();
  }
}

В моем редукторе

case QUIZ_DATA:
            return {
                ...state,
                [action.data.type]: [action.data.tobeData],
                error: false,
            }

Итак, вот что происходит, когда я меняю, скажем, type, а затем он добавляет этот массив объектов в качестве дочерних к предыдущему массиву. поэтому его добавляется столько, сколько вы добавляете. ТАК, из-за этого я не могу получить этот рендеринг должным образом.

Итак, что происходит, Низкий: Обновить массив объектов в React redux

Этот способ добавляется. Итак, как я могу это сделать?

Может ли кто-нибудь управлять мной этим?

на этот раз попробуйте создать локальную переменную в reducer и сделайте что-то вроде: case QUIZ_DATA: {let data; data = [...state]; data.data.type = action.data.tobeData; return data}

Abhishek Anand 11.12.2018 10:10

данные = [... состояние]; После этого данные не получают фактические данные, они не определены.

Ganesh Kaspate 11.12.2018 10:17

не могли бы вы опубликовать полный код редуктора? я имею в виду сверху вниз. Я хочу посмотреть, как вы справлялись с состоянием в начале

Abhishek Anand 11.12.2018 10:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
634
2

Ответы 2

Попробуйте это как редуктор. Он распространяет содержимое tobeData на массив.

case QUIZ_DATA:
            return {
                ...state,
                [action.data.type]: [...action.data.tobeData], // the difference is here
                error: false,
            }

Здесь, чтобы отправить этот объект, я должен взять const newData = {... this.props.data}

Ganesh Kaspate 11.12.2018 10:27

Я вас не очень понимаю. Вы как редуктор пробовали? Я думаю, это приведет к желаемой структуре данных.

Peter Ambruzs 11.12.2018 10:39

Я добавил комментарий к разнице. Вы в основном помещаете массив в массив. В моем решении массив копируется в массив с помощью оператора распространения (...).

Peter Ambruzs 11.12.2018 10:59

Одна вещь заключается в том, почему, когда я пытаюсь сбросить его, значение начального состояния всегда остается заполненным значением, а не сбросом в исходное состояние

Ganesh Kaspate 11.12.2018 11:05

Думаю, я ответил на твой вопрос. Если вам это нравится, пожалуйста, примите это. А если у вас есть дополнительные вопросы, добавьте их в отдельный вопрос с дополнительным кодом, если необходимо.

Peter Ambruzs 11.12.2018 11:13
stackoverflow.com/questions/53648186/…
Ganesh Kaspate 11.12.2018 11:34

Если у вас есть время, не могли бы вы проверить это

Ganesh Kaspate 11.12.2018 11:34

Примите и проголосуйте за ответы, если это решит вашу проблему, пожалуйста. Вы не приняли ни одного ответа за последние пару месяцев, если я посмотрю на вашу страницу. Если вы не награждаете людей, которые помогают вам, почему вы ждете от них помощи. Прочтите, пожалуйста, эту статью Справочного центра: stackoverflow.com/help/someone-answers

Peter Ambruzs 12.12.2018 09:03
[action.data.type]: [...action.data.tobeData],

Данные, которые вы передаете через action.data.tobeData(eg: [1,2,3]), являются самим массивом.

Итак, когда вы используете [action.data.type]: [action.data.tobeData], это создаст массив массива [[1, 2, 3]].

Вы можете использовать [action.data.type]: [...action.data.tobeData], это называется оператором распространения, все, что он делает, это в основном копирует весь element внутри action.data.tobeData и разносит его.

Вы можете обратиться к этому документу Синтаксис распространения

Другие вопросы по теме