2015-06-17 4 views
24

https://facebook.github.io/react/docs/update.htmlDynamische Schlüssel in Update Helfer Unveränderlichkeit für Array

Ich habe eine Update-Funktion, die einen Index zusammen mit dem Ereignis empfängt, um den Wert für das jeweilige Element im Array zu ändern.

Wie bekomme ich index, um in diesem Szenario als Set-Schlüssel behandelt zu werden, anstatt als behandelt zu werden? Ist es überhaupt möglich?

updateValue: function(index, e) { 
    var items = React.addons.update(this.state.items, { 
    index: { 
    amount: {$set: e.target.value} 
    } 
    }); 
    this.setState({ 
    items: items 
    }) 
} 

Rechts dies jetzt offensichtlich nicht funktioniert, weil es this.state.items['index']['amount'] zu aktualisieren ist versucht, die nicht gesetzt ist, wenn ich könnte this.state.items[1]['amount'] für einen Index von 1.

Antwort

35

Sie ES6 computed property names, verwenden Sie ändern möchten, die aussehen würde wie dies mit Ihrem index Variable:

updateValue(index, e) { 
    var items = React.addons.update(this.state.items, { 
    [index]: { 
     amount: {$set: e.target.value} 
    } 
    }) 
    this.setState({items}) 
} 

nach dieser ES6 compatability table, unterstützt sie JSX Transpiler die reagieren, wenn seine Harmony Transformationen aktiviert sind, oder Sie könntenverwendenstattdessen (seit react-tools is being deprecated in favour of Babel sowieso).

dass Andernfalls könnten Sie eine Hilfsfunktion verwenden, um ein Objekt mit einer bestimmten benannte Eigenschaft zu erstellen:

function makeProp(prop, value) { 
    var obj = {} 
    obj[prop] = value 
    return obj 
} 

// ... 

updateValue: function(index, e) { 
    var items = React.addons.update(this.state.items, makeProp(
    index, { 
     amount: {$set: e.target.value} 
    } 
)) 
    this.setState({items: items}) 
} 
+0

Vielen Dank für die ausführliche Antwort. Ich benutze den Edelstein [react-rails] (https://github.com/reactjs/react-rails) und obwohl ich das Harmony-Flag wie dokumentiert aktiviert habe und dafür sorge, dass die [berechnete Eigenschaft Transformation unterstützt wird] (https: // github .com/facebook/jstransform/blob/master/visitors/es6-object-computed-property-visitors.js), bekomme ich diesen Fehler 'Uncaught SyntaxError: Unexpected token [', also bleibe ich bei der Hilfsmethode bis sie schicke es mit Babel. – tirdadc

+2

Ich bin durch das Beispiel der Hilfsfunktion verwirrt. 'this.state.items' ist ein Array und Sie aktualisieren es auf' {1: {betrag: $ set: e.target.value}} '. Ich lerne immer noch, wie das Update-Addon funktioniert, aber scheint mir, das sollte nicht funktionieren. Angenommen, es funktioniert irgendwie, hätte er nicht einfach 'update (this.state.items [index], {betrag: {$ set: e.target.value}})' '? Hat update einen speziellen Fall für Arrays, der dies ermöglicht? – crush