Javascript 如何将对象属性添加到状态中的另一个属性?
我正在我的react redux应用程序中设置操作和还原。我需要一个函数来更新状态中的属性并将对象添加到其列表中,如果可能的话,可以使用扩展语法。以下是我目前掌握的情况:Javascript 如何将对象属性添加到状态中的另一个属性?,javascript,reactjs,ecmascript-6,redux,Javascript,Reactjs,Ecmascript 6,Redux,我正在我的react redux应用程序中设置操作和还原。我需要一个函数来更新状态中的属性并将对象添加到其列表中,如果可能的话,可以使用扩展语法。以下是我目前掌握的情况: const defaultState = { genres: {} } export default function(state = defaultState, action) { switch(action.type) { case 'ADD_GENRE': return {
const defaultState = {
genres: {}
}
export default function(state = defaultState, action) {
switch(action.type) {
case 'ADD_GENRE':
return {
...state,
genres[action.name]: action.list //new code here
}
default:
return state;
}
}
我需要像使用属性名的数组一样动态访问“流派”属性,如下所示:
const getMusicFromGenre = (genre) => {
return state.genres[genre];
}
减速器应接受以下操作,然后相应地修改状态:
// action
{
type: 'ADD_GENRE,
name: 'Rock',
list: ['Bohemian Rhapsody', 'Stairway to Heaven', 'Hotel California']
}
// old state
{
genres: {
"Pop": ['Billie Jean', 'Uptown Funk, 'Hey Jude']
}
}
// new state
{
genres: {
"Pop": ['Billie Jean', 'Uptown Funk, 'Hey Jude'],
"Rock": ['Bohemian Rhapsody', 'Stairway to Heaven', 'Hotel California']
}
}
如果有必要,我愿意使用不同的方法。您的方法是正确的,但需要分别处理每一层嵌套。下面是我为之编写的一个示例:
您可能还想阅读我在和上链接的一些关于不可变数据处理的文章。您的思路是正确的,但需要分别处理每一级别的嵌套。下面是我为之编写的一个示例: 您可能还想阅读我在和上链接的一些关于不可变数据处理的文章。是进行状态更新的非常有用的库。在您的情况下,它将像这样使用,如果没有现有项,它将创建一个新的数组;如果有预先存在的项,则使用操作的列表连接现有项:
import update from 'immutability-helper';
const defaultState = {
genres: {}
}
const createOrUpdateList = (prev, list) => {
if (!Array.isArray(prev)) {
return list;
}
return prev.concat(list);
// or return [...prev, ...list] if you prefer
}
export default function(state = defaultState, action) {
switch(action.type) {
case 'ADD_GENRE':
return update(state, {
genres: {
[action.name]: {
$apply: prev => createOrUpdate(prev, action.list)
}
}
});
default:
return state;
}
}
是一个非常有用的库,用于执行状态更新。在您的情况下,它将像这样使用,如果没有现有项,它将创建一个新的数组;如果有预先存在的项,则使用操作的列表连接现有项:
import update from 'immutability-helper';
const defaultState = {
genres: {}
}
const createOrUpdateList = (prev, list) => {
if (!Array.isArray(prev)) {
return list;
}
return prev.concat(list);
// or return [...prev, ...list] if you prefer
}
export default function(state = defaultState, action) {
switch(action.type) {
case 'ADD_GENRE':
return update(state, {
genres: {
[action.name]: {
$apply: prev => createOrUpdate(prev, action.list)
}
}
});
default:
return state;
}
}
这是一个有用的插件,使代码更易于查看。谢谢这是一个有用的插件,使代码更容易查看。谢谢,我自己也在努力寻找解决方案,但这个问题太难了,无法用谷歌搜索。谢谢你的链接,我肯定会在明天喝一大杯咖啡的时候读到这篇文章。我自己也在努力寻找解决方案,但是这个问题太难了,谷歌无法解决。谢谢你的链接,明天一定会在喝一大杯咖啡的时候读到