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

React测试组件WillReceiveProps

昌学
2023-03-14

我是React.js的新手。在试图理解React中的生命周期时,我偶然发现了组件WillReceiveProps。即使我掌握了其他功能,我仍然无法确定组件是否会接收道具。我创建了一个小片段,每次单击按钮时,我都会递增变量“val”。当val变为5的倍数时,我想更改“递增”的值,但我无法这样做。

我的代码是:

var Increment = React.createClass({
  getInitialState: function() {
    return {val: 0, increasing: false};
  },
  componentWillMount: function() {
    console.log("componentWillMount");
  },
  componentDidMount: function() {
    console.log("componentDidMount");
  },
  handleClick: function() {
    console.log("inHandleClick");
    console.log(this.state.val);
    this.setState({val: (this.state.val+1)});
  },
  componentWillReceiveProps : function(nextProps) {
    this.setState({
      increasing: (nextProps.val > this.props.val)
    });
  },
  shouldComponentUpdate: function(nextProps, nextState) {
    return (nextState.val % 5 ==0)
  },

  render: function() {
    console.log(this.state.increasing);
    return (
      <div>
        <button onClick={this.handleClick}>{this.state.val}</button>
      </div>
    );
  }
});


ReactDOM.render(<Increment />, mountNode);

有线索吗?提前谢谢

共有1个答案

娄振
2023-03-14

看到这把小提琴了吗

var IncrementButton = React.createClass({
  componentWillReceiveProps : function(nextProps) {
    this.setState({
      increasing: (nextProps.val > this.props.val)
    });
  },
    render: function() {
    return (<button onClick={this.props.handleClick}>{this.props.val}</button>);
  }
});

var Increment = React.createClass({
  getInitialState: function() {
    return {val: 0, increasing: false};
  },
  handleClick: function() {
    console.log("inHandleClick");
    console.log(this.state.val);
    this.setState({val: (this.state.val+1)});
  },
  shouldComponentUpdate: function(nextProps, nextState) {
    return (nextState.val % 5 ==0)
  },
  render: function() {
    console.log(this.state.increasing);
    return (
      <div>
        <IncrementButton handleClick={this.handleClick} val={this.state.val}/>
      </div>
    );
  }
});

React.render(<Increment />, mountNode);

(感谢@Aaron在下面提供了更准确的描述)组件将接收道具组件道具设置好后调用;注意,即使道具的值没有变化,它也可能被调用(您似乎在使用大于支票时考虑到了这一点)。因为您想要比较props的新值和旧值,所以需要在组件外部管理状态。因此,在本示例中,我通过提取按钮将组件拆分为两部分。

 类似资料:
  • 英文原文:http://emberjs.com/guides/testing/testing-components/ 单元测试方案和计算属性与之前单元测试基础中说明的相同,因为Ember.Component集成自Ember.Object。 设置 在测试组件之前,需要确定测试应用的div已经加到测试的html文件中: 1 2 <!-- as of time writing, ID attribut

  • 问题内容: 使用此答案中的代码来解决在组件外部单击的问题: 我不知道如何对不愉快的道路进行单元测试,以使警报不会运行,到目前为止,我得到了什么: 我试过了: 通过发送 节点并发送通过(不模拟) 荷兰国际集团在元件内部(不触发事件侦听器) 我确定我缺少一些小东西,但是我在任何地方都找不到这样的例子。 问题答案: import { mount } from ‘enzyme’ import React

  • 使用此答案中的代码解决单击组件外部的问题: 我不知道如何对不愉快的路径进行单元测试,以使警报不运行,目前为止我得到了什么: 我尝试过: 通过

  • 在了解上面的一些React基本概念过后,我们就可以来使用TDD的思想来进行我们开发了。 Create React App默认使用Jest进行测试,所以你需要先安装jest-cli,进入到client根目录: $ npm install jest-cli@20.0.4 --save-dev 注意版本 在安装的时候最好和我这里的版本保持一致,因为其他的版本可能会有其他问题,就需要自己去踩坑了哦~~~

  • 问题内容: 什么是对React组件prop更新进行单元测试的正确方法。 这是我的测试装置; 这可以正常工作,并且测试通过了,但是显示了反应警告消息 我要测试的只是属性的更新,而不是使用其他属性创建元素的新实例。有没有更好的方法来执行此属性更新? 问题答案: AirBnB的酶库为这个问题提供了一个优雅的解决方案。 它提供了一个setProps方法,可以在浅包装或jsdom包装上调用该方法。