【问题标题】:problems with Vuex data renderingVuex 数据渲染的问题
【发布时间】:2020-06-26 07:36:35
【问题描述】:

我正在使用 nuxt 和 store 的模块模式研究 vuex 的反应性。问题是,尽管存储中的所有数据都已通过操作 => 突变成功更改,但它们不会出现在页面上,并且仅显示存储数组的空新元素。这是我的文件:

商店>联系人>index.js:

let initialData = [
  {
    id: 1,
    name: 'Michael',
    email: 'michael.s@mail.com',
    message: 'message from Michael'
  },
  {
    id: 2,
    name: 'Mark',
    email: 'mark.sh@email.com',
    message: 'message from Mark'
  },
  {
    id: 3,
    name: 'Valery',
    email: 'valery.sh@mail.com',
    message: 'message from Valery'
  }
]
const state = () =>{
  return {
    contacts: []
  }
}
const getters = {
  allContacts (state) {
    return state.contacts
  }
}

const actions = {
  async initializeData({ commit }) {
    commit('setData', initialData)
  },
  addNewContact({ commit, state }, newContact) {
    commit('addContact', newContact)
  }
}

const mutations = {
  setData: (state, contacts) => (state.contacts = contacts),
  addContact: (state, newContact) => state.contacts.push(newContact)
}


export default { state, getters, mutations, actions}

组件本身:

<template>
  <div class="contact-form">
    <div class="links">
      <nuxt-link to="/">home</nuxt-link>
      <nuxt-link to="/contact-form">contact form</nuxt-link>
    </div>
    <h1>leave your contacts and message here:</h1>
    <div class="input-wrapper">
      <form class="feedback-form" action="">
        <div class="name">
          <label for="recipient-name" class="col-form-label">Ваше имя:</label>
          <input type="text" id="recipient-name" v-model="obj.userName" name="name" class="form-control" placeholder="Представьтесь, пожалуйста">
        </div>
        <div class="form-group">
          <label for="recipient-mail" class="col-form-label">Ваш email:</label>
          <input type="email" v-model="obj.userEmail"  name="email" id="recipient-mail" class="form-control" placeholder="example@mail.ru">
        </div>
        <div class="form-group">
          <label for="message-text" class="col-form-label">Сообщение:</label>
          <textarea name="message" v-model="obj.userMessage" id="message-text" class="form-control"></textarea>
        </div>
        <button @click.prevent="addToStore()" type="submit">submit</button>
      </form>
    </div>
    <h3>list of contacts</h3>
    <div class="contacts-list">
      <div class="list-element" v-for="contact in allContacts" :key="contact.id">
        id: {{contact.id}} <br> name: {{contact.name}}<br/> email: {{contact.email}}<br/> message: {{contact.message}}
      </div>
    </div>
  </div>

</template>
<script>
  import { mapMutations, mapGetters, mapActions } from 'vuex'
  export default {
    data() {
      return {
        obj: {
          userName: '',
          userEmail: '',
          userMessage: ''
        }
      }
    },
   mounted() {
     console.log(this.showGetters)
   },
    created() {
       this.initializeData()
    },
    methods: {
      ...mapActions({
        initializeData: 'contacts/initializeData',
        addNewContact: 'contacts/addNewContact'
      }),
      addToStore() {
        this.addNewContact(this.obj)
      },
    },
    computed: {
      ...mapGetters({
        allContacts: 'contacts/allContacts',
      }),
      showGetters () {
        return this.allContacts
      }

    },

  }
</script>


那么,谁能帮忙理解一下,出了什么问题?

【问题讨论】:

  • 我知道,所有的数据修改都是成功的,因为vue开发工具显示一切正常
  • 您能具体说明问题所在吗?您是看不到任何联系人,还是出现了最初的 3 个联系人?问题只是添加新联系人吗?
  • @skirtle,我可以看到 3 个初始联系人,以及新创建联系人的空白字段。仅当我添加新联系人时才会出现此问题。同时,vue dev tools 显示,state.contacts 被更新并包含新添加的用户数据

标签: vue.js vuex nuxt.js


【解决方案1】:

您的字段名称不匹配。

在obj 内部,您已将它们称为userName、userEmail 和userMessage。对于您称呼他们为name、email 和message 的所有其他联系人。

如果需要,您可以使用不同的名称,但在某个地方您必须将一个映射到另一个,以便它们在数组中都相同。

您应该能够通过 Vue Devtools 确认这一点。前 3 个联系人的字段与新添加的联系人不同。

【讨论】:

    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 2017-05-27
    • 2021-03-30
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多