Vue:为啥计算属性在商店中声明时需要 v-model 指令中的 .value 而在组件中声明时不需要

Posted

技术标签:

【中文标题】Vue:为啥计算属性在商店中声明时需要 v-model 指令中的 .value 而在组件中声明时不需要【英文标题】:Vue: Why does computed property require .value in v-model directive when declared in a store but not when declared in the componentVue:为什么计算属性在商店中声明时需要 v-model 指令中的 .value 而在组件中声明时不需要 【发布时间】:2021-12-09 17:48:42 【问题描述】:

当我将一个计算道具从我的组件移动到商店时,我必须在 v-model 指令中使用 .value。

下面的两个类星体选择列表都在工作。它们都显示来自 store 的状态,第一个从 store 中的计算属性访问状态,第二个从组件中的计算属性访问状态。

两个计算的 props 本质上是相同的实现,为什么我必须在第一个的 v-model 指令中使用 .value

    <q-select
        outlined
        v-model="store.warehouse.currentDepotCode.value" 
        :options="store.warehouse.getDepotSelectList()"
        emit-value
        map-options
        label="Select a Depot"
        class="q-ma-md"
    />
    
    <q-select
        outlined
        v-model="currentDepotCode" 
        :options="store.warehouse.getDepotSelectList()"
        emit-value
        map-options
        label="Select a Depot"
        class="q-ma-md"
    />

  setup() 
    const store = inject("store");

    const currentDepotCode = computed(
        get()
            return store.warehouse.state.currentDepot;
        ,
        set(depotCode)
            store.warehouse.setCurrentDepot(depotCode);
        
    );
    
    return 
        store,
        currentDepotCode,  
    ;

存储/index.js


    const state = reactive(
        depots,
        currentDepot: 'VIC',
    );

    const currentDepotCode = computed(
        get()
            return state.currentDepot;
        ,
        set(depotCode)
            state.currentDepot = depotCode;
        
    );

    export default 
        state: readonly(state),
        ...methods,
        ...getters,
        currentDepotCode,
    ;

(我正在使用计算道具,因为选择组件将出现在许多页面上,所以我想使用 setter 函数,并且我不想在每个页面上重复计算道具,所以它会进入商店。快乐在这个设置上也有 cmets)。

【问题讨论】:

【参考方案1】:

我认为因为q-select options 是一个对象数组, store.warehouse.getDepotSelectList() 每个元素的真正价值

例如: [ key: 1, value: 'first' , key: 2, value: 'second' ]

因为在文档中它直接使用值 https://quasar.dev/vue-components/select

【讨论】:

但这两种实现不应该相同吗?在我看来,Vue 在组件实现中“在幕后”做的事情,在 js 对象中实现时并没有做(即使它是反应式的)

以上是关于Vue:为啥计算属性在商店中声明时需要 v-model 指令中的 .value 而在组件中声明时不需要的主要内容,如果未能解决你的问题,请参考以下文章

Vue2:当我从响应中分配属性时,为啥会收到无限的 $http.get 请求?

Vue 计算属性已更新,但组件未重新渲染

为啥要在 vue.js 中计算属性?

vue的计算属性

VueX:为啥 vuex 存储数据不更新组件数据属性?

vue计算属性相关实例