当前位置: 首页 > 知识库问答 >
问题:

React Redux:连接的子组件不接收道具

暨弘懿
2023-03-14

最后,在GalleryItemContentv1中有一个子组件,名为TestCOM。这就是问题所在。我还将从DisplyItem获得的项传递到Testcom。因此,数据流是DisplayItems(连接)>GalleryItemContentv1(未连接)>TestCOM(连接)。

Testcom连接到Redux。它使用redux中的一些操作来更新entriesdata.data中的项。当我在Testcom中更新this.props.entriesdata.data时,GalleryItemContentv1可以很好地接收更新后的数据,但是Testcom却什么都接收不到。Testcom中的项从未更新。

我发现问题出在将Testcom连接到Redux时。如果Testcom没有连接到redux,它也会接收更新的道具,就像GalleryItemContentv1一样。

组件如下。我已经试着尽可能地简化它们。

DisplayItems

import React, {Component} from 'react';
import GalleryItemContentV1 from './GalleryItemContentV1';
import { connect } from 'react-redux';
import {getContestEntriesPageData} from '../../actions/contest';

class DisplayItems extends Component {
  componentDidMount(){
    this.props.getContestEntriesPageData(uri, search);
  }

  render(){

    console.log('DisplayItems props', this.props);

      return (
        <div>
          <div className="card-deck thumbnails" id="card-list">
            {  this.props.entriesData.data instanceof Array ? 
                  this.props.entriesData.data.map(function(object, i){
                    return <GalleryItemContentV1 
                      entry={object} key={i} 
                      arr_key={i}
                    />;
                  }, this) : ''
              }
          </div>
        </div>
      )
  }
}

const mapStateToProps = state => (
  {
    entriesData: state.entriesData,
  }
)

const mapDispatchToProps = (dispatch) => {
  return {
    getContestEntriesPageData: (uri, search) => {
      dispatch(getContestEntriesPageData(uri, search));
    }
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(DisplayItems);

GalleryItemContentV1

import React, { Component } from 'react';
import TestCom from './TestCom';

class GalleryItemContentV1 extends Component {
  constructor(props) {
    super(props);
  }
  render() {
    return (
        <div>
        <TestCom entry={this.props.entry} />
      </div>
    );
    }
}
export default GalleryItemContentV1;

Testcom

import React, {Component} from 'react';
import { connect } from 'react-redux';

class TestCom extends Component {
  constructor(props) { 
    super(props);
  }

  render(){

    console.log('TestCom props', this.props);

    return (

      <div>{this.props.entry.VotesCount}</div>

    )
  }
}

const mapStateToProps = state => (
  {
    user: state.user
  }
)
export default connect(mapStateToProps)(TestCom);
import {createStore, applyMiddleware} from 'redux';
import thunk from 'redux-thunk';
import ContestReducer from '../reducers/contest';

export default function configureStore(initialState) {
  return createStore(
    ContestReducer,
    initialState,
    applyMiddleware(thunk)
  );
}
import * as ContestActionTypes from '../actiontypes/contest';

const initialState = {
  contest: null,
  subscriptions: [],
  user: null,
  page: null
}
export default function Contest(state=initialState, action) {
  console.log('redux action reducer: ', action)
  switch(action.type) {
    case ContestActionTypes.HANDLE_VOTE:
      const newState = { ...state };
      if (newState.entriesData) {
        const index = newState.entriesData.data.findIndex(x => x.id === action.entry.id)
        newState.entriesData.data[index].VotesCount = action.vote;
      } else {
        newState.entry.VotesCount = action.vote;
      }

      return newState

      default:
        return state;
  }
}

我还注意到GalleryItemContentv1也发生了同样的事情。如果我连接它,那么它将停止接收来自DisplayItems/redux商店的更新。

任何投入都是赞赏的。谢了!

共有1个答案

计承德
2023-03-14

你在改变你的状态。您在切片简化器中创建了顶级状态的浅层副本,但并没有创建内部所有嵌套级别的副本。然后,连接的组件提取state.entriesdata,引用没有改变。因此,connect包装组件认为状态根本没有改变,并且不会重新呈现您自己的组件。

Redux docs页面“不可变的更新模式”特别指出这是一个常见的错误。

如果不可更改地更新嵌套状态太麻烦了,我建议查看immer不可更改更新库。此外,我们新的redux-starter-kit包在内部使用Immer来编写更简单的简化程序。

另外,请参阅我的文章《惯用Redux:React-Redux的历史和实现》以了解背景和Connect如何在内部工作的详细信息。

 类似资料:
  • 这是父组件: 这是子组件: prop不会打印为子组件中的内容。 可能是什么问题?,已经在这个问题上很久了

  • 问题内容: 我有一组数据是通过将相似的子项目匹配在一起,然后按“类别”将这些相似的项目分组而创建的。 现在,必须以使每个“ group_id”内的相关类别分组在一起的方式匹配结果类别。在下面的示例中,一个匹配项是A-> B-> C-> D-> E-> F-> G,这是通过逐行重复获得的。 我已经发布了当前答案,该答案适用于此简单数据集,但是由于实际数据集最多包含1M行,并且每个“ group_id

  • 我有一个服务器,它在收到请求时需要使用goroutines从不同的流中读取消息,将它们发送到父goroutine,父goroutine将消息聚合并将它们发送到客户端。所以会是这样的: 我使用不同的通道在所有这些goroutine之间进行通信,工人可以写到聚合通道,处理程序(父goroutine)可以接收它并将其发送回客户机,所以一切都正常工作,几乎是:) 问题是我的工人没有收到由通道上的处理程序发

  • 我正在使用react路由器dom v5。反应v16中的2.0。13.1项目中,我使用静态路由将道具从父组件传递到子组件,父组件从其父组件(即祖父)接收道具。从应用程序。js-

  • 问题内容: 我正在为一个类编写一个函数: 我的图是: 其中键是节点,值是边。我的功能给了我这个连接的组件: 但是我将有两个不同的连接组件,例如: 我不明白我在哪里犯了错误。谁能帮我? 问题答案: 让我们简化图形表示: 这里,我们有一个函数返回一个字典,该字典的键是根,值是连接的组件: 让我们尝试一下: {8:[6、8、9],1:[0、1、2、3、4、5、7]}

  • 我应该在哪里打开和关闭到存储库的连接?在文章“不要重复DAO”中写道: DAO不负责处理事务、会话或连接。这些都是在DAO之外处理的,以实现灵活性。 但有些人建议我将对象注入DAO类,并处理DAO方法内部的所有连接。。。i、 e.每个CRUD操作都应打开和关闭与存储库的连接。