Skip to content

Commit 5cf5324

Browse files
authored
Merge pull request #686 from happy-monk/react-hooks
React Demo with hooks
2 parents 38726e1 + c93996f commit 5cf5324

File tree

4 files changed

+79
-17
lines changed

4 files changed

+79
-17
lines changed

transcrypt/demos/react_demo/react_demo.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<head>
44
<meta charset="UTF-8" />
55
<title>Hello React!</title>
6-
<script src="https://fb.me/react-with-addons-15.1.0.min.js"></script>
7-
<script src="https://fb.me/react-dom-15.1.0.min.js"></script>
6+
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
7+
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
88
<style>
99
body {font-family:arial;font-size:30px;padding:50px;background-color:#eeeeee;}
1010
h1 {font-size:50px;color:#0000ff;}

transcrypt/demos/react_demo/react_demo.py

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,57 @@
1-
# Helper functions
1+
from org.reactjs import createElement, useState, useEffect, useRef
2+
from org.reactjs.dom import render as react_render
3+
24

5+
# Helper functions
36

47
def h(elm_type, props='', *args):
5-
return React.createElement(elm_type, props, *args)
8+
return createElement(elm_type, props, *args)
69

710

811
def render(react_element, destination_id, callback=lambda: None):
912
container = document.getElementById(destination_id)
10-
ReactDOM.render(react_element, container, callback)
13+
react_render(react_element, container, callback)
1114

1215

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)
1422

23+
ref = useRef(func)
24+
ref.current = func
1525

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)
1830

19-
'getInitialState': lambda: {'counter': 0},
31+
return func
2032

21-
'updateCounter': lambda: (this.setState({'counter': this.state['counter']+1})),
2233

23-
'componentDidMount': lambda: (setInterval(this.updateCounter, 1000)),
34+
# Create a component
2435

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+
)
3155

3256

3357
# Render the component in a 'container' div
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
createElement = React.createElement
2+
createContext = React.createContext
3+
forwardRef = React.forwardRef
4+
Component = ReactComponent = React.Component
5+
6+
7+
useState = React.useState
8+
useEffect = React.useEffect
9+
useContext = React.useContext
10+
11+
useReducer = React.useReducer
12+
useCallback = React.useCallback
13+
useMemo = React.useMemo
14+
useRef = React.useRef
15+
useImperativeHandle = React.useImperativeHandle
16+
useLayoutEffect = React.useLayoutEffect
17+
useDebugValue = React.useDebugValue
18+
19+
20+
def withDeps(*deps):
21+
useHook = this
22+
def decorator(fn):
23+
useHook(fn, deps)
24+
return fn
25+
return decorator
26+
27+
28+
useEffect.withDeps = withDeps
29+
useLayoutEffect.withDeps = withDeps
30+
31+
32+
def useCallbackWithDeps(*deps):
33+
def decorator(fn):
34+
return React.useCallback(fn, deps)
35+
return decorator
36+
37+
useCallback.withDeps = useCallbackWithDeps
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
render = ReactDOM.render

0 commit comments

Comments
 (0)