Skip to content

批量更新

司徒正美 edited this page Apr 13, 2018 · 1 revision
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <script type='text/javascript' src="./dist/React.js"></script>
    <script type='text/javascript' src="./lib/ReactTestUtils.js"></script>
    <script type='text/javascript' src="./lib/babel.js"></script>

</head>

<body>
    <pre>React 15 </pre>
    <div id='root' class="root">

    </div>
    <script type='text/babel'>
        
        var container = document.getElementById('root');
          var div = container;
          if (!window.ReactDOM) {
              window.ReactDOM = React;
          }
          var expect = function(a) {
              return {
                  toBe: function(b) {
                      console.log(a, 'vs', b, a === b);
                  },
                  toEqual(b) {
                      console.log(a, 'vs', b, a + '' === b + '');
                  }
              };
         };
let updateCount = 0;

class Component extends React.Component {
  state = {x: 0};

  componentDidUpdate() {
    updateCount++;
  }

  render() {
    return <div onClick={(e)=>{
        this.setState({x: 1})
        this.setState({x: 2})
    }
        
    }>{this.state.x}</div>;
  }
}

const instance = ReactDOM.render(<Component />, container);
const node = ReactDOM.findDOMNode(instance)
node.click()
expect(instance.state.x).toBe(2)
expect(updateCount).toBe(1)
    </script>


</html>

批量更新

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <script type='text/javascript' src="./dist/React.js"></script>
    <script type='text/javascript' src="./lib/ReactTestUtils.js"></script>
    <script type='text/javascript' src="./lib/babel.js"></script>

</head>

<body>

    <pre>React 15 </pre>


    <div id='root' class="root">

    </div>
    <script type='text/babel'>
        
        var container = document.getElementById('root');
          var div = container;
          if (!window.ReactDOM) {
              window.ReactDOM = React;
          }
          var expect = function(a) {
              return {
                  toBe: function(b) {
                      console.log(a, 'vs', b, a === b);
                  },
                  toEqual(b) {
                      console.log(a, 'vs', b, a + '' === b + '');
                  }
              };
         };
let updateCount = 0;
class Component extends React.Component {
  state = {x: 0};

  componentDidUpdate() {
    updateCount++;
  }

  render() {
    return <div>{this.state.x}</div>;
  }
}

const instance = ReactDOM.render(<Component />, container);
expect(instance.state.x).toBe(0);

ReactDOM.unstable_batchedUpdates(function() {
    instance.setState({x: 1});
    instance.setState({x: 2});
    expect(instance.state.x).toBe(0)
    expect(updateCount).toBe(0);
});

expect(instance.state.x).toBe(2);
expect(updateCount).toBe(1);

    </script>


</html>