这是我的状态
const initState = [
{
id: 1,
criteria: [],
isInclusion: true,
},
{
id: 2,
criteria: [],
isInclusion: true,
},
];
我正在尝试使用dispatch
dispatch(
addCriteria({
id: item.id,
type: item.type,
groupId: 1,
})
);
在reducer
中,我执行以下操作,但是它不会添加到现有组的数组中,而是将其作为新对象添加到其中添加了该条件的数组中。
const addReducer = (state = initState, action) => {
switch (action.type) {
case QUERYGROUPS.ADD_CRITERIA: {
const newCriteria = {
id: action.payload.id,
type: action.payload.type,
};
const newState = [
...state,
state.map(group =>
group.id === action.payload.groupId
? {
...group,
criteria: newCriteria,
}
: group
),
];
return newState;
}
}
};
答案 0 :(得分:3)
您正在使用... state将所有项目添加到状态对象(也是您要修改的项目),然后再次对其进行映射。这是行不通的。
您应该将状态对象更改为通过引用而不是索引访问项目的对象,并使用id作为访问权限。这也会更快(感谢@Yash Joshi):
navController = findNavController(MainActivity.this, R.id.navHostFragment);
navController.addOnDestinationChangedListener(this);
@Override
public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
int destinationId = destination.getId();
if (destinationId == R.id.YOUR_DESIRED_FRAGMENT_ID) // your own behavior...
}
这将使您更轻松地访问和更新状态,更容易保持不变。 这样您可以像这样更新它:
const initState = {
1: {
criteria: [],
isInclusion: true,
},
2: {
criteria: [],
isInclusion: true,
},
};
要向其中添加新项目:
case QUERYGROUPS.ADD_CRITERIA: {
const newCriteria = {
id: action.payload.id,
type: action.payload.type,
};
const newState = {
...state,
[action.payload.groupId]: {
...state[action.payload.groupId],
criteria: [
...state[action.payload.groupId].criteria,
newCriteria
],
}
};
return newState;
希望这会有所帮助。编码愉快。
答案 1 :(得分:0)
尝试点差运算符(es6):
return [
...state,
newCriteria,
]
这将返回一个带有newCriteria
对象的新数组。
答案 2 :(得分:0)
这是我要怎么做:
WITH cte AS (
--your code and add rownumber column
seq = ROW_NUMBER() OVER(PARTITION BY PRESCRIPTIONID, Antibiotic_Prescribed ORDER BY PRESCRIPTIONID)
)
SELECT * from cte where seq = 1
答案 3 :(得分:0)
我认为您应该遵循Domino987的方法,这样会更快。但是,如果您仍然希望继续使用您的方法。您可以尝试以下方法:
const newState = state.map(item => item.id === newItem.id ? ({ ...item, ...newItem }) : item );
return newState;
希望这会有所帮助!