ReactCompositeComponentNestedState-test.jsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import PropTypes from '../../lib/ReactPropTypes';
  2. import ReactTestUtils from "../../lib/ReactTestUtils";
  3. import React from '../../src/May';
  4. import { render, unmountComponentAtNode, findDOMNode } from '../../src/may-dom/MayDom'
  5. var ReactDOM = {
  6. render: render,
  7. unmountComponentAtNode: unmountComponentAtNode,
  8. findDOMNode: findDOMNode
  9. }
  10. React.render = render;
  11. // import React from "../../dist/ReactANU";
  12. // var ReactDOM = React;
  13. // var ReactTestUtils = { Simulate: {} };
  14. // "click,change,keyDown,keyUp,KeyPress,mouseDown,mouseUp,mouseMove".replace(/\w+/g, function (name) {
  15. // ReactTestUtils.Simulate[name] = function (node, opts) {
  16. // if (!node || node.nodeType !== 1) {
  17. // throw "第一个参数必须为元素节点";
  18. // }
  19. // var fakeNativeEvent = opts || {};
  20. // fakeNativeEvent.target = node;
  21. // fakeNativeEvent.simulated = true;
  22. // fakeNativeEvent.type = name.toLowerCase();
  23. // React.eventSystem.dispatchEvent(fakeNativeEvent, name.toLowerCase());
  24. // };
  25. // });
  26. //https://github.com/facebook/react/blob/master/src/isomorphic/children/__tests__/ReactChildren-test.js
  27. describe("ReactCompositeComponentNestedState-state", function() {
  28. //this.timeout(200000);
  29. it('should provide up to date values for props', () => {
  30. class ParentComponent extends React.Component {
  31. state = {color: 'blue'};
  32. handleColor = color => {
  33. this.props.logger('parent-handleColor', this.state.color);
  34. this.setState({color: color}, function() {
  35. this.props.logger('parent-after-setState', this.state.color);
  36. });
  37. };
  38. render() {
  39. this.props.logger('parent-render', this.state.color);
  40. return (
  41. <ChildComponent
  42. logger={this.props.logger}
  43. color={this.state.color}
  44. onSelectColor={this.handleColor}
  45. />
  46. );
  47. }
  48. }
  49. class ChildComponent extends React.Component {
  50. constructor(props) {
  51. super(props);
  52. props.logger('getInitialState', props.color);
  53. this.state = {hue: 'dark ' + props.color};
  54. }
  55. handleHue = (shade, color) => {
  56. this.props.logger('handleHue', this.state.hue, this.props.color);
  57. this.props.onSelectColor(color);
  58. this.setState(
  59. function(state, props) {
  60. this.props.logger(
  61. 'setState-this',
  62. this.state.hue,
  63. this.props.color,
  64. );
  65. this.props.logger('setState-args', state.hue, props.color);
  66. return {hue: shade + ' ' + props.color};
  67. },
  68. function() {
  69. this.props.logger(
  70. 'after-setState',
  71. this.state.hue,
  72. this.props.color,
  73. );
  74. },
  75. );
  76. };
  77. render() {
  78. this.props.logger('render', this.state.hue, this.props.color);
  79. return (
  80. <div>
  81. <button onClick={this.handleHue.bind(this, 'dark', 'blue')}>
  82. Dark Blue
  83. </button>
  84. <button onClick={this.handleHue.bind(this, 'light', 'blue')}>
  85. Light Blue
  86. </button>
  87. <button onClick={this.handleHue.bind(this, 'dark', 'green')}>
  88. Dark Green
  89. </button>
  90. <button onClick={this.handleHue.bind(this, 'light', 'green')}>
  91. Light Green
  92. </button>
  93. </div>
  94. );
  95. }
  96. }
  97. var container = document.createElement('div');
  98. document.body.appendChild(container);
  99. var list = []
  100. function logger(){
  101. list.push([].slice.call(arguments, 0))
  102. }
  103. void ReactDOM.render(<ParentComponent logger={logger} />, container);
  104. // click "light green"
  105. ReactTestUtils.Simulate.click(container.childNodes[0].childNodes[3]);
  106. //console.log(JSON.stringify(logger.calls))
  107. expect(list).toEqual([
  108. ['parent-render', 'blue'],
  109. ['getInitialState', 'blue'],
  110. ['render', 'dark blue', 'blue'],
  111. ['handleHue', 'dark blue', 'blue'],
  112. ['parent-handleColor', 'blue'],
  113. ['parent-render', 'green'],
  114. ['setState-this', 'dark blue', 'blue'],
  115. ['setState-args', 'dark blue', 'green'],
  116. ['render', 'light green', 'green'],
  117. ['parent-after-setState', 'green'],
  118. ['after-setState', 'light green', 'green']
  119. ]);
  120. });
  121. });