React native 在调度中检测到状态突变(不是“中间”调度)
…在调度内部,路径为:“chat.messages.0”请查看处理操作{'type':'chat','payload':{'sender':'you','body':'foo'}}的减速器` 我的减速机:React native 在调度中检测到状态突变(不是“中间”调度),react-native,redux,react-native-flatlist,React Native,Redux,React Native Flatlist,…在调度内部,路径为:“chat.messages.0”请查看处理操作{'type':'chat','payload':{'sender':'you','body':'foo'}}的减速器` 我的减速机: chatMessage.js: export default (state, action) => { return Object.assign({}, { ...state, messages: [...state.messages, actio
chatMessage.js:
export default (state, action) => {
return Object.assign({}, {
...state,
messages: [...state.messages, action.payload]
})
}
有趣的是,如果我在聊天组件中使用messages=[]
,则不会出现此错误
export default class Chat extends React.Component {
state = {...this.props.data, input: "", toggle: false}
_renderItem = ({item}) => {
return <ChatMessageRow data={item} />
}
render() {
// var {messages} = this.state
var messages = []
return (
<View style={styles.container}>
<FlatList
inverted
renderItem={this._renderItem}
style={styles.logWrapper}
data={messages.reverse()}
extraData={this.state.toggle}
/>
在我的减速机中,同样的错误
编辑:
我的减速器已更新为chatMessage.js
我想问题在于我怎么称呼这个
我正在编写一个websocket控制器。当我发送一条消息时,我不需要像发送HTTP响应一样等待响应
我的websocket控制器:
onMessage = ({data}) => {
const json = JSON.parse(data)
if (json) {
if (json.status) {
const reducer = this.stateFilters[json.status]
if (reducer) {
reducer(json.body)
} else {
console.log("No reducer")
}
}
}
}
websocket控制器是在“我的视图”组件中创建的:
my main view
import {ChatStateFilters} from '../../reducers/chat'
const mapDispatch = { chatMessage }
this.wsController = new WebSocketController({
stateFilters: {chatMessage: this.props.chatMessage},
来自chat reducer文件(包含chatMessage reducer)
这些状态过滤器是在我创建切片时创建的
stateFilter['chatMessage']的值——这是在mapDispatchToProp
这个功能是:
let fn = (payload) => {
return dispatch => {
dispatch(stateFilters[actionName](payload))
}
}
exportedStateFilters[actionName] = fn
我认为问题出在这里的某个地方^……不知怎么的,调度正在启动,更新状态,但redux不知道调度已经完成
编辑2:
我认为缺少异步可能是一个问题。因此我将stateFilter(视图中绑定到我的道具的fn)更改为:
现在它又工作了几次……然后给我一个错误“在调度之间检测到状态突变”
我的聊天信息仍然是
export default (state, action) => {
let messages2 = Object.assign([], [...state.messages, action.payload])
return Object.assign({}, {...state, messages: messages2 })
}
那么为什么会发生这种错误呢?请显示整个原始还原程序。另外,
消息
在组件中来自何处?如果它来自Redux,消息。push()
是一个变异。你说的整个还原程序是什么意思?这是我的“导出默认值”的还原程序“谢谢。我正在使用更新的减速器。我编辑了更多的内容。我认为问题来自于映射到Dispatch的函数——我映射了一个操作,该操作立即更新了reducer,而没有异步导出默认值(state,action)=>{const m2=[…state.messages,action.payload]return Object.assign({},state,{messages:m2})}这通过改变我的状态过滤器来修复它,以返回另一个函数,而不是hjsut的disaptsch pf,而且没关系,它并不总是工作的。我不明白这里发生了什么。比赛条件?
let fn = (payload) => {
return dispatch => {
dispatch(stateFilters[actionName](payload))
}
}
exportedStateFilters[actionName] = fn
let fn = (payload) => {
return dispatch => {
post("", {}, true)
.then(response => {
dispatch(stateFilters[actionName](payload))
})
.catch(error => {
dispatch(stateFilters[actionName](payload))
})
}
}
export default (state, action) => {
let messages2 = Object.assign([], [...state.messages, action.payload])
return Object.assign({}, {...state, messages: messages2 })
}