【问题标题】:v-if not working without v-else using computed property that returns Vuex statev-if 在没有 v-else 的情况下无法使用返回 Vuex 状态的计算属性
【发布时间】:2020-11-15 03:32:43
【问题描述】:

我不确定问题出在哪里,但是基本的v-if 无法正常工作。

<template>
   <div>
       <select v-model="col.code">
            <option v-for="i in foo" :value="i.code">{{ i.code }}</option>
       </select>

       {{ col }}
       // { "code": "B" }

       <div v-if="col.code"> // not working
            {{ col.code }}
       </div>
   </div>
</template>


<script>
export default {
    data() {
       return {
           foo: [
            {code: 'A'},
            {code: 'B'},
            {code: 'C'}
           ]
       } 
    },
    created() {
        this.view();
    },
    watch: {
        '$route': 'view',
    },
    computed: {
        col() {
            return this.$store.state.col;
        }
    }
}
</script>

但是,如果我添加v-else,则会呈现结果。

我还发现,如果我在做同样的事情,没有计算属性,但直接使用数据属性,它也不起作用。使它起作用的是在 v-if 语句周围添加。

<div>

    <select v-model="col.code">
        <option v-for="i in [1,2,3,4,5]" :value="i">{{ i }}</option>
    </select>

    <div v-if="col.code">
        {{ col }}
    </div>

</div>

奇怪。

【问题讨论】:

  • 更新col状态的操作是什么?

标签: javascript vue.js vuejs2 vue-component vuex


【解决方案1】:

看起来&lt;div v-if="col.code"&gt;没有问题,但是将select绑定到计算属性是错误的,所以你应该使用计算setter:

  computed: {
        col: {
            get(){
              return this.$store.state.col;
             
              },
            set(newVal){
              this.$store.commit('UPDATE_COL',newVal); 
            }  
        }
    }

Vue.use(Vuex)
//store instance
const store = new Vuex.Store({
  state: {
    col: {
      code: 'A'
    }
  },
  mutations: {
    UPDATE_COL(state, payload) {
      state.col = payload
    }
  }
})

//vue instance
let app = new Vue({
  el: '#app',
  store,
  data() {
    return {
      foo: [{
          code: 'A'
        },
        {
          code: 'B'
        },
        {
          code: 'C'
        }
      ]
    }
  },
  created() {

  },

  computed: {
    col: {
      get() {
        return this.$store.state.col;

      },
      set(newVal) {
        this.$store.commit('UPDATE_COL', newVal);
      }
    }
  }

})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/vuex"></script>

<div id="app">
  <select v-model="col.code">
    <option v-for="i in foo" :value="i.code">{{ i.code }}</option>
  </select>


  <div v-if="col.code">
   My code : {{ col.code }}
  </div>

</div>

【讨论】:

  • 它也不起作用。没有错误,什么都没有。 col => get 有效,但是 col => set 无效。我还测试了没有计算属性的基本数据属性。它也不起作用。
  • 请分享您的商店,如果您可以分享一些 codepen 代码,那将非常有帮助
  • 它非常基础。几乎和你发的一样。只包括路由器和mixins。无论如何...我知道您的答案可能是正确的,但是,我需要将 v-if 包装在另一个根元素周围,这很奇怪。
  • 问题可能来自商店状态
  • 即使没有商店状态,有基本数据,它也不起作用。无论如何,我找到了解决方法。我知道您的代码有效,因为我以前使用过它。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-05-14
  • 2017-04-16
  • 2019-07-13
  • 2018-10-02
  • 2021-07-27
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多