javascript - 如何在组件上显示 redux 道具
问题描述
我在显示从动作到组件(仪表板)的数组时遇到问题。
当我this.props.Cards
在 Render 中使用直接时,我可以看到数组。
但是当我直接添加到时,componentDidMount
我看不到undefined
.
给你,我的代码:
仪表板.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)
动作 --> 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
})
}
减速器 --> 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
}
}
解决方案
这是因为你在安慰this.props.cardAction()
。通过执行 action cardAction
,Cards
只会更新 prop。你得到undefined
是因为 redux 操作不返回任何东西。当您执行操作时,状态将被更新,从而更新组件的属性。
推荐阅读
- python - 如何重复我的循环并向我的字典添加更多信息,并使用不同的字符串?
- python - 为什么右键单击会在我的 OpenCV imshow() 窗口中打开一个下拉菜单?
- python - 如何修复“(sqlite3.ProgrammingError)在线程中创建的SQLite对象只能在同一线程中使用。” 问题?
- html - 如何从两个单独的类中修复弹性间距
- bash - 在 bash 中使用转义字符,我们实际上要转义什么?
- swift - 无服务器和 alamofire “用户无权访问此资源”,但与邮递员合作
- sql - 使用 postgresql 设计一个渐变维度类型 2 脚本
- html - 如何在 float=left div 中居中 float=left 文本框和按钮
- html - CSS有没有办法解释自定义alpha计数器的`ol`和`li`标签的`start`和/或`value`属性?
- python-3.x - 总是得到1的精度如何解决?