我正在创建一组团队按钮,它们可以在单击按钮时进行上/下级升级。卡根据状态(一个数组)进行渲染。我不确定动作创建者和减速器中的代码应该是什么。
有效方法:
-
使用state.map()和mapstatetoProps()
用状态中的正确数据正确渲染卡片
-
LEVEL_UP操作会在点击时调度,因为我在redux开发工具中可以看到它
什么不起作用:
- 该动作实际上还没有做任何事情
- 我尝试过的所有事情都导致未定义,因此我无法在reducer中访问正确的数据
**TeambuilderCards.js**
import React from "react";
import { connect } from "react-redux";
import TeamBuilderCard from "./TeamBuilderCard.js";
const TeamBuilderCards = ({ teamMembers }) => {
return (
<div classname="ui centered cards">
{teamMembers.map(teamMember => (
<TeamBuilderCard
key={teamMember.id}
name={teamMember.name}
xp={teamMember.xp}
/>
))}
</div>
);
};
const mapstatetoProps = state => {
return {
teamMembers: state
};
};
export default connect(mapstatetoProps)(TeamBuilderCards);
**Teambuildercard.js**
import React from "react";
import { connect } from "react-redux";
import { levelUp,levelDown } from "../actions";
const roundUp = num => Math.ceil(num / 100) * 100;
const TeamBuilderCard = (props,dispatch) => (
<div classname="ui card">
<div classname="content">
<div classname="header">{props.name}</div>
<div classname="description">
<h3>Current Level: {props.xp.toString().slice(0,1)}</h3>
<p>XP is currently {props.xp}</p>
<p> {roundUp(props.xp) - props.xp} xp points to to next level</p>
</div>
<div classname="meta">
Increase or decrease {props.name}'s level with the buttons below
</div>
</div>
<div classname="extra content">
<div classname="ui two buttons">
<div classname="ui basic green button" onClick={props.levelUp}>
Level up
</div>
<div classname="ui basic pink button" onClick={props.levelDown}>
Level down
</div>
</div>
</div>
</div>
);
const mapDispatchToProps = { levelUp,levelDown };
export default connect(
null,mapDispatchToProps
)(TeamBuilderCard);
**actions.js**
export const LEVEL_UP = "LEVEL_UP";
export const LEVEL_DOWN = "LEVEL_DOWN";
export function levelUp() {
return { type: LEVEL_UP };
}
export function levelDown() {
return { type: LEVEL_DOWN };
}
**reducers/index.js**
import { LEVEL_UP,LEVEL_DOWN } from "../actions";
import preloadedState from "../preloadedState"; *//preloadedState is and array and I want to modify state[i].xp*
const initialState = preloadedState;
export default function reducer(state = initialState,action) {
switch (action.type) {
case LEVEL_UP:
return state; *//want to add 100 XP*
case LEVEL_DOWN:
return state; *//want to subtract 100 XP*
default:
return state;
}
}
*preLoadedState.js* //Just the first 3 objects in the array
const preloadedState = [
{
id: "0",name: "Pete",xp: 153
},{
id: "1",name: "Jane",xp: 121
},{
id: "2",name: "Jim",xp: 188
}
];
export default preloadedState;