Ich mache reactjs, also muss ich ein Feld in away aktualisieren, das den Statuswechsel auslöst.Wie aktualisiert man ein Feld in Array von Json-Objekten?
Ich habe diese Nutzlast (zeige nur 1, aber es ist ein Array von vielen)
[
{
id: 1,
name: "Fridge2",
selected: true,
sharingId: 'ae9b9566-3b5c-4772-a0a1-07ed8b354b8f',
sharingWith: ["[email protected]", "[email protected]"],
storageItems: [
{
id: 'ae9b9564-3b5c-2711-a421-07ed8b354b8f',
name: 'Chicken Breats',
qty: 10,
expiresOn: '3',
category: 'Meat',
categoryId: 'BDEC0494-B16E-411B-8E32-A64A00E943F8',
unitType: 'Pieces',
unitTypeId: '63CDB076-C20D-4DC5-A181-A64A00E94409'
},
{
id: 'ae9b9566-3b5c-2711-a4a1-07ed8b354b8f',
name: 'Chicken Breats2',
qty: 10,
expiresOn: '0',
category: 'Meat',
categoryId: 'BDEC0494-B16E-411B-8E32-A64A00E943F8',
unitType: 'Pieces',
unitTypeId: '63CDB076-C20D-4DC5-A181-A64A00E94409'
},
{
id: 'ae9b9566-3b5c-2712-a0a1-07ed8b354b8f',
name: 'Chicken Breats3',
qty: 10,
expiresOn: '4',
category: 'Meat',
categoryId: 'BDEC0494-B16E-411B-8E32-A64A00E943F8',
unitType: 'Pieces',
unitTypeId: '63CDB076-C20D-4DC5-A181-A64A00E94409'
}
]
}
]
Ich möchte StorageItem finden, die eine ID übereinstimmt 'ae9b9564-3b5c-2711-a421-07ed8b354b8f' (erste eine in der Reihe)
Ich möchte es dann herausnehmen update das a-Feld (sprich Menge) kleben Sie es zurück und haben eine Zustandsänderung passieren.
Das war mein sehr schlechter 1. Versuch es zu tun. Es funktioniert nicht
case actions.STORAGE_ITEM_USED: {
var foundItem = state.selectedStorage.storageItems.filter(i => i.id == action.payload);
var newQty = foundItem[0].qty - 1;
foundItem[0].qty = newQty;
var nonChangedStorageItem = state.selectedStorage.storageItems.filter(i => i.id != action.payload);
var allItems = nonChangedStorageItem.concat(foundItem);
state.selectedStorage.storageItems = allItems;
return {
selectedStorage: state.selectedStorage,
}
}
bearbeiten
Ich habe das jetzt, aber ich sehe eine neue mögliche Antwort, die ich
var newSelectedStorage = Object.assign({} , state.selectedStorage);
var foundItem = newSelectedStorage.storageItems.filter(x => x.id == action.payload);
foundItem[0].qty = foundItem[0].qty - 1;
var nonChangedItems = newSelectedStorage.storageItems.filter(x => x.id != action.payload);
newSelectedStorage.storageItems = nonChangedItems.concat(foundItem);
webpack.config.js
module.exports = {
devtool: 'inline-source-map',
entry: "./app/index.js",
output: {
path: __dirname + '/dist',
filename: "bundle.js"
},
devServer: {
contentBase: "./app",
inline: true,
port: 3333
},
module: {
loaders: [
{
test: /\.jsx?$/,
loader: 'babel-loader',
exclude: /node_modules/,
query: {
presets: ['es2015', 'react']
}
},
{
test: /\.scss$/,
loaders: ['style', 'css', 'sass']
},
{
test: /\.woff($|\?)|\.woff2($|\?)|\.ttf($|\?)|\.eot($|\?)|\.svg($|\?)/,
loader: 'url-loader'
}
]
},
externals: {
jquery: 'jQuery'
},
}
Ich glaube, das Problem besteht darin, dass Sie das ursprüngliche Objekt mutieren und es dann zurückgeben. Redux erwartet, dass ein * neues * Objekt den Status vollständig überschreibt. Sie können möglicherweise mit "Object.assign" Ihren bestehenden Zustand verlassen, mutieren und ihn zurückgeben. – Scott
Neues Objekt für SelectedStorage Ich rate? – chobo2
Redux-Statushandler geben ein vollständig neues Zustandsobjekt zurück, daher muss sich die Referenz ändern. Es gibt einige Abkürzungen, um dies mit den Spread-Operatoren von ES6 wirklich einfach zu machen - Dan geht alles in [seinen Redux-Tutorials] durch (https://egghead.io/courses/getting-started-with-redux). – Scott