- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在开始发布代码之前,我将解释我想要发生的事情以及正在发生的事情。
我一整天都在研究这个问题,终于找到了一些工作。问题是我不知道它为什么有效以及这是否是最好的方法。我想要发生的是,当用户单击评论上的删除时,我希望该评论从后端的当前 post
和前端的状态中删除。
更新:我并没有真正添加足够的内容来展示我在说什么。当用户单击删除按钮时,它将在此处触发此功能:
deleteComment(comment) {
const {id} = this.props.match.params;
const {user, post, auth} = this.props;
if(!user) {
return (<div></div>);
}
if(auth) {
if(user._id === comment.author.id){
this.props.deleteComments(post, comment._id, () => {
this.props.history.push(`/posts/${post._id}`);
});
}
}
}
然后调用操作:
export function deleteComments(post, comment_id, cb) {
return function(dispatch) {
axios.delete(`${ROOT_URL}/${post._id}/comments/${comment_id}`)
.then(() => {
dispatch({
type: DELETE_COMMENTS,
payload: comment_id,
post: post
});
})
.then(() => cb())
.catch((error) => {
console.log(error);
});
}
}
我想知道的是:实际上,上面的所有代码都有效,因此它更像是一个引用。我想知道为什么在 reducer 中,当 DELETE_COMMENTS
被 switch case 捕获时,图片下面的当前状态如何更改为新状态,而没有删除我的注释。我没有明确地编辑或更改状态,那么 return (state);
如何在此处实际更改它?
详细说明我目前的状态如下:
正如你所看到的,我有一篇帖子,里面有评论。评论存储在一个数组中,每个评论都是具有文本、author.id、author.email 和createdAt 值的对象。现在,正如您在reducer_post中看到的那样,当操作被触发时,它会关闭DELETE_COMMENTS调度类型并且状态发生变化。
寻求帮助:action.payload
是 comment._id
,action.post
是当前正在查看的帖子。
import {
GET_ALL_POSTS,
GET_POST,
CREATE_POST,
DELETE_POST,
UPDATE_POST,
DELETE_COMMENTS
} from '../actions/types';
import _ from 'lodash';
export default function(state = {}, action) {
switch(action.type) {
case GET_ALL_POSTS:
return _.mapKeys(action.payload.data, '_id');
break;
case GET_POST:
return {...state, [action.payload.data._id]: action.payload.data};
break;
case DELETE_POST:
return _.omit(state, action.payload);
break;
case DELETE_COMMENTS:
let newCommentArray = _.reject(action.post.comments, {'_id': action.payload});
let newPost = action.post;
newPost.comments = newCommentArray;
return (state);
case UPDATE_POST:
let updates = {[action.payload.data._id]: action.payload.data};
return _.merge(...state, updates);
break;
default:
return state;
break;
}
}
我知道后端工作得很好,这也工作得很好。我的问题是,我只需输入 return (state); 即可更新状态。我不必做类似 return _.merge(...state, newPost);
或类似的事情。这一切工作得怎么样,不,我不只是复制一些教程然后来这里问这个只是为了弄清楚其他人是如何做到的。目前我相信魔法,所以最好能有一个解释。
既然我们在这里,这是最好的方法吗?或者这里有更好更干净的做事方式。
最佳答案
我认为您实际上是在直接改变状态,并且在组件仍在更新的意义上以某种方式摆脱它。
让我们遵循逻辑:
deleteComment()
中,您引用 this.props.post
。该对象可能是通过 mapStateToProps
从存储中提取的,因此它是存储中的对象引用。post
被传递给 this.props.deleteComments(post)
deleteComments()
调度 ({type : DELETE_COMMENTS, post})
let newPost = action.post; newPost.comments = newCommentArray
。但是,此时,newPost
仍然指向已处于存储状态的完全相同的对象。所以,你直接改变了它。通常情况下,这种突变会导致您的组件无法重新渲染,因此我只能假设在 mapState
中提取的其他一些值也得到了正确更新,从而导致重新渲染渲染。
如 Structuring Reducers - Immutable Update Patterns 中所述在 Redux 文档页面中,let someVariable = anotherVariable
不会创建新的对象引用 - 它只是创建第二个指向相同对象引用的变量。正确的不可变更新需要您正在使用的每一层嵌套的副本,而不仅仅是一层。在您的情况下,您将通过 _.reject()
创建一个新数组,但不会创建 post
对象的副本。
所以,最后,你的 reducer 逻辑是不正确的,你的应用程序有点意外地工作:)
更新
回答您关于正确更新的问题:您需要创建 post
对象的副本并使用新的注释数组更新它,并且您需要复制state
对象并使用新的 post 对象更新它。根据其余代码的作用,我的猜测是这应该有效:
case DELETE_COMMENTS:
const newCommentArray = _.reject(action.post.comments, {'_id': action.payload});
const newState = {
...state,
[action.post.id] : {
...action.post,
comments : newCommentArray
}
};
return newState;
关于javascript - 状态正在返回新状态而不触及状态 REACT/REDUX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44913729/
问题是,当用户回复彼此的帖子时,我必须这样做: margin-left:40px; 对于 1 级深度 react margin-left:80px; 对于 2 层深等 但是我想让 react div
我试图弄清楚如何将 React Router 与 React VR 连接起来。 首先,我应该使用 react-router dom/native ?目前尚不清楚,因为 React VR 构建在 Rea
我是 React 或一般编码背景的新手。我不确定这些陈述之间有什么区别 import * as react from 'react' 和 import react from 'react' 提前致谢!
我正在使用最新的稳定版本的 react、react-native、react-test-renderer、react-dom。 然而,react-native 依赖于 react@16.0.0-alp
是否 react 原生 应用程序开发可以通过软件架构实现,例如 MVC、MVP、MVVM ? 谢谢你。 最佳答案 是的。 React Native 只是你提到的那些软件设计模式中的“V”。如果你考虑其
您好我正在尝试在我的导航器右按钮中绑定(bind)一个功能, 但它给出了错误。 这是我的代码: import React, { Component } from 'react'; import Ico
我使用react native创建了一个应用程序,我正在尝试生成apk。在http://facebook.github.io/react-native/docs/signed-apk-android.
1 [我尝试将分页的 z-index 更改为 0,但没有成功] 这是我的codesandbox的链接:请检查最后一个选择下拉列表,它位于分页后面。 https://codesandbox.io/s/j
我注意到 React 可以这样导入: import * as React from 'react'; ...或者像这样: import React from 'react'; 第一个导入 react
我是 react-native 的新手。我正在使用 React Native Paper 为所有屏幕提供主题。我也在使用 react 导航堆栈导航器和抽屉导航器。首先,对于导航,论文主题在导航组件中不
我有一个使用 Ignite CLI 创建的 React Native 应用程序.我正在尝试将 TabNavigator 与 React Navigation 结合使用,但我似乎无法弄清楚如何将数据从一
我正在尝试在我的 React 应用程序中进行快照测试。我已经在使用 react-testing-library 进行一般的单元测试。然而,对于快照测试,我在网上看到了不同的方法,要么使用 react-
我正在使用 react-native 构建跨平台 native 应用程序,并使用 react-navigation 在屏幕之间导航和使用 redux 管理导航状态。当我嵌套导航器时会出现问题。 例如,
由于分页和 React Native Navigation,我面临着一种复杂的问题。 单击具有类别列表的抽屉,它们都将转到屏幕 问题陈述: 当我随机点击类别时,一切正常。但是,在分页过程中遇到问题。假
这是我的抽屉导航: const DashboardStack = StackNavigator({ Dashboard: { screen: Dashboard
尝试构建 react-native android 应用程序但出现以下错误 info Running jetifier to migrate libraries to AndroidX. You ca
我目前正在一个应用程序中实现 React Router v.4,我也在其中使用 Webpack 进行捆绑。在我的 webpack 配置中,我将 React、ReactDOM 和 React-route
我正在使用 React.children 渲染一些带有 react router 的子路由(对于某个主路由下的所有子路由。 这对我来说一直很好,但是我之前正在解构传递给 children 的 Prop
当我运行 React 应用程序时,它显示 export 'React'(导入为 'React')在 'react' 中找不到。所有页面错误 see image here . 最佳答案 根据图像中的错误
当我使用这个例子在我的应用程序上实现 Image-slider 时,我遇到了这个错误。 import React,{Component} from 'react' import {View,T
我是一名优秀的程序员,十分优秀!