8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85
1

Метод класса

04.07.2020, 10:55. Показов 1249. Ответов 6
Метки es6, vue, vuex (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Столкнулся со следующей проблемой:
Есть класс, с методом addTodo
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
export default class Note extends Object {
  constructor(options) {
    if (!options) options = {}
 
    super(options)
    this.title = options.title || ""
    this.todos = options.todos || []
    this.id = options.id || v4()
  }
 
  addTodo(text) {
    console.log(`Added todo "${text}" in note with id ${this.id}`)
    this.todos.push({id: v4(), done:false, text})
  }
}
В компоненте редактирования заметки получаю из стора нужную заметку и далее хочу сохранить исходное состояние заметки, на случай отмены редактирования, а работать в компоненте собираюсь с current.
Javascript
1
2
3
const note = this.$store.getters.getNoteById(id)
this.base = note
this.current = new Note(note)
Но столкнулсяс проблемой, что при вызове
Javascript
1
this.current.addTodo("todo")
todo добавляется как в this.current, так и в this.base и в стор. Не очень хорошо понимаю передачу объектов по ссылкам, но здесь как минимум у current должен создаваться новый объект, разве нет?

Понимаю, что ошибка вероятно глупая и я чего то не понимаю. Прошу хотя бы направить на путь)

Всем Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2020, 10:55
Ответы с готовыми решениями:

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

Как передать в метод класса Menu указатель на метод дочернего класса?
Как передать в метод базового класса указатель на метод дочернего: class Menu() { protected: ...

В C++ метод производного класса всегда переопределяет метод базового класса?
#pragma once #include <iostream> using namespace std; class Fish { public: virtual...

Как описать метод класса? Как двумя способами описать инлайнируемый метод класса? Что такое this?
Раздел 1. Строки: нужен фрагмент кода. Обязательно используйте функции для работы со строками. Как...

6
Всегда онлайн
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
04.07.2020, 15:08 2
Цитата Сообщение от DEMONSTR Посмотреть сообщение
extends Object {
Скажите, а зачем вам наследование от Object?

Цитата Сообщение от DEMONSTR Посмотреть сообщение
const note = this.$store.getters.getNoteById(id)
this.base = note
this.current = new Note(note)
Но столкнулсяс проблемой, что при вызове
Javascript
Не очень понимаю зачем вам дополнительная абстракция в виде класса. Насколько я знаю, в Vuex лучше всегда хранить только примитивные типы данных и объекты из них, поскольку они и есть "сырым" stateом вашего приложения. Mutations и есть для того чтобы этими данными управлять. Почему бы вам не сделать просто в Vuex:

Javascript
1
2
3
4
5
6
7
8
state: {
 todos: []
},
mutations: {
  addTodo(state, payload) {
     state.todos.push(payload);
   }
}
и обойтись без класса
1
8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85
04.07.2020, 15:30  [ТС] 3
MrOnlineCoder, Идея была в том, что есть некий объект note, у которого должны быть todos. Собственно самих note может быть много, отсюда и родилась идея сделать класс с базовыми методами, добавления, удаления todo. Да и при увеличении функциональности, мне показалось, что будет классно иметь просто класс Note в котором можно добавлять методы. Наследовался от Object, что бы не прописывать set, get вручную.
0
Всегда онлайн
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
04.07.2020, 15:57 4
Лучший ответ Сообщение было отмечено DEMONSTR как решение

Решение

DEMONSTR, понимаю Вашу идею, однако Vuex не так работает, по двум причинам:
1. Не факт что Vue сможет сделать реактивными все данные вашего класса.
2. Получается, что у вас происходит изменения состояния класса в методе класса, и вы фактически меняете состояние приложения, а это неверно - состояние должно меняться только через Vuex мутации.

Т.е. опять таки, я бы лично хранил у Vuex только данные в виде объектов и примитивных значений.

У вас есть серверная часть? Обычно такие задачи решаются путем one-to-many отношения: у вас есть таблица в БД notes, где каждая запись имеет note_id. Дальше каждая todo в todos тоже имеют note_id, указывая, к какому note они принадлежат. А когда вы будете грузить данные с сервера, то вы всегда будете получать только данные, без реализации и классов. И тогда вам нужно эти данные записать в стейт.

К пример вы можете сделать
Javascript
1
2
3
4
state: {
  notes: [],
  todos: []
}
И:
Javascript
1
2
3
4
5
getters: {
  getTodosForNote(state) {
    return (note_id) => state.todos.filter(todo => todo.note_id === note_id);
   }
}
1
8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85
04.07.2020, 17:11  [ТС] 5
MrOnlineCoder, Спасибо, что уделили внимание) мысль уловил, спасибо!

Добавлено через 57 минут
MrOnlineCoder, Дружище, спасибо тебе огромное! то с чем я возился несколько дней, оказалось плевым делом, главное идти правильной дорогой! Можешь посоветовать какие то материалы, которые помогают определять подходы к проектированию тех или иных вещей?
0
Всегда онлайн
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
04.07.2020, 17:44 6
Цитата Сообщение от DEMONSTR Посмотреть сообщение
посоветовать какие то материалы, которые помогают определять подходы к проектированию тех или иных вещей?
Думаю, начать можно с официальной документации: https://vuex.vuejs.org/ru/guide/

Цитата Сообщение от DEMONSTR Посмотреть сообщение
которые помогают определять подходы к проектированию тех или иных вещей?
Тут к сожалению прямых ссылок дать не могу. Могу предложить погуглить примеры или еще лучше "real-life" примеры разных приложений. Еще вариант - практикуйтесь!
1
8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85
04.07.2020, 18:56  [ТС] 7
MrOnlineCoder, Спасибо)
0
04.07.2020, 18:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2020, 18:56
Помогаю со студенческими работами здесь

Передача значения переменной из метода одного класса в метод другого класса
Добрый вечер! Есть основная форма Form1 в которой есть метод private void button1_Click(object...

С помощью делегата из одного класса вызвать private метод с другого класса
доброго времени суток. такой вопрос. С применением делегатов и пониманием проблем нет когда...

Создать для класса виртуальный метод, возвращающий уникальный идентификатор класса
В курсаче по ООП сказано создать для класса виртуальный метод,возвращающий уникальный идентификатор...

Передача названия класса в метод другого класса в качестве входных данных
У меня есть класс "class1", от которого наследуется несколько однотипных классов classX, classY,...

Как в методе класса вызвать другой метод того же класса?
class mate { public: int AplusB(int A, int B) { return A+B; } int AplusBplusC(int A,...

Как правильно вызвать метод класса внутри самого класса?
Здравствуйте. Собственно тема прописана в заголовке: как правильно вызвать метод класса внутри...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru