【发布时间】:2018-11-23 13:22:05
【问题描述】:
react/redux 的新手。想知道为什么我的组件在触发动作时没有刷新。也不确定 reducer 是否是操作 store 的好地方,但它是纯粹的,所以它应该可以工作。
发生的情况是触发了操作并更新了存储。但是点击的项目没有更新(道具更新应该添加added类)
组件:
通过 Id 引用 rcm_data 来切换类 added,onClick 触发动作
import React, { Component } from "react";
import { connect } from "react-redux";
import { addRateCard } from "../actions";
import "./RcmEditor.css";
class RcmEditor extends Component {
constructor(props) {
super(props);
}
render() {
return (
<table className="slds-table slds-table--cell-buffer slds-table--bordered">
<thead>
<tr>
<th>Rate Card Name</th>
</tr>
</thead>
<tbody>
{group.rateCardIds.map(rcId => {
return (
<tr
className={
"ed-group-rc " +
(this.props.rcm_data[rcId].added ? "added" : "")
}
key={rcId}
onClick={() =>
this.props.addRateCard(this.props.rcm_data[rcId])
}
>
<td colSpan="100">{this.props.rcm_data[rcId].Name}</td>
</tr>
);
})}
</tbody>
</table>
);
}
}
const mapDispatchToProps = {
addRateCard
};
const mapStateToProps = state => {
return { rcm_data: state.rcm_data, group_data: state.group_data };
};
export default connect(
mapStateToProps,
mapDispatchToProps
)(RcmEditor);
操作:
const ADD_RATE_CARD = "ADD_RATE_CARD";
export const addRateCard = rateCard => ({ type: ADD_RATE_CARD, payload: rateCard });
减速机:
复制状态(只是预防措施),增加 group_data 的 added_count 属性并更改操作引用的 rcm_data 的添加属性。有效载荷 Id,返回一个新的状态。这里的一切似乎都是纯净的
const initialState = {
rcm_data: {},
group_data: {},
};
const rootReducer = (state = initialState, action) => {
case "ADD_RATE_CARD":
let _state = { ...state };
let rateCard = action.payload;
_state.group_data[rateCard.GroupName].added_count++;
_state.rcm_data[rateCard.Id].added = true;
let data = {
rcm_data: _state.rcm_data,
group_data: _state.group_data
};
return { ...state, rcm_data: _state.rcm_data, group_data: _state.group_data };
default:
return state;
}
};
export default rootReducer;
【问题讨论】:
-
not sure whether reducer is a good place to manipulate store。我个人更喜欢逻辑应该在行动中,reducer 应该只给出新的状态。您可以在您的操作中使用 redux-thunk 来添加逻辑 -
我认为访问 store in action 创作者并不是最佳实践
标签: javascript reactjs redux