Skip to main content

React Hooks Typescript

TST, Hongkong

Scaffolding

npm create vite@latest react-hooks
✔ Select a framework: › React
✔ Select a variant: › TypeScript + SWC
cd react-hooks
npm install
npm run dev

_./src/pages/App.tsx

import HelloWorld from '../components/HelloWorld'
import '../styles/App.css'

export default function App() {

return (
<>
<div>
<HelloWorld greeting='Hello from React Typescript' />
</div>
</>
)
}

_./src/components/HelloWorld.tsx

import React from 'react'

interface iHelloProps {
greeting: string
}

export default function HelloWorld({ greeting }: iHelloProps): React.JSX.Element {
return <h1>{ greeting }</h1>
}

React Hooks

./src/types/appTypes.ts

export interface iTodoItem {
id: string
place: string
event: string
time: string
}

export interface iItems {
items: iTodoItem[]
}

export interface TodoListFormProps {
onAddItem: (place: string, event: string, time: string) => void
}

./src/components/TodoList.tsx

import React from "react"

import { iItems } from '../types/appTypes'

export default function TodoList(props: iItems): React.JSX.Element {

return (
<div>
<h2>Todo List</h2>
<ul>
{props.items.map(item => (
<li key={item.id}>
<strong>{item.place}</strong>: {item.event}, <em>{item.time}</em>
</li>
))}
</ul>
</div>
)
}

./src/components/TodoListForm.tsx

import React, { useRef } from 'react'

import { TodoListFormProps } from '../types/appTypes'

export default function TodoListForm({ onAddItem }: TodoListFormProps): React.JSX.Element {

const placeRef = useRef<HTMLInputElement>(null)
const eventRef = useRef<HTMLInputElement>(null)
const timeRef = useRef<HTMLInputElement>(null)

function handleSubmit(e: React.FormEvent){
e.preventDefault()

console.log(
'Place :: ' + placeRef.current!.value,
'\nEvent :: ' + eventRef.current!.value,
'\nTime :: ' + timeRef.current!.value
)

const newPlace: string = placeRef.current!.value
const newEvent: string = eventRef.current!.value
const newTime: string = timeRef.current!.value

onAddItem(newPlace, newEvent, newTime)

placeRef.current!.value = ''
eventRef.current!.value = ''
timeRef.current!.value = ''
}

return (
<form onSubmit={handleSubmit}>
<input type='text' placeholder='Place' ref={ placeRef } />
<input type='text' placeholder='Event' ref={ eventRef } />
<input type='text' placeholder='Time' ref={ timeRef } />
<button type='submit'>Add Todo Item</button>
</form>
)
}

./src/pages/App.tsx

import { v4 as uuidv4 } from 'uuid';
import { useState } from 'react'

import HelloWorld from '../components/HelloWorld'
import TodoList from '../components/TodoList'
import TodoListForm from '../components/TodoListForm'

import { iTodoItem } from '../types/appTypes'

import '../styles/App.css'

export default function App() {
const [items, setItems] = useState<iTodoItem[]>([])

const addItem = (place: string, event: string, time: string) => {
setItems([ ...items, { id: uuidv4(), place, event, time } ])
}

return (
<>
<div>
<HelloWorld greeting='Hello from React Typescript' />
<TodoList items={items} />
<TodoListForm onAddItem = { addItem } />
</div>
</>
)
}

React Typescript