当前位置: 首页 > 知识库问答 >
问题:

在react js中使用不可变js时使用PropTypes

晋承嗣
2023-03-14

我在React中使用了不可变的js和react-im身不由己的角色类型。

// CommentBox.jsx
getInitialState() {
    return {
        comments: Immutable.List.of(
            {author: 'Pete Hunt', text: 'Hey there!'},
            {author: 'Justin Gordon', text: 'Aloha from @railsonmaui'}
        )
    };
},
render(){
    console.log(this.state.comments.constructor);
    return (
      <div className='commentBox container'>
        <h1>Comments</h1>
        <CommentForm url={this.props.url} />
        <CommentList comments={this.state.comments} />
      </div>
    );
}


// CommentList.jsx
propTypes: {
    comments: React.PropTypes.instanceOf(Immutable.List),
},

// CommentStore.js
handleAddComment(comment) {
    this.comments.push(comment);
}

当页面初始化时,没有问题,一切正常,没有警告。控制台日志显示注释功能列表(值)。当我添加一条新评论时,它看起来效果不错,但有一个警告

警告:失败的propType:提供给CommentList的prop注释无效,应为列表的实例。检查CommentBox的渲染方法。

控制台日志显示注释函数数组()。那么,为什么注释构造函数从列表更改为数组

我读过http://facebook.github.io/react/docs/advanced-performance.html#immutable-js-and-flux.

消息存储可以使用两个列表跟踪用户和消息:

this.users = Immutable.List();
this.messages = Immutable.List();

实现处理每种负载类型的函数应该非常简单。例如,当存储看到表示新消息的有效负载时,我们可以创建一条新记录并将其附加到消息列表中:

this.messages = this.messages.push(new Message({
  timestamp: payload.timestamp,
  sender: payload.sender,
  text: payload.text
});

请注意,由于数据结构是不可变的,因此我们需要将push函数的结果分配给它。信息。


共有2个答案

郎飞龙
2023-03-14

您可以指定自定义验证器。

propName: function(props, propName, componentName) {
  if (!List.isList(props[propName]) && !Array.isArray(props[propName])) {
    return new Error(
      'Invalid prop `' + propName + '` supplied to' +
      ' `' + componentName + '`. Validation failed.'
    );
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.min.js"></script>
马星阑
2023-03-14

我来这里是想找到一个解决方案,让来自ImmutableJS的数组或任何类型的iterable对象作为道具传递。如果其他人觉得这很有用,下面是我的想法:

PropTypes.oneOfType([
  PropTypes.instanceOf(Array),
  PropTypes.instanceOf(Immutable.Iterable)
]).isRequired
 类似资料:
  • 关于如何使用以及它与和的区别,有大量的博客和帖子,但关于何时或为什么应该使用的例子很少 我发现许多给出的例子都是非常罕见的,比如: 我不知道什么时候我想让一个函数等于其他变量,并使用那个变量代替原始函数,更不用说那个变量等于对象实例的绑定了。 有什么好的例子吗?

  • Redux framework正在使用reducers来更改应用程序状态以响应操作。 关键要求是缩减器不能修改现有的状态对象;它必须产生一个新的对象。 错误示例: 好例子: 这是一个很好的Immutable.js.用例

  • 对于标准JS对象,可以使用解构赋值,例如: 正如一些Flux/Redux传教士所建议的,我使用immutable。我的应用程序的js;我可以在不可变列表/映射上也使用解构吗?当然,我们可以做到: 但是,随着对象变得越来越大,这似乎效率很低(因为首先需要对对象进行深度JS化)。

  • 问题内容: 好吧,这可能是一个愚蠢的问题,但我想澄清原因。React- Native导入了nodeJS库,因此尽管reactJS包含纯HTML组件,但我认为也可以使用reactJS库。 React Native可以识别包括HTML的reactJS组件吗? 问题答案: 库实际上没有与浏览器DOM HTML相关的任何内容。与它相关的所有内容都被打包。React Native不会也不能使用此库,因为您在

  • 问题内容: 我是ReactJS的新手。以前,我使用jQuery设置所需的任何动画或功能。但是现在我正在尝试使用ReactJS并最小化jQuery的使用。 我的情况是: 我正在尝试使用ReactJS构建手风琴。 使用JQuery : 我的问题: 我该如何使用ReactJS? 问题答案: 您应该尝试避免在ReactJS中使用jQuery。但是,如果您真的想使用它,则可以将其放入组件的component

  • 问题内容: 为了使一类不变,我可以做的是: 1)将类设为final 2)不提供设置器 3)将所有变量标记为final 但是,如果我的班级有另一个班级的另一个对象,那么somone可以更改该对象的值 问题答案: A)也使不可变 要么 B)不允许直接访问对象,而是仅提供获取器以充当代理。 编辑添加: 您 可以 制作一个深层副本并返回一个副本,而不是原始副本,但这通常不是您在Java中期望的行为类型。