状态更新时组件不重新渲染

Posted

技术标签:

【中文标题】状态更新时组件不重新渲染【英文标题】:Component not re-rendering when state is updated 【发布时间】:2018-06-05 09:20:46 【问题描述】:

我一直在尝试对此进行调试,但由于某种原因,当我在创建的生命周期函数中从外部 API 提取数据并使用突变更新存储时,获取状态的组件的计算属性似乎没有更新导致组件不重新渲染。有什么想法吗?

这是组件的模板:

<template>
    <div class="list">
        <ul>
            <ListItem v-for="transaction in transactions" :list-item-data="transaction" :key="transaction.txid"/>
        </ul>
    </div>
</template>

<script>
    import ListItem from './ListItem.vue';
    import External from '../ExternalAPI';

    export default 
        methods: 
            fetchData() 
                return ExternalAPI.fetch(data => 
                    this.$store.dispatch('setTransactions', data);
                );
            
        ,
        components: 
            ListItem
        ,
        computed: 
            transactions () 
                return this.$store.getters.transactions;
            ,
        ,
        created() 
            this.fetchData();
        ,
    
</script>

这里是商店:

export const store = new Vuex.Store(
    state: 
      transactions: [],
    ,
    getters: 
      transactions: state => 
        return state.transactions;
      
    ,
    mutations: 
      setTransactions: (state, transactions) => 
        let txs = transactions.map(transaction => 
            return new Transaction(transaction.id, transaction.prop1, transaction.prop2);
        );
        state.transactions = txs;
      ,
    ,
    actions: 
      setTransactions: (context, transactions) => 
        context.commit('setTransactions', transactions);
      ,
    ,
);

【问题讨论】:

【参考方案1】:

vuex 状态树中的任何东西都需要是原始的、普通的对象或数组。我在文档中找不到任何明确说明的内容,但我确实找到了comment on vuex issue 153。

您在 setTransactions 突变中实例化了一些 Transaction。尝试将其更改为类似

setTransactions: (state, transactions) => 
  let txs = transactions.map(transaction => 
    return 
      id: transaction.id,
      prop1: transaction.prop1,
      prop2: transaction.prop2
    ;
  );
  state.transactions = txs;
,

【讨论】:

以上是关于状态更新时组件不重新渲染的主要内容,如果未能解决你的问题,请参考以下文章

React hooks 功能组件防止在状态更新时重新渲染

更新 Redux 存储时反应组件不重新渲染

仅在重新渲染组件时才反应状态更新

高阶组件状态正在正确更新,但接收道具的包装组件不会在状态更改时重新渲染

StencilJS - 更新导致整个组件重新渲染的状态

React Redux Store 更新,但组件不重新渲染