I have a function I want to write in React. In my class I have a state object fields
that looks like this:
this.state = { step: 1, fields: { type: '', name: '', subtype: '', team: '', agreement: '' } };
I have various functions that assign those keys using immutability helper
that generally look like:
assignType(attribute) { var temp = update(this.state.fields, { type: {$set: attribute} }); this.setState({ fields: temp }); }
What I would like to do is use a function that's more generic and do something like this:
assignAttribute(field, attribute) { var temp = update(this.state.fields, { field: {$set: attribute} }); this.setState({ fields: temp }); }
But, this doesn't work. What can I do to use a variable key using immutability-helper
?
There is a helper function update from immutability-helper which eases the code involved in state updates. The function takes the original state object and another object which specify the state changes. The second parameter has the same hierarchy as the original state object.
In React, using an Immutable state enables quick and cheap comparison of the state tree before and after a change. As a result, each component decides whether to re-rendered or not before performing any costly DOM operations.
Immutable. js allows us to detect changes in JavaScript objects/arrays without resorting to the inefficiencies of deep equality checks, which in turn allows React to avoid expensive re-render operations when they are not required. This means Immutable.
Figured it out! I needed to use ES6 computed property names and simply edit assignAttribute
to:
assignAttribute(field, attribute) { var temp = update(this.state.fields, { [field]: {$set: attribute} }); this.setState({ fields: temp }); }
You can use the []
syntax if you have dynamic field names:
var data = {} data[field] = {$set: attribute} var temp = update(this.state.fields, data)
This gets a lot more concise if you can use ES6.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With