Vuex - Normalizr не работает должным образом - PullRequest
0 голосов
/ 31 августа 2018

Я создаю простое приложение для чата. У меня есть три объекта: комнаты, сообщения и пользователи. У меня есть поддельный API, который возвращает ответ, подобный этому:

[{
  id: 1,
  name: 'room1',
  avatar: 'some img url',
  messages: [
      {
        id: 1,
        text: 'some text',
        user: {
          id: 1,
          username: 'Peter Peterson',
          avatar: 'some img url'
      }
  ]
 }]

И мои действия выглядят так:

getAllRooms({ commit }) {
  commit(GET_ALL_ROOMS_REQUEST);
  return FakeApi.getAllRooms()
    .then(
      rooms => {
        const { entities } = normalize(rooms, room);
        console.log(entities);
        commit(GET_ALL_ROOMS_SUCCESS, {
          rooms: entities.rooms, byId: rooms.map(room => room.id)
        });
        commit(GET_ALL_MESSAGES_SUCCESS, { messages: entities.messages });
        commit(GET_ALL_USERS_SUCCESS, { users: entities.users });
      },
      err => commit(GET_ALL_ROOMS_ERROR)
    )
}

И мои мутации выглядят так:

[GET_ALL_ROOMS_REQUEST](state) {
  state.loading = true;
},
[GET_ALL_ROOMS_SUCCESS](state, payload) {
  state.rooms = payload.rooms;
  state.byId = payload.byId;
  state.loading = false;
},
[GET_ALL_ROOMS_ERROR]() {
  state.error = true;
  state.loading = false;
}

А мой компонент вызывает действие так:

{
  mounted() {
    this.getAllRooms();
  }
}

Это мои определения схемы:

const user = new schema.Entity('users');

const message = new schema.Entity('messages', {
  user: user
});

const room = new schema.Entity('rooms', {
  messages: [message]
})

когда я проверяю ответ в методе then после FakeApi.getAllRooms (), каждый объект оборачивается каким-то странным Обозревателем, и я передаю его таким образом, чтобы нормализовать и нормализовать возвращает какой-то странный ответ.

Что я делаю не так?

1 Ответ

0 голосов
/ 01 сентября 2018

Проблема была не в vuejs, а в том, как я делал схемы нормализатора. Поскольку мой ответ является массивом в корне, у меня должна была быть новая rooms схема массива, например так:

const user = new schema.Entity('users');

const message = new schema.Entity('messages', {
  user: user
});

const room = new schema.Entity('rooms', {
  messages: [message]
});

const roomsSchema = [room];

А затем используйте это так: normalize(rooms, roomsSchema)

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