Vue, Как нормализовать сложные данные и назначать уникальные идентификаторы

Привет, я читал статьи о нормализации сложных данных. В настоящее время у меня есть объект, для которого требуется создание новых объектов при нажатии кнопки. Мне нужно получить доступ к объектам по уникальным идентификаторам в компоненте, который также создается одним щелчком мыши. Фотографии процесса ниже. Я не знаю, как назначать новые объекты моему родительскому объекту? а также нормализовать мои данные на наличие потенциально сотен уникальных объектов строки бюджета. Любая помощь была бы замечательной, я понимаю сообщения на форуме, но не знаю, как применить их в моей ситуации.

Форумы VueСообщение на форуме Vue 2

state: {
// Current state of the application lies here.
// budgetRows array at webpage load, base state
budgetRows: {}

},
getters: {
    // Compute derived state based on the current state. More like computed property.
    // Gets budgetRows array from state
    budgetList: state => {
      return state.budgetRows
    },
// should get single array items from budgetRows based on component being accessed
budgetListItem: state => {
  return state.budgetRows
}


},
  mutations: {
    // Mutate the current state
    // Used to create a new row and push into budgetRows array (generate uniq id as well)
    createRow (state) {
      const uid = uniqId()
      Object.assign(state.budgetRows, {[uid]: defaultRow})
      // console.info(state.budgetRows)
    },

Дочерний компонент:

 <div v-for = "(budget, index) in budgetRowsList" :key = "index">
      {{ index }}
      <budgetItemRowContent></budgetItemRowContent>
      <progress data-min = "0" data-max = "100" data-value = "20"></progress>
    </div>
  </div>
</div>
<footer class = "budgetGroupFooter">
  <div class = "budgetGroupFooter-Content budgetGroupFooter-Content--Narrow">
    <button class = "addBudgetItem" id = "addBudgetItem" v-on:click = "createNewContent()">
      <svg xmlns = "http://www.w3.org/2000/svg" width = "8" height = "8" viewBox = "0 0 8 8">
        <path fill = "#FD0EBF" d = "M3 0v3h-3v2h3v3h2v-3h3v-2h-3v-3h-2z"></path>
      </svg>
      Add Item
    </button>
  </div>
</footer>

<script>
import budgetItemRowContent from '../components/budgetItemRowContent.vue'
import { store } from '../store'

export default {
  name: 'budgetGroup',
  components: {
    budgetItemRowContent,
    store
  },
  data: () => {
    return {
      budgetItemHeading: 'Housing'
      // creates array containing object for budget row information
    }
  },
  computed: {
    budgetRowsList () {
      return this.$store.getters.budgetList
    }
  },
  methods: {
    createNewContent () {
      this.$store.commit('createRow')
    }
  }
}

При загрузке веб-страницы и ярлык, и другой ввод будут редактироваться, вводить бюджет и сумму бюджета соответственно.

При двух щелчках мыши создаются еще два дочерних компонента с уникальными идентификаторами.

Поведение ключевого слова "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
0
773
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Vue.set - предпочтительный метод добавления новых свойств к существующему объекту, Object.assign - другой:

import Vue from 'vue'

// define an initial object state
const defaultRow = {
  inputBudget: '',
  amountBudgeted: 0,
  remaining: 0
}

const state = {
  budgetRows: {}
}

const mutations = {
  createRow (state) {
    const uid = uniqId()

    // with Vue.set
    Vue.set(state.budgetRows, uid, defaultRow)

    // with Object.assign()
    Object.assign(state.budgetRows, { [uid]: defaultRow })
  }
}

Спасибо, @DigitalDrifter. В итоге я сделал что-то очень похожее на это, и ваше выглядит чище, поэтому я реализовал этот стиль. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что мое вычисляемое свойство не обновляется при создании новой строки. Обновлен код, чтобы отразить задачу.

Landon Harvey 09.12.2018 04:08

Я обновил ответ, демонстрируя другой метод: Vue.set.

Brian Lee 09.12.2018 07:31

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