У меня проблема с моим кодом. В настоящее время у меня есть некоторые данные, подобные приведенным ниже;
users: [
{
name: 'bolu',
features: ['Tall'],
},
{
name: 'cam',
features: ['Bearded', 'Short'],
},
],
};
То, что я пытаюсь сделать, это удалить/удалить одну функцию, например, если я передам «коротко» в свое действие с сокращением. Я бы хотел, чтобы он («Краткий» текст) был удален из массива функций. В настоящее время у меня настроено действие redux следующим образом:
export interface UsersDataState {
name: string,
features: Array<string>,
}
export interface UsersState {
users: UsersDataState[];
}
const initialState: UsersState = {
users: [],
};
export const usersSlice = createSlice({
name: 'users',
initialState,
reducers: {
removeUser: (state, action: PayloadAction<string>) => {
const removedUsers = state.users.filter((user) => user.features.indexOf(action.payload));
state.users = removedUsers;
},
},
});
Итак, здесь я передаю значение (action.payload
— это передаваемое значение). Когда это действие отправлено, я хочу удалить только переданное слово из массива функций. Я надеюсь, что теперь это более ясно.
Это не работает по какой-то причине, и я не могу понять, почему. Любая помощь будет оценена, пожалуйста, спасибо.
Привет, @Andy, только что отредактировал. Дайте мне знать, если это все еще не ясно.
Что в action.payload и removeUsers? Можете выложить console.info или отладчик?
Спасибо @Энди! ?
Ваш код не соответствует вашей структуре состояния. Замените traits
на users
, а values
на features
.
Похоже, это часть редуктора, а не действия (это объект, а не функция).
Вы должны возвращать новое состояние из редуктора.
Учитывая ваше обновление, функция должна называться removeFeature
.
Итак, я исправил несколько фрагментов вашего кода на основе того, что я помню из Redux. Примечание: надуманный пример.
// State
const state = {users:[{name:"joe",features:["Mean","Short"]},{name:"bolu",features:["Tall"]},{name:"cam",features:["Bearded","Short"]}]};
// The reducer accepts a state, and an action
function reducer(state, action) {
// We destructure the type, and payload, from the action object
const { type, payload } = action;
// Depending on the type...
switch (type) {
case 'removeFeature': {
// `map` over the users (we return a new state array)
return state.users.map(user => {
// `filter` out the feature elements
// that match the payload
const updatedFeatures = user.features.filter(feature => {
return feature !== payload;
});
// Return a new updated object
return { ...user, features: updatedFeatures };
});
}
default: return state;
}
}
const updatedState = reducer(state, {
type: 'removeFeature',
payload: 'Short'
});
console.info(updatedState);
Ваш код на самом деле не отражает ваше состояние. Что такое
state.traits
? Где собственность пользователяvalues
? Вы пытаетесь удалить всего пользователя, если в массивеfeatures
встречается слово «Short» или только это слово? Кроме того, это не действие. Это редуктор, и он должен возвращать состояние из функции.