|
1 | | -# Helper functions |
| 1 | +from org.reactjs import createElement, useState, useEffect, useRef |
| 2 | +from org.reactjs.dom import render as react_render |
| 3 | + |
2 | 4 |
|
| 5 | +# Helper functions |
3 | 6 |
|
4 | 7 | def h(elm_type, props='', *args): |
5 | | - return React.createElement(elm_type, props, *args) |
| 8 | + return createElement(elm_type, props, *args) |
6 | 9 |
|
7 | 10 |
|
8 | 11 | def render(react_element, destination_id, callback=lambda: None): |
9 | 12 | container = document.getElementById(destination_id) |
10 | | - ReactDOM.render(react_element, container, callback) |
| 13 | + react_render(react_element, container, callback) |
11 | 14 |
|
12 | 15 |
|
13 | | -# Create a component |
| 16 | +def useInterval(func, delay=None): |
| 17 | + # can be used as `useInterval(func, delay)` |
| 18 | + # or as `@useInterval(delay)` |
| 19 | + if delay is None: |
| 20 | + delay = func |
| 21 | + return lambda fn: useInterval(fn, delay) |
14 | 22 |
|
| 23 | + ref = useRef(func) |
| 24 | + ref.current = func |
15 | 25 |
|
16 | | -Hello = React.createClass({ |
17 | | - 'displayName': 'Hello', |
| 26 | + @useEffect.withDeps(delay) |
| 27 | + def setup(): |
| 28 | + id = setInterval(lambda: ref.current(), delay) |
| 29 | + return lambda: clearInterval(id) |
18 | 30 |
|
19 | | - 'getInitialState': lambda: {'counter': 0}, |
| 31 | + return func |
20 | 32 |
|
21 | | - 'updateCounter': lambda: (this.setState({'counter': this.state['counter']+1})), |
22 | 33 |
|
23 | | - 'componentDidMount': lambda: (setInterval(this.updateCounter, 1000)), |
| 34 | +# Create a component |
24 | 35 |
|
25 | | - 'render': lambda: h('div', {'className': 'maindiv'}, |
26 | | - h('h1', None, 'Hello ', this.props['name']), |
27 | | - h('p', None, 'Lorem ipsum dolor sit ame.'), |
28 | | - h('p', None, 'Counter: ', this.state['counter']) |
29 | | - ) |
30 | | -}) |
| 36 | +def Hello(props): |
| 37 | + count, setCount = useState(0) |
| 38 | + |
| 39 | + @useInterval(1000) |
| 40 | + def updateCounter(): |
| 41 | + setCount(count+1) |
| 42 | + |
| 43 | + return h( |
| 44 | + 'div', |
| 45 | + {'className': 'maindiv'}, |
| 46 | + h('h1', None, 'Hello ', props['name']), |
| 47 | + h('p', None, 'Lorem ipsum dolor sit ame.'), |
| 48 | + h('p', None, 'Counter: ', count), |
| 49 | + h( |
| 50 | + 'button', |
| 51 | + {'onClick': updateCounter}, |
| 52 | + 'Increment', |
| 53 | + ) |
| 54 | + ) |
31 | 55 |
|
32 | 56 |
|
33 | 57 | # Render the component in a 'container' div |
|
0 commit comments