【发布时间】:2016-09-24 09:17:25
【问题描述】:
我有两个组件:AddingAnimalPanel.js 和 AnimalList.js。我试图做以下事情:
在AddingAnimalPanel.js 中,我有一个按钮,一旦单击它,它就会调用函数_addAnimal() 并通过redux 更新状态,更新后的状态被传递到AnimalList.js 并通过@ 列出状态987654326@。
但我收到一个错误:Cannot read property 'rowIdentities' of undefined,我没有为animalData 定义初始状态。所以我尝试将初始状态属性animalData 定义为一个数组,但仍然出现错误:Cannot read property 'length' of undefined。
我似乎无法弄清楚出了什么问题。我做错了什么?
这是我的代码:
在AddingAnimalPanel.js:
_addAnimal() {
var animals = [{animal: 'bird'}, {animal: 'cat'}, {animal: 'dog'}]
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
var animalData = ds.cloneWithRows(animals)
this.props.uploadAnimalData(animalData) //Calling action creator
}
在行动创作者:
export const uploadAnimalData = (animalData) => {
return {
type: actionTypes.UPLOAD_ANIMAL_DATA,
animalData: animalData,
}
}
在减速机中:
const DEFAULT_STATE = {
//Tried also both animalData:[] and animalData:{} but still got the length error
}
export default function(state = DEFAULT_STATE, action) {
switch(action.type) {
case actionTypes.UPLOAD_ANIMAL_DATA:
return {
...state,
animalData: action.animalData
}
default:
return state
}
}
redux 工作正常,props 被传递给AnimalList.js:
_renderRow(rowData){
return (
<AnimalListRow rowData={rowData} {...this.props}/>
)
}
render() {
return (
<View style={styles.container}>
<ListView
dataSource={this.props.animalData} //ListView is causing the error
renderRow={this._renderRow}
/>
</View>
)
}
}
编辑 - 附加代码
这是我目前为 redux 设置的。
减速机:
const DEFAULT_STATE = {
}
export default function(state = DEFAULT_STATE, action) {
switch(action.type) {
case actionTypes.UPLOAD_ANIMAL_DATA:
return {
...state,
animalData: action.animalData
}
default:
return state
}
}
export const getAnimalData = (state) => ({
animalData: state.animalData,
})
在名为 index.js 的单独文件中使用 react-redux 中的 connect,这就是 animalData 被传递到 AnimalList.js 的方式:
// @flow
import AnimalList from './AnimalList'
import { connect } from 'react-redux'
import * as actions from './actions'
import {
getAnimalData,
} from '../../reducers/rootReducer'
const mapStateToProps = (state) => ({
...getAnimalData(state),
})
export default connect(mapStateToProps, actions)(AnimalList)
【问题讨论】:
-
我对反应很陌生,redux。但是当我想从我的组件中调度一个动作创建者时,我将我的组件与 mapDispatchToProps 函数连接到 redux 状态。
function mapStateToProps(state, ownProps) { return { animalData: animalData }; } function mapDispatchToProps(dispatch) { return { actions: bindActionCreators(uploadAnimalData, dispatch) }; } export default connect(mapStateToProps, mapDispatchToProps)(AddingAnimalPanel); -
@BadChanneler 感谢您的回复,但您介意将其作为答案吗?很难弄清楚你的建议。
-
调试时你检查过 props 变量吗?似乎您没有通过 getAnimalData 方法在 redux 中传递 animalData 道具。同样在 reducer 中,我会使用
Object.assign({}, state...来合并 state 和 animalData 属性。
标签: javascript listview reactjs react-native redux