简体   繁体   English

如何在组件上显示redux道具

[英]How to show redux props on Component

I have a problem to show array from actions to the component(Dashboard). 我有一个问题,无法显示从动作到组件(仪表板)的数组。

When I use this.props.Cards direct in Render I can see the array. 当我直接在Render中使用this.props.Cards ,我可以看到该数组。

But when I add directly to componentDidMount I can't see just undefined . 但是当我直接添加到componentDidMount我看不到undefined

Here you go, my code: 在这里,我的代码:

Dashboard.js Dashboard.js

 import React, { Component } from 'react' import { connect } from 'react-redux' import PropTypes from 'prop-types' import Header from '../../common/Header/' import Masonry from '../../common/Masonry/' import { cardAction } from '../../store/actions/Cards' import Arrow_Down from '../../assets/img/arrow-down.svg' class Dashboard extends Component { componentDidMount() { console.log('show all cards', this.props.cardAction()) } constructor(props) { super(props) this.state = { collapsed: true, class: 'collapsed', showCards: [] } this.toggleCollapse = this.toggleCollapse.bind(this); } toggleCollapse(i) { console.log('i', i) this.setState({ collapsed: !this.state.collapsed, class: this.state.collapsed ? '' : 'collapsed', showCards: this.state.Cards }); console.log(this.state.showCards) } render() { console.log('cards', this.props.Cards) console.log('pre push-a', this.state.showCards) // this.state.showCards.push('test') // console.log('posle push-a', this.state.showCards) const cardList = this.props.Cards.map((info, i) => { return ( <div className={(info.open === 'true') ? 'collapsed' : ''} key={i}> <div className='header flex space-between'> <h2>{info.title}</h2> <span onClick={() => { this.toggleCollapse(i) }}><img src={Arrow_Down} alt='Arrow' /></span> </div> <div className='content'> <p>{info.description}</p> </div> </div> ) }) return ( <div> <Header /> <Masonry columns={3} gap={20}> {cardList} </Masonry> </div> ) } } Dashboard.defaultProps = { columns: 2, gap: 20, Cards: [] } Dashboard.propTypes = { Cards: PropTypes.array.isRequired, } const mapStateToProps = state => { return { Cards: state.cards.result } } const mapDispatchToProps = dispatch => ({ cardAction: () => dispatch(cardAction()) }) export default connect(mapStateToProps, mapDispatchToProps)(Dashboard) 

Actions --> Card.js 动作-> Card.js

 const cards_array = [ { title: 'title', description: 'Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito', open: 'true' }, { title: 'title2', description: 'Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito', open: 'true' }, { title: 'title3', description: 'Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito', open: 'true' }, { title: 'title', description: 'Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito', open: 'false' }, { title: 'title2', description: 'Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito', open: 'true' }, { title: 'title3', description: 'Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito', open: 'true' }, { title: 'title3', description: 'Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito', open: 'false' }, { title: 'title', description: 'Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito', open: 'true' }, { title: 'title2', description: 'Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttito', open: 'true' } ] export const cardAction = () => dispatch => { dispatch({ type: 'FETCH_CARDS', payload: cards_array }) } 

Reducers --> Cards.js 减速器-> Cards.js

 import { updateObject } from '../Utility' const getCards = (state, action) => { return updateObject(state, { result: action.payload }) } export default (state = {}, action) => { switch (action.type) { case 'FETCH_CARDS': return getCards(state, action) default: return state } } 

I'm not sure you have any problem here. 我不确定您在这里是否有任何问题。 Calling this.props.cardAction in componentDidMount will go ahead to fetch cards and it will be available via this.props.Cards . componentDidMount调用this.props.cardAction将继续获取卡,并且可以通过this.props.Cards Naturally, you would not expect this.props.Card to show after being called. 自然,您不会希望this.props.Card在被调用后显示。

BTW, because React re-renders when new props come in, you get to see it immediately in the render function because the data is not delayed in some way. 顺便说一句,因为当新的道具进入时React会重新渲染,因此您可以在render函数中立即看到它,因为数据不会以某种方式延迟。 But initially, it would be undefined . 但是最初,它是undefined

This is because you are consoling this.props.cardAction() . 这是因为您正在安慰this.props.cardAction() By executing action cardAction , Cards prop will only be updated. 通过执行action cardActionCards cardAction只会被更新。 You are getting undefined because redux action doesn't return anything. 您将undefined因为redux操作不会返回任何内容。 When you execute action, state will be updated which in return update the prop of component. 当您执行动作时,状态将被更新,这反过来会更新组件的属性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM