因此,我决定使用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

最佳答案

使用ImmutableJSReact.Component中管理状态是一个好主意(或方法)吗?
  


我不明白为什么这是一个坏主意。甚至在React docs中提到过。


  
  如果可以为此目的使用ImmutableJSthis.state应该是一个不变的对象吗?如果是,该如何处理this.setState()
  


这真的取决于你。使组件状态不变是有好处的(例如能够使用PureComponent并获得优化的性能)。

我不确定“与this.setState()交易”是什么意思。您将继续像往常一样使用它:获取状态,更新状态(从而获得一个新对象),并使用新对象调用setState


  
  如果不是这样,我就不能使用loadash,因为它不能与ImmutableJS一起使用,如何处理React.Component中的不可变状态?
  


您可以调用const myState = this.state.toJS()并使用lodash。只是不要尝试更改myState中的某些内容来更改组件的状态,因为那是行不通的。

如果我理解正确,我希望这能回答您的问题:)

08-19 23:17