vue.js - Vuex:[Vue warn]:计算属性 "username"已分配给但它没有 setter

标签 vue.js vuejs2 vuex

我正在尝试从全局 vuex 状态设置和获取用户名、密码和身份验证 bool 值,并有条件地在导航栏中呈现一些元素。这是应该传递数据的登录组件:

<template>
  <div class="login" id="login">
    <b-form-input
      id="inputfield"
      v-model="username"
      type="text"
      placeholder="username">
    </b-form-input>
    <b-form-input
      id="inputfield"
      type="password"
      v-model="password"
      placeholder="password">
    </b-form-input>
    <b-button @click="login()" id = "inputfield" variant="outline-success">
      Login
    </b-button>
  </div>
</template>

<script>
  export default {
    name: 'login',
    computed: {
      username () {
        return this.$store.state.username
      },
      password () {
        return this.$store.state.password
      },
      loggedIn () {
        return this.$store.state.loggedIn
      }
    },
    methods: {
      login () {
        this.$store.dispatch('login', {
          username: this.username,
          password: this.password,
          isAuthed: true // just to test
        })
      }
    }
  }
</script>

但是,当我在输入字段中输入任何内容时,Vue 会对该字段发出警告(并且状态不会更新):

[Vue warn]: Computed property "username" was assigned to but it has no setter.

最佳答案

您正在将 v-model 与计算属性一起使用,因此您实际上是在尝试在 input 事件触发时更新该计算属性。

因此,您需要为计算属性设置 setter。

当您尝试使用 Vuex 状态时,您的计算属性的 setter 可以向商店提交变更。

computed: {

  username : {
    get () {
      return this.$store.state.username
    },
    set (value) {
      this.$store.commit('updateUsername', value)
    }
  },

  password : {
    get () {
      return this.$store.state.password
    },
    set (value) {
      this.$store.commit('updatePassword', value)
    }
  },

  ...

},

您需要为您的商店设置相应的变更,例如:

mutations: {

  updateUsername (state, username) {
    state.username = username
  },

  updatePassword (state, password) {
    state.username = password
  },

  ...

}

有关更多详细信息,请参阅此处 Vuex 文档中的说明: https://vuex.vuejs.org/en/forms.html




对于您的登录按钮,您正在尝试发送一个操作。如果您只想在商店中设置一个 bool 值,那么您可以像这样发送操作:

methods: {
  login () {
    this.$store.dispatch('login', true)
  }
}

...然后在您的商店中,您将需要相应的操作和突变来提交:

mutations: {
  login (state, value) {
    state.isAuthed = value
  }
},

actions: {
  login ({ commit }) {
    commit('login')
  }
}

以下是操作文档: https://vuex.vuejs.org/en/actions.html

希望对您有所帮助。

关于vue.js - Vuex:[Vue warn]:计算属性 "username"已分配给但它没有 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47460765/

相关文章:

firebase - Vuex,在 Action 中改变状态

vuejs2 - Chartjs(非Vue)不在V-if/V-show中呈现图表图表

javascript - 正则表达式特殊

javascript - 使用路线时从 vuex 存储获取特定数据

javascript - Webpack 无法解析 JS 变量提供的路径

vue.js - 在vuejs中,为什么我在使用挂载钩子(Hook)时需要使用nextTick?

javascript - 在 Vue.js 中如何使用多个路由 View ,其中一个在另一个组件中?

javascript - 如何获取组件中当前的路由名称?

vue.js - 单击事件后从可组合项启动 useStore()

javascript - 使用VueJS 2将搜索和排序功能添加到VuetifyJS列表