Nano Hash - криптовалюты, майнинг, программирование

Двусторонняя привязка данных Vuex-ORM не может отслеживать вложенный объект

этот вопрос связан с Двусторонним связыванием данных с Vuex-ORM

Я пробовал использовать watch с deep для обработки такой пользовательской формы.

<template>
  <div id="app">
    <div style="display: inline-grid">
      <label for="text-1">Text-1: </label>
      <input name="text-1" type="text" v-model="user.name" />

      <label for="text-2">Text-2: </label>
      <input name="text-2" type="text" v-model="user.lastName" />

      <label for="text-3">Text-3: </label>
      <input name="text-3" type="text" v-model="user.birth" />

      <label for="text-4">Text-4: </label>
      <input name="text-4" type="text" v-model="user.hobby" />
    </div>
    <div>
      <h5>Result</h5>
      {{ userFromStore }}
    </div>
  </div>
</template>

<script>
import { mapGetters, mapMutations, mapActions } from "vuex";
export default {
  name: "App",
  computed: {
    ...mapGetters({
      userFromStore: "getUserFromStore",
      messageFromStore: "getMessage",
    }),
    user: function () {
      return this.userFromStore ?? {}; // basically "User.find(this.userId)" inside store getters
    },
  },
  watch: {
    user: {
      handler(value) {
        console.log('called')
      //  this.updateUser(value);
      },
      deep: true,
    },
  },
  methods: {
    ...mapActions({
      fetchUser: "fetchUser",
    }),
    ...mapMutations({
      updateUser: "updateUser",
    }),
  },
  created() {
    this.fetchUser();
  },
};
</script>

Проблема в том, что мой наблюдатель не смотрит, что бы я ни пытался. как только данные пришли из Vuex-ORM, мой компонент не может смотреть на getters user

Кто-нибудь знает, почему?


  • Как вы измените свой объект? Есть некоторые предостережения для обнаружения модификации объекта в Vue2: vuejs.org/v2/guide /reactivity.html#For-Objects 22.04.2021
  • да, я удалил мутацию внутри часов. Проблема в том, что я даже не дохожу до момента, когда мутация запускается. наблюдатель ничего не делает с изменениями ввода 22.04.2021
  • Это не мутация внутри watch, а мутация, которая должна вызвать watch, который вы должны искать. 22.04.2021
  • @kissu может случиться так, что ORM динамически добавляет данные в мой получатель хранилища и разрушает мою реактивность. 22.04.2021
  • @kissu есть подсказка, где искать мутацию watch? 22.04.2021
  • Не знаете, как работает vuex ORM, но почему вы не следите за userFromStore напрямую? Давайте удалим поведение computed из уравнения. Кроме того, быстрый совет: вы можете написать все свои геттеры / действия vuex и так далее, например: ...mapGetters(['getUserFromStore']) вместо формы объекта, если вы не хотите ее переименовывать. 22.04.2021
  • Возможно, эта ветка может быть чем-то полезной: github.com/vuex-orm/vuex- orm / issues / 197 22.04.2021

Ответы:


1

User.find(...) возвращает модель. Свойства этой модели не являются реактивными, т.е. вы не можете выполнять двустороннюю привязку данных к элементам, которые не отслеживаются. Следовательно, ваш наблюдатель не сработает.

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

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

Vue.use(Vuex)

class User extends VuexORM.Model {
  static entity = 'users'

  static fields() {
    return {
      id: this.number(null),
      name: this.string(''),
      lastName: this.string(''),
      birth: this.string(''),
      hobby: this.string('')
    }
  }
}

const db = new VuexORM.Database()
db.register(User)

const store = new Vuex.Store({
  plugins: [VuexORM.install(db)]
})

User.insert({
  data: {
    id: 1,
    name: 'John',
    lastName: 'Doe',
    birth: '12/12/2012',
    hobby: 'This, that, the other'
  }
})

Vue.component('user-input', {
  props: {
    value: { type: String, required: true }
  },
  template: `<input type="text" :value="value" @input="$emit('input', $event.target.value)" placeholder="Enter text here...">`
})

new Vue({
  el: '#app',
  computed: {
    user() {
      return User.find(1)
    }
  },
  methods: {
    update(prop, value) {
      this.user.$update({
        [prop]: value
      })
    }
  }
})
<script src="https://unpkg.com/[email protected]/dist/vue.min.js"></script>
<script src="https://unpkg.com/[email protected]/dist/vuex.min.js"></script>
<script src="https://unpkg.com/@vuex-orm/[email protected]/dist/vuex-orm.global.prod.js"></script>

<div id="app">
  <div v-if="user" style="display: inline-grid">
    <label for="text-1">Name: </label>
    <user-input
      id="text-1"
      :value="user.name"
      @input="update('name', $event)"
    ></user-input>

    <label for="text-2">Last name: </label>
    <user-input
      id="text-2"
      :value="user.lastName"
      @input="update('lastName', $event)"
    ></user-input>

    <label for="text-3">D.O.B: </label>
    <user-input
      id="text-3"
      :value="user.birth"
      @input="update('birth', $event)"
    ></user-input>

    <label for="text-4">Hobby: </label>
    <user-input
      id="text-4"
      :value="user.hobby"
      @input="update('hobby', $event)"
    ></user-input>
  </div>
  <pre>User in store: {{ user }}</pre>
</div>

16.05.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..