【问题标题】:Vuex: [Vue warn]: Computed property "username" was assigned to but it has no setterVuex:[Vue 警告]:计算属性“用户名”已分配给但它没有设置器
【发布时间】:2018-05-07 17:31:49
【问题描述】:

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

<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.

【问题讨论】:

    标签: vue.js vuejs2 vuex


    【解决方案1】:

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

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

    当您尝试使用 Vuex 状态时,您的计算属性的设置器可以将更改提交到存储。

    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




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

    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

    我希望这会有所帮助。

    【讨论】:

    • 好的,它适用于输入字段 - 我明白了。但是,如果我想通过单击按钮在商店中触发 boolean(loggedIn) 怎么办?您如何将其与活动联系起来?
    • 您将需要一个突变来更新商店中的 isAuthed 属性,并需要一个在单击按钮时调度的操作。我已经更新了我的答案。
    • 即使我没有使用 VueX,只是使用 EventBus,我也会收到此警告?
    • @AkinHwan 如果您尝试以任何方式更新计算机属性,那么您需要同时定义 getset 函数。
    猜你喜欢
    • 2020-07-18
    • 2018-02-16
    • 2021-03-17
    • 2018-11-02
    • 2018-09-26
    • 2019-05-21
    • 2020-11-07
    • 2020-10-23
    • 2020-10-04
    相关资源
    最近更新 更多