刚开始学习js,react,以及redux,在自己做练习,想把store的数据传入react的state,却怎么也不成功,还请各位指导一下。
想做的事:
将API取得的数据(比如论坛上的帖子内容)传入redux保存,再传给react组件显示到UI上
我是这样做的:
1.通过API取得了一些数据
{id: "111", title: "title1", body: "body1"}
{id: "222", title: "title2", body: "body2"}
2.在componentDidMount()中dispatch初始化数据用的action"iniPosts()",将数据传入reducer处理
【action.js】
export function iniPosts(posts) {
return {
type: INI_POSTS,
posts
}
}
【reducer.js】
function ourPosts(state = {}, action) {
switch (action.type) {
case INI_POSTS:
const { posts } = action
let temp = [...action.posts]
return temp.map((item) => ({
[item.id] : item
}))
default:
return state
}
}
我的数据现在调整成了这样:
reducer后的数据:
[111:{id: "111", title: "title1", body: "body1"}
222:{id: "222", title: "title2", body: "body2"}]
3.现在我想把这个数据原样传给react的state
想用connect的方法传递数据,但在mapStateToProps()中给posts赋值的结果总是空值
【APP.js】
function mapStateToProps({ ourPosts}) {
console.log(ourPosts) // 这里可以看到reducer后的数据,是和期待一样的
const temp = Object.keys(ourPosts).map(key => Object.assign({}, ourPosts[key]))
temp.map((item) => ({
[item.id]: item
})) // 测试用
console.log(temp) // 这里可以看到reducer后的数据,是和期待一样的
return {
posts: temp.map((item) => ({
[item.id]: item
}))
// 这样传递写法不对么?但是死活想不明白为什么传不过去...
}
}
function mapDispatchToProps(dispatch) {
return {
iniPosts: (data) => dispatch(iniPosts(data)), // dispatch传入APP是成功的,可以正常调用
}
}
export default connect(mapStateToProps, mapDispatchToProps)(App);
4.查看结果发现是空值:
【APP.js】
class App extends Component {
constructor(props) {
super(props);
this.state = {
posts: [],
}
}
...
render() {
const { posts } = this.state
console.log(posts) // 调用完action之后,这里是空值 []
}
}
PS:
自己也尝试了如下写法:
function mapStateToProps({ ourPosts}) {
let a = ourPosts;
console.log(a) // 输出是reducer后的数据,和期待一样
return {
posts: a // 在render中只能看到空值[],后来换成 Object.assign(),但是也传不过去
}
}
求教在mapStateToProps()中应该如何赋值
使用mapStateToProps之后,就是将state映射到props上,用const { posts } = this.state不对吧,应该是this.props。
要将值传递到state里面,在【APP.js】里面,this.state = {posts: []}设置state的时候,直接把从props取出来的数据赋值给状态。