Javascript 如何使用redux还原剂处理我的反应?
我有三个图标,每个图标上都有一个文本,如果被点击,文本会增加,这会处理我在帖子上的反应。我的想法是,我可以一次点击一个反应,双击一个反应会反转到以前的状态,这是帖子上反应的传统方式。我已经制定了要采取的步骤,我已经制定了我的行动,并为减速器做了基础工作,但在这一点上,我不知道如何继续 以下是步骤:Javascript 如何使用redux还原剂处理我的反应?,javascript,reactjs,redux,Javascript,Reactjs,Redux,我有三个图标,每个图标上都有一个文本,如果被点击,文本会增加,这会处理我在帖子上的反应。我的想法是,我可以一次点击一个反应,双击一个反应会反转到以前的状态,这是帖子上反应的传统方式。我已经制定了要采取的步骤,我已经制定了我的行动,并为减速器做了基础工作,但在这一点上,我不知道如何继续 以下是步骤: 在redux store中,将每张卡的数据保存在地图中,所有初始数据的默认状态都在地图中 使用地图中的项目填充视图 在反应更新时,触发一个动作,该动作采用一个具有类型和值的项Id和一个reaction
Id
和一个reaction
键(这是一个对象)reducers.js
import { DISLIKE_REACTION, LIKE_REACTION, MAYBE_REACTION } from './actionTypes';
const INITIAL_STATE = {
reactionFlow: new Map(),
};
/**
* Creates a Javascript Map for each card as an object mapped by id
*
* @param {Array} reactions - array of user reaction objects
* @return {Map} - the new reaction list
*/
function generateItemMap(reactions) {
const setOfReactions = new Map();
reactions.forEach(reaction => {
const { _id } = reaction;
setOfReactions.set(_id, reaction);
});
return setOfReactions;
}
/**
* Updates the given reaction type of the item
*
* @param {Object} reaction - the reaction object with a type and value
* @param {Map} type - the type of reactions
* @return {Map} - the updated user reaction
*/
function updateReactionType(reaction, type) {
const { _id } = reaction;
const newType = new Map([...type.entries()]);
newType.set(_id, reaction);
return newType;
}
export default (state = { ...INITIAL_STATE }, action) => {
switch (action.type) {
case LIKE_REACTION: {
return {
...state,
};
}
case DISLIKE_REACTION: {
return {
};
}
case MAYBE_REACTION: {
return {
...state,
};
}
default:
return state;
}
};
actions.js
/**
* Triggers request to like or unlike post
*
* @function
* @return {Object} The {@link actionTypes.LIKE_REACTION LIKE_REACTION}
* action.
*/
export const likeReaction = () => ({
type: LIKE_REACTION,
});
/**
* Triggers request to dislike post or reverse dislike
*
* @function
*
* @param {Object} payload - the data sent with the action
* @return {Object} The {@link actionTypes.DISLIKE_REACTION DISLIKE_REACTION}
* action.
*/
export const dislikeReaction = payload => ({
payload,
type: DISLIKE_REACTION,
});
/**
* Triggers request to maybe post or reverse maybe
*
* @function
*
* @param {Object} payload - the data sent with the action
* @return {Object} The {@link actionTypes.MAYBE_REACTION MAYBE_REACTION}
* action.
*/
export const maybeReaction = payload => ({
payload,
type: MAYBE_REACTION,
});
组成部分
<span>
<Icon type={type} />
{text}
</span>
);
{text}
);
减速器应返回应用程序的修改状态
export default (state = { ...INITIAL_STATE }, action) => {
switch (action.type) {
case LIKE_REACTION:
const { Id, reaction } = action.payload;
let newState = { ...state }; //be careful, this is a shallow copy
//TODO: perform the changes you want in state here
//newState = something...
return newState;
减速器应返回应用程序的修改状态
export default (state = { ...INITIAL_STATE }, action) => {
switch (action.type) {
case LIKE_REACTION:
const { Id, reaction } = action.payload;
let newState = { ...state }; //be careful, this is a shallow copy
//TODO: perform the changes you want in state here
//newState = something...
return newState;
在开关情况下,指定要在reducer上更新的值,如下所示:
case LIKE_REACTION: {
return {
...state,
value: action.payload
};
}
您可以在此处的组件上获得更新值:
const mapStateToProps = (state) => {
console.log(state)
return{
value: state.value
}
};
现在,您可以在以下位置获得更新值:
componentWillReceiveProps(nextProps, preProps) {
this.setState({value: nextProps.value})
}
现在,将组件中更新的状态值用作this.state.value
如需更多了解react生命周期,请阅读:在如下开关情况下,指定要在减速器上更新的值:
case LIKE_REACTION: {
return {
...state,
value: action.payload
};
}
您可以在此处的组件上获得更新值:
const mapStateToProps = (state) => {
console.log(state)
return{
value: state.value
}
};
现在,您可以在以下位置获得更新值:
componentWillReceiveProps(nextProps, preProps) {
this.setState({value: nextProps.value})
}
现在,将组件中更新的状态值用作this.state.value
有关react生命周期的更多了解,请阅读:查看我创建的示例-
因此,基本上我们有两个操作来递增和递减,这两个操作操作中央存储中的数据,这是您需要的吗?检查我创建的这个示例-
因此,基本上我们有两个操作来递增和递减,这两个操作操作中央存储中的数据,这就是您需要的吗?我更困惑了。你能给出一个具体的工作例子吗?我更困惑了。您是否可以给出一个具体的工作示例?假设我有这样一个案例:{const{payload}=action;const{reactionFlow}=state;return{…state,reactionFlow:updateReactionType(payload,reactionFlow),};}我如何从这里和下一个案例开始讨论我的组件。您的组件使用connect from redux,并按照您在MapStateTrops中的说明,以道具形式接收此状态?如果是这样,react/redux将负责更新该组件。如果没有,您可以按照。我不确定我是否理解你所说的下一个案例的意思。如果您指的是switch/case中的cases,那么每个case都应该根据其操作意图为redux存储提供必要的更改。如果您指的是其他组件交互,那么每个交互都是独立的,并且会触发对redux存储/组件的一次更新,比如说我有类似于此的案例
的反应:{const{payload}=action;const{reactionFlow}=state;return{…状态,reactionFlow:updateReactionType(有效负载,reactionFlow),};}
我如何从这里和下一个案例开始到我的组件。您的组件使用connect from redux,并按照您在MapStateTrops中的说明作为道具接收此状态?如果是,react/redux将负责更新该组件。如果不是,您可以按照。我不确定是否理解您所说的下一个案例的含义。如果您是指案例在switch/case中,每个case都应该根据其操作意图对redux存储进行必要的更改。如果您指的是其他组件交互,则每个交互都是独立的,并将触发对redux存储/组件的一次更新否,一点也不?是这样的;我有三种反应:喜欢
,不喜欢
和可能
。我点击喜欢
,它会增加1,我再次点击它会减少1,反之亦然,就像你遇到的任何传统网站一样,比如facebook、twitter或其他什么。而且我不能同时点击喜欢
和不喜欢
,这是它们中的任何一个。一种方法是维护ain状态like-liked:null,如果liked为“True”,则将like图标切换为ON,如果liked为“False”,则将LOKE图标切换为ON,如果“null”同时禁用like-LOKE,则您可以为MAYBEI维护另一个状态如果您用于facebook上的评论,则您的状态类似于state={“Comment”:“某物”,喜欢:对,也许:错}不,一点也不?是这样的;我有三种反应:喜欢
,不喜欢
和可能
。我点击喜欢
,它会增加1,我再次点击,它会减少1,反之亦然,就像你遇到的任何传统网站一样,比如facebook、twitter或其他什么。而且我不能有喜欢
,和不喜欢
同时单击,它是其中之一。一种方法是保持状态like-like:null,如果like为“True”,则将like图标切换为ON,如果like为“False”,则将不喜欢图标切换为ON,如果为“null”禁用这两个选项,你可以为maybeIf维护另一个状态如果你在facebook上使用评论,你的状态应该是state={“Comment”:“something”,liked:True,Maybe:False}