因此,我决定使用ImmutableJS与Redux一起使用。现在我想知道使用它来管理React Component state
是否方便。我编写了以下代码:
class Navigation extends React.Component {
constructor(props) {
super(props);
const $$fixedLinks = Immutable.fromJS(this.props.fixedLinks);
const $$dynamicLinks = Immutable.fromJS(this.props.dynamicLinks);
this.state = {
fixedLinks: this.addHrefs($$fixedLinks),
dynamicLinks: this.addHrefs($$dynamicLinks),
};
}
// Given a list of shape (id, name) we need to
// add href for the links
addHrefs = list => list.map(item => item.set('href', toUnderscore(item.get('name'))))
render() {
const fixed = this.state.fixedLinks.map(
link => (
<Link key={link.get('id')} href={`#${link.get('href')}`} title={link.get('name')} />
),
);
const dynamic = this.state.dynamicLinks.map(
link => (
<Link key={link.get('id')} href={`#${link.get('href')}`} title={link.get('name')} />
),
);
return (
<Anchor>
{fixed}
{dynamic}
</Anchor>
);
}
}
如您所见,
$$
表示一个不变的对象。但是然后我想使用addHrefs
向其添加新属性并将其保存到state
。它像魅力一样运作。但是以下内容有点笨拙:
<Link key={link.get('id')} href={`#${link.get('href')}`} title={link.get('name')} />
看到?使用
get()
从不可变对象获取值。现在,一些问题:
使用
ImmutableJS
进行管理是否是一个好主意(或方法)在
React.Component
中声明?如果我可以为此目的使用
ImmutableJS
,则this.state
应该是一个不变的对象?如果是,该如何处理
this.setState()
?如果不是这样,我就不能使用
loadash
,因为它不能用于ImmutableJS
,我该如何处理内部的不可变状态React.Component
? 最佳答案
使用ImmutableJS
在React.Component
中管理状态是一个好主意(或方法)吗?
我不明白为什么这是一个坏主意。甚至在React docs中提到过。
如果可以为此目的使用ImmutableJS
,this.state
应该是一个不变的对象吗?如果是,该如何处理this.setState()
?
这真的取决于你。使组件状态不变是有好处的(例如能够使用PureComponent
并获得优化的性能)。
我不确定“与this.setState()
交易”是什么意思。您将继续像往常一样使用它:获取状态,更新状态(从而获得一个新对象),并使用新对象调用setState
。
如果不是这样,我就不能使用loadash
,因为它不能与ImmutableJS
一起使用,如何处理React.Component
中的不可变状态?
您可以调用const myState = this.state.toJS()
并使用lodash。只是不要尝试更改myState
中的某些内容来更改组件的状态,因为那是行不通的。
如果我理解正确,我希望这能回答您的问题:)