LiveCodes provides full support for React with JSX/TSX, automatic imports, and the official React Compiler for optimized rendering.
Configuration
Language Name: react (JSX) or react-tsx (TSX)
File Extensions: .react.jsx, .react-jsx (JSX), .react.tsx (TSX)
Editor: Script editor
Compiler: Babel with React Compiler plugin
Runtime: React 18+ with automatic JSX runtime
Features
JSX Syntax
Write components with JSX:
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div className="counter">
<h2>Count: {count}</h2>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
<button onClick={() => setCount(count - 1)}>
Decrement
</button>
</div>
);
}
export default Counter;
TypeScript Support
Use TypeScript with React (react-tsx):
import { useState } from 'react';
interface CounterProps {
initialCount?: number;
step?: number;
onCountChange?: (count: number) => void;
}
function Counter({
initialCount = 0,
step = 1,
onCountChange
}: CounterProps) {
const [count, setCount] = useState(initialCount);
const handleIncrement = () => {
const newCount = count + step;
setCount(newCount);
onCountChange?.(newCount);
};
return (
<div>
<p>Count: {count}</p>
<button onClick={handleIncrement}>+{step}</button>
</div>
);
}
export default Counter;
React Compiler
LiveCodes uses the official React Compiler (formerly React Forget) to automatically optimize your components:
import { useState } from 'react';
// This component is automatically optimized by React Compiler
function ExpensiveList({ items }) {
const [filter, setFilter] = useState('');
// No need for useMemo - React Compiler handles it
const filtered = items.filter(item =>
item.toLowerCase().includes(filter.toLowerCase())
);
return (
<div>
<input
value={filter}
onChange={e => setFilter(e.target.value)}
placeholder="Filter items..."
/>
<ul>
{filtered.map(item => (
<li key={item}>{item}</li>
))}
</ul>
</div>
);
}
The React Compiler automatically memoizes components and values, reducing the need for manual useMemo and useCallback optimization.
Hooks
Full React Hooks support:
import { useState, useEffect, useRef, useCallback } from 'react';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const mountedRef = useRef(true);
const fetchUser = useCallback(async () => {
setLoading(true);
const response = await fetch(`/api/users/${userId}`);
const data = await response.json();
if (mountedRef.current) {
setUser(data);
setLoading(false);
}
}, [userId]);
useEffect(() => {
fetchUser();
return () => {
mountedRef.current = false;
};
}, [fetchUser]);
if (loading) return <div>Loading...</div>;
if (!user) return <div>User not found</div>;
return (
<div>
<h2>{user.name}</h2>
<p>{user.email}</p>
</div>
);
}
Fragments
Return multiple elements:
function UserInfo({ user }) {
return (
<>
<h2>{user.name}</h2>
<p>{user.email}</p>
<p>{user.role}</p>
</>
);
}
// Or with explicit Fragment
import { Fragment } from 'react';
function UserList({ users }) {
return (
<Fragment>
{users.map(user => (
<UserInfo key={user.id} user={user} />
))}
</Fragment>
);
}
Context API
Share data across components:
import { createContext, useContext, useState } from 'react';
const ThemeContext = createContext();
function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
const toggleTheme = () => {
setTheme(prev => prev === 'light' ? 'dark' : 'light');
};
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
}
function ThemedButton() {
const { theme, toggleTheme } = useContext(ThemeContext);
return (
<button
onClick={toggleTheme}
style={{
background: theme === 'light' ? '#fff' : '#333',
color: theme === 'light' ? '#000' : '#fff',
}}
>
Toggle Theme
</button>
);
}
function App() {
return (
<ThemeProvider>
<ThemedButton />
</ThemeProvider>
);
}
export default App;
Compiler Configuration
Configure Babel and React Compiler options:
{
"customSettings": {
"babel": {
"sourceMaps": true,
"comments": false
},
"@babel/preset-react": {
"runtime": "automatic",
"development": false
},
"babel-plugin-react-compiler": {
"compilationMode": "annotation"
}
}
}
Preset Configurations
Babel
React Preset
TypeScript Preset
React Compiler
{
"customSettings": {
"babel": {
"presets": ["env", "react"],
"plugins": [],
"filename": "script.tsx"
}
}
}
{
"customSettings": {
"@babel/preset-react": {
"runtime": "automatic",
"importSource": "react",
"throwIfNamespace": true
}
}
}
{
"customSettings": {
"@babel/preset-typescript": {
"isTSX": true,
"allExtensions": true
}
}
}
{
"customSettings": {
"babel-plugin-react-compiler": {
"sources": null,
"compilationMode": "annotation"
}
}
}
External Libraries
Import React ecosystem libraries:
import { useState } from 'react';
import { useQuery } from '@tanstack/react-query';
import { motion } from 'framer-motion';
import styled from 'styled-components';
const Button = styled.button`
background: #3b82f6;
color: white;
padding: 0.5rem 1rem;
border: none;
border-radius: 0.25rem;
cursor: pointer;
&:hover {
background: #2563eb;
}
`;
function AnimatedCounter() {
const [count, setCount] = useState(0);
return (
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.5 }}
>
<h2>{count}</h2>
<Button onClick={() => setCount(count + 1)}>
Increment
</Button>
</motion.div>
);
}
Example Projects
Todo List
import { useState } from 'react';
function TodoApp() {
const [todos, setTodos] = useState([]);
const [input, setInput] = useState('');
const addTodo = () => {
if (input.trim()) {
setTodos([...todos, { id: Date.now(), text: input, done: false }]);
setInput('');
}
};
const toggleTodo = (id) => {
setTodos(todos.map(todo =>
todo.id === id ? { ...todo, done: !todo.done } : todo
));
};
const deleteTodo = (id) => {
setTodos(todos.filter(todo => todo.id !== id));
};
return (
<div className="todo-app">
<h1>Todo List</h1>
<div>
<input
value={input}
onChange={(e) => setInput(e.target.value)}
onKeyPress={(e) => e.key === 'Enter' && addTodo()}
placeholder="Add a todo..."
/>
<button onClick={addTodo}>Add</button>
</div>
<ul>
{todos.map(todo => (
<li key={todo.id} style={{ textDecoration: todo.done ? 'line-through' : 'none' }}>
<input
type="checkbox"
checked={todo.done}
onChange={() => toggleTodo(todo.id)}
/>
{todo.text}
<button onClick={() => deleteTodo(todo.id)}>Delete</button>
</li>
))}
</ul>
</div>
);
}
export default TodoApp;
Data Fetching
import { useState, useEffect } from 'react';
function UserList() {
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(data => {
setUsers(data);
setLoading(false);
})
.catch(err => {
setError(err.message);
setLoading(false);
});
}, []);
if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error}</div>;
return (
<div>
<h1>Users</h1>
<ul>
{users.map(user => (
<li key={user.id}>
<strong>{user.name}</strong> - {user.email}
</li>
))}
</ul>
</div>
);
}
export default UserList;
Automatic formatting with Prettier:
// Before formatting
function App(){return(<div><h1>Hello</h1><p>World</p></div>);}
// After formatting (Ctrl+Shift+F)
function App() {
return (
<div>
<h1>Hello</h1>
<p>World</p>
</div>
);
}
Best Practices
Use PascalCase for component names:// Good
function UserProfile() { }
const TodoItem = () => { };
// Bad
function userProfile() { }
const todoitem = () => { };
Always provide unique keys when rendering lists:// Good
{items.map(item => (
<Item key={item.id} {...item} />
))}
// Bad - using index as key
{items.map((item, index) => (
<Item key={index} {...item} />
))}
Destructure props for cleaner code:// Good
function User({ name, email, age }) {
return <div>{name}</div>;
}
// Verbose
function User(props) {
return <div>{props.name}</div>;
}
Limitations
No Server Components: React Server Components are not supported. All components are client components.
React Native components can use the react-native language for React Native specific APIs.
TypeScript
Use TypeScript with React
Svelte
Compiler-based framework
Solid
Fine-grained reactivity