更改表值时Vuex Store不更新

Posted

技术标签:

【中文标题】更改表值时Vuex Store不更新【英文标题】:Vuex Store not updating when changing table values 【发布时间】:2020-06-24 09:37:24 【问题描述】:

我正在使用 Quasar 框架的 Q-Popup-edit 和 Vuex Store 处理表格。

它正确填充。但是,当我更改表上的值时,它会恢复到当前值并且根本没有反映。

这是我的桌子:

tableData: [
        
          'FrozenYogurt' : 
            'topping': 'strawberry'
          ,
          'FrozenYogurtPart2' : 
            'topping2': 'strawberry2'
          
        ,
        
          'IceCreamSandwich' : 
            'baseFlavor': 'chocolate',
            'somethingAgain': 'chocolatiest'
          
        ,
        
          'CreamPuff' : 
            'sourceBakery': 'Starbucks'
         
        
      ]

我的 Vuex 突变:

  mutations: 
    saveUpdatedData (newVal) 
      console.log('inside MUTATION saveUpdatedData')
      state.tableData.length = 0
      state.tableData.push(newVal)
    
  

并使用双向计算属性(get/set)来填充表格:

    tableRows: 
      get: function () 
        console.log('inside GET')    
        return this.$store.state.tableData.reduce((acc, item) => 
          Object.keys(item).forEach(name => 
            Object.keys(item[name]).forEach(property => 
              acc.push( name, property, value: item[name][property])
            )
          )
          return acc
        , [])
      ,
      set: function (newValue) 
        console.log('inside SET')
        this.$store.commit('saveUpdatedData', newValue)
      
    

但是set() 函数根本没有被调用。

最后是我的 Vue 代码:

     <q-table
        :data="tableRows"
        :columns="columns"
        :rows-per-page-options="[]"
        row-key="name" wrap-cells>

        <template v-slot:body="props">
          <q-tr :props="props">
            <q-td key="desc" :props="props">
               props.row.name 
              <q-popup-edit v-model="props.row.name" buttons>
                <q-input v-model="props.row.name" dense autofocus counter ></q-input>
              </q-popup-edit>
            </q-td>

            <q-td key="property" :props="props">
               props.row.property 
              <q-popup-edit buttons v-model="props.row.property">
                <q-input type="textarea" v-model="props.row.property" autofocus counter @keyup.enter.stop></q-input>
              </q-popup-edit>
            </q-td>

            <q-td key="value" :props="props">
               props.row.value 
              <q-popup-edit v-model="props.row.value" buttons>
                <q-input v-model="props.row.value" dense autofocus ></q-input>
              </q-popup-edit>
            </q-td>

          </q-tr>
        </template>
      </q-table>

如何使更改反映在 vuex 商店中??

这里的代码笔: https://codepen.io/kzaiwo/pen/BaNYbZZ?editors=1011

救命!

【问题讨论】:

【参考方案1】:

你可以使用计算的 getter 和 setter 来扩展你的计算属性:

https://vuejs.org/v2/guide/computed.html#Computed-Setter

您现有的计算代码移至 get 函数。 需要实现set函数。

【讨论】:

我试图实现我的计算属性的 get/set 函数,但它似乎仍然不起作用。事实上,set 函数永远不会被调用。添加了 console.log,它根本不打印。我可能做错了什么? CodePen 更新:codepen.io/kzaiwo/pen/BaNYbZZ?editors=1011【参考方案2】:

你可以参考这个网址https://vuex.vuejs.org/guide/mutations.html 你会找到改变 vuex 存储的正确方法。

【讨论】:

我已经用适当的突变和双向(get/set)计算属性更新了我的codepen。仍然没有更新:(帮助! 等我检查【参考方案3】:

恐怕您仍然必须像文档中那样使用数据道具。 (我尝试过计算属性设置器,但它不起作用)

要将其与商店集成,您可以使用以下解决方案:https://codepen.io/woothu/pen/VwLXzNQ?editors=1011

  data () 
    return 
columns: [
   name: 'desc', align: 'left', label: 'Data Element', field: 'desc', sortable: true, style: 'min-width: 180px; max-width: 180px;' ,
   name: 'property', align: 'center', label: 'Property', field: 'property', sortable: true, style: 'min-width: 20px; max-width: 20px;' ,
   name: 'value', align: 'left', label: 'Value', field: 'value', sortable: true, style: 'min-width: 300px; max-width: 300px; word-wrap: break-word; font-family: Consolas; font-size: 13px' 
],
   tableRows: null
    
  ,
  beforeMount () 
    this.tableRows = this.$store.state.tableData.reduce((acc, item) => 
      Object.keys(item).forEach(name => 
        Object.keys(item[name]).forEach(property => 
          acc.push( name, property, value: item[name][property])
        )
      )
      return acc
    , [])
  ,
  watch: 
     tableRows: 
       deep: true,
       handler (val)       
         this.$store.commit('saveUpdatedData', val)
       
     
  

顺便说一句。我认为 QTable 组件在使用更新的数据结构更改数据时应该发出事件。 (或者制作一些其他功能来启用处理 Vuex)可能值得打开 PR 并提及这个讨论。

【讨论】:

以上是关于更改表值时Vuex Store不更新的主要内容,如果未能解决你的问题,请参考以下文章

Vuex 存储值在不提交的情况下得到更新

Vue3 Vuex状态更改不更新计算值

Vuex - Mutation

通过javascript更改值时元素不更新错误状态

使用vuex实时更新右上角通知信息的红点数量

使用vuex实时更新右上角通知信息的红点数量