我想从我的redux状态中删除一个元素。我使用无缝不可变及其API对状态进行操作。但是我找不到在嵌套状态时删除元素的任何好方法。
所以我要删除的元素是: state.shoppingcartReducer.products[articleNr]
谢谢!
import Immutable from 'seamless-immutable'
import { addToShoppingcart, createShoppingCart } from '../actions/shoppingcartActions'
const CREATE_SHOPPING_CART = 'CREATE_SHOPPING_CART'
const ADD_PRODUCT = 'ADD_PRODUCT'
const DELETE_PRODUCT = 'DELETE_PRODUCT'
const UPDATE_QUANTITY = 'UPDATE_QUANTITY'
const SUMMARY = 'SUMMARY'
const initialState = Immutable({
summary: {
sum: 0,
quantity: 0
}
})
export default function shoppingcartReducer(state = initialState, action) {
switch (action.type) {
case ADD_PRODUCT:
return state
.setIn(['products', action.product.articleNr], addArticle(action))
// case DELETE_PRODUCT:
// return ??
case SUMMARY:
return state
.set('summary', calculateSums(action, state))
case CREATE_SHOPPING_CART:
return state
.set(action.id, createCart(action))
case UPDATE_QUANTITY:
return state.
set('summary', calculateQuantity(action, state))
}
return state
}
function addArticle(action) {
return {
product: action.product
}
}
function calculateQuantity(action, state) {
return {
quantity: state.summary.quantity + action.quantity
}
}
function calculateSums(action, state) {
return {
sum: state.summary.sum + action.price,
quantity: state.summary.quantity + action.quantity
}
}
function calculateSumsDelete(action, state) {
return {
sum: state.summary.sum - action.product.price,
quantity: state.summary.quantity - action.product.quantity
}
}
function createCart(action) {
return {
id: action.id,
}
}
有时我也陷入了类似情况。
因此,根据redux
docs
,更新嵌套对象的方式是:-
function updateVeryNestedField(state, action) {
return {
....state,
first : {
...state.first,
second : {
...state.first.second,
[action.someId] : {
...state.first.second[action.someId],
fourth : action.someValue
}
}
}
}
}
但是由于数组处于状态,这会使您的工作更加困难。
因此,有两种方法可以执行此操作。
第一种方式(困难的方式)
自己创建一个新对象并更新状态并返回新状态。现在,这里的键可以创建一个新的状态对象,而不将当前状态分配给该新对象,否则它将被突变。
因此,创建一个新对象。
const newState ={}
现在,为您分配不想更改为新状态的当前状态值。假设在你的状态,你有3个按键,key1
,key2
你不想要这个动作变化,shoppingCardReducer
要改变。
newState['key1']=//key1 value from current state
newState['key2'] = //key2 value from current state
现在,尝试以下操作:-
newState['shoppingCardReducer'] ={}
newState['shoppingCardReducer']['products']={}
现在阅读state.shoppingReducers.products
并循环遍历产品数组,并从状态中替换该特定元素,保持完好无损。
然后返回新状态(您应保留其余属性不变,否则应用可能会中断)
如果您发现这显然是一种不好的方法,而不是真正的hack,那么reducer与传播运算符会做同样的事情,但肯定是一种不好的方法,所以我会说尝试下一个选项。
第二种方式(immutablejs)
我建议您使用immutable.js。它真的很容易使用。
使用不可变,您可以使用deleteIn
函数从状态中删除特定的特定产品元素。
data.deleteIn(["shoppingcartReducer",product,//your_to_deleted_element_index])
PS:我还没有尝试上面的代码,但稍加修改就可以了。希望您能理解。
第三种方法(Normalizr)
您也可以尝试使用make
标准化您的API响应,以使数据平坦并可以访问。
但是在以上三个中,我认为不变是最好的选择。
我的mongo数据库中有: 我想从这个数组中删除on元素。我用的是golang和mgo。v2驱动程序,下面是我的代码: 它继续成功,但不删除项目时,我检查mongob。有人能告诉我我做错了什么吗?谢谢你们
我正在尝试学习React(使用redux),所以我正在制作一个应用程序,在其中我可以创建训练计划,将训练添加到计划中,然后将训练添加到训练中。 PlanListComponent 我的PlansList组件为每个计划呈现一张卡片。在这张卡片中,它为该计划中的每个训练呈现一个训练列表。将训练添加到计划后,“计划列表”组件不会重新渲染。添加的训练仅在我刷新页面后显示。我之所以选择这种情况,是因为我必须
问题内容: 我试图找到在组件状态下从数组中删除元素的最佳方法。由于我不应该直接修改变量,是否有比我在这里有更好的方法(更简洁)从数组中删除元素?: 谢谢。 更新 这已更新为在setState中使用回调。在更新当前状态时,应执行此操作。 问题答案: 我见过的最干净的方法是:
问题内容: 我有一个具有与组件本身相同类型的子组件的组件。我也可以渲染孩子,但是孩子似乎无法访问他们的状态。我在Redux中使用React 另外,我正在使用Material-ui中的ListItem(它们最终呈现在List组件中),并且我的代码受到官方redux回购中的树视图示例的严重影响。我的状态如下所示: 所示状态与树状示例中的状态相同 问题答案: 好吧,如果我理解正确,那么您希望这些组件从r
我不熟悉promise和使用NodeJS中的请求和promise编写网络代码。 我想删除这些嵌套的promise,并将它们链接起来,但我不确定该如何做/这是否是正确的方式。 这是请求代码: 如有任何见解,将不胜感激。
我正在使用ElasticSearch5.4,试图从嵌套数据类型中删除一个元素。 我有以下映射: 我在《邮递员》中尝试过以下内容: localhost:9200/asset/bookmark/20976/_update?pretty 但我得到以下错误: 我在StackOverflow[1][2]的几个不同问题中遵循了这些建议,但没有成功。 嵌套对象是有效的,因为我已经用数据填充了它。此外,值也是有效