最后,在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商店的更新。
任何投入都是赞赏的。谢了!
你在改变你的状态。您在切片简化器中创建了顶级状态的浅层副本,但并没有创建内部所有嵌套级别的副本。然后,连接的组件提取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操作都应打开和关闭与存储库的连接。