Membuat Simple Aplikasi Todo dengan React.js
Membuat Simple Aplikasi Todo dengan React.js - Selamat pagi sobs sobs sekalian, semoga kalian dalam keadaan sehat walafiat pada kesempatan kali ini Gua akan sharing membuat aplikasi todo sederhana, sebelum itu buat sobs sekalian siapkan Kopi, Selonjorkan badan , Udut bagi yang udut, tentunya koneksi internet karena ditutorial kali ini tentunya wajib pakai internet.
Oh iya agar sobs-sobs mudah paham, saya sarankan sobs-sobs lebih dahulu mempelajari javascript fundamental, dan syntax dari jsx. jika belum ya engga apa-apa namanya juga belajar lama-lama kelamaan juga pasti paham.
Oke Tampilan hasil akhir kira-kira dari aplikasi sederhana yang akan kita buat kira-kira seperti dibawah ini
Pada tutorial kali ini kita tidak akan membuat project mengunakan create-react-app tapi hanya menggunakan CDN adapun komponen yang dibutuhkan yaitu React.js, ReactDOM, Babel.js dan tentunya saja pada kali ini menggunakan Bootstrap 5 untuk stylingnya.
Sebelum mulai kita, didalam aplikasi ini gua akan buat 3 komponen yaitu App, FormTodo dan Todo
- App : adalah komponen utama kita yang didalamnya terdapat 2 komponen lainya, nantinya komponen ini yang akan dirender.
- FormTodo : adalah komponen berupa form untuk menambahkan todo.
-Todo : adalah komponen berupa list dari todo yang sudah kita tambahkan.
oke kita mulai step by stepnya :
1. Buatlah folder projectnya, silahkan dinamakan bebas.
2. Buat kopi, ett maksudnya buat file dengan extension .html, nama file bebas sesuai dengan keinginan maka hasilnya seperti ini dan buka dengan text editor kesayangan anda boleh vim, nano atau vs code bebeas tentunya.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Simple Todo</title>
<!-- bootstrap css -->
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
crossorigin="anonymous"
/>
</head>
<body>
<div id="root"></div>
<!-- React, ReactDOM, Babel.js dan bootstrap.js -->
<script
crossorigin
src="https://unpkg.com/react@17/umd/react.development.js"
></script>
<script
crossorigin
src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"
></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
crossorigin="anonymous"
></script>
</body>
</html>
<script type="text/babel">
// root element
const rootElement = document.getElementById("root");
</script>
class App extends React.Component {
// tambahkan state disini
constructor() {
super();
this.state = {
todoList: [],
};
}
// method untuk render html
render() {}
}
render() {
return (
<div className="container">
{this.state.todoList.map((todo) => {
return (
<div key={todo.id}>
{/* komponent Todo */}
<Todo
id={todo.id}
text={todo.text}
onHandleDeleteButton={this.handleDeleteButton}
/>
</div>
);
})}
{/* komponent FormTodo */}
<FormTodo onAddTodo={this.addTodo} />
</div>
);
}
class FormTodo extends React.Component {
constructor(props) {
super(props);
this.state = {
inputValue: "",
pesanError: "",
};
}
handleChangeInputValue = (e) => {
this.setState({ inputValue: e.target.value });
};
handleSubmitForm = (e) => {
e.preventDefault();
if (this.state.inputValue.trim() === "") {
this.setState({ pesanError: "Todo cannot empty !!!" });
} else {
this.props.onAddTodo(this.state.inputValue);
this.setState({ inputValue: "", pesanError: "" });
}
};
render() {
// console.log(this.state.inputValue);
return (
<div className="row mt-5 justify-content-center">
<div className="col-6">
<form onSubmit={this.handleSubmitForm}>
<div className="mb-3">
<input
type="text"
value={this.state.inputValue}
onChange={this.handleChangeInputValue}
className="form-control"
placeholder="Write todo here and Enter .."
/>
{this.state.pesanError && (
<div id="inputHelp" className="form-text text-danger">
{this.state.pesanError}
</div>
)}
</div>
</form>
</div>
</div>
);
}
}
class Todo extends React.Component {
render() {
return (
<div className="row mt-2 justify-content-center">
<div className="col-6">
<div className="card bg-dark text-white">
<div className="card-body">
<div className="row">
<div className="col-10 text-center">
{this.props.text}
</div>
<div className="col-2">
<button
type="button"
className="btn-close btn-sm btn-close-white float-end"
aria-label="Close"
id={this.props.id}
onClick={this.props.onHandleDeleteButton}
/>
</div>
</div>
</div>
</div>
</div>
</div>
);
}
}
class App extends React.Component {
constructor() {
super();
this.state = {
todoList: [],
};
}
handleDeleteButton = (e) => {
const newTodos = this.state.todoList.filter((todo) => {
return todo.id !== e.target.id;
});
this.setState({
todoList: newTodos,
});
};
addTodo = (text) => {
this.setState((prevState) => {
return {
todoList: [
...prevState.todoList,
{
id: new Date().getTime().toString(),
text: text,
},
],
};
});
};
render() {
return (
<div className="container">
{this.state.todoList.map((todo) => {
return (
<div key={todo.id}>
<Todo
id={todo.id}
text={todo.text}
onHandleDeleteButton={this.handleDeleteButton}
/>
</div>
);
})}
<FormTodo onAddTodo={this.addTodo} />
</div>
);
}
}
ReactDOM.render(<App />, rootElement);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Simple Todo</title>
<!-- bootstrap css -->
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
crossorigin="anonymous"
/>
</head>
<body>
<div id="root"></div>
<!-- React, ReactDOM, Babel.js dan bootstrap.js -->
<script
crossorigin
src="https://unpkg.com/react@17/umd/react.development.js"
></script>
<script
crossorigin
src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"
></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
crossorigin="anonymous"
></script>
<script type="text/babel">
// root element
const rootElement = document.getElementById("root");
class Todo extends React.Component {
render() {
return (
<div className="row mt-2 justify-content-center">
<div className="col-6">
<div className="card bg-dark text-white">
<div className="card-body">
<div className="row">
<div className="col-10 text-center">
{this.props.text}
</div>
<div className="col-2">
<button
type="button"
className="btn-close btn-sm btn-close-white float-end"
aria-label="Close"
id={this.props.id}
onClick={this.props.onHandleDeleteButton}
/>
</div>
</div>
</div>
</div>
</div>
</div>
);
}
}
class FormTodo extends React.Component {
constructor(props) {
super(props);
this.state = {
inputValue: "",
pesanError: "",
};
}
handleChangeInputValue = (e) => {
this.setState({ inputValue: e.target.value });
};
handleSubmitForm = (e) => {
e.preventDefault();
if (this.state.inputValue.trim() === "") {
this.setState({ pesanError: "Todo cannot empty !!!" });
} else {
this.props.onAddTodo(this.state.inputValue);
this.setState({ inputValue: "", pesanError: "" });
}
};
render() {
// console.log(this.state.inputValue);
return (
<div className="row mt-5 justify-content-center">
<div className="col-6">
<form onSubmit={this.handleSubmitForm}>
<div className="mb-3">
<input
type="text"
value={this.state.inputValue}
onChange={this.handleChangeInputValue}
className="form-control"
placeholder="Write todo here and Enter .."
/>
{this.state.pesanError && (
<div id="inputHelp" className="form-text text-danger">
{this.state.pesanError}
</div>
)}
</div>
</form>
</div>
</div>
);
}
}
class App extends React.Component {
constructor() {
super();
// tambahkan state disini
this.state = {
todoList: [],
};
}
handleDeleteButton = (e) => {
const newTodos = this.state.todoList.filter((todo) => {
return todo.id !== e.target.id;
});
this.setState({
todoList: newTodos,
});
};
addTodo = (text) => {
this.setState((prevState) => {
return {
todoList: [
...prevState.todoList,
{
id: new Date().getTime().toString(),
text: text,
},
],
};
});
};
// method untuk render html
render() {
return (
<div className="container">
{this.state.todoList.map((todo) => {
return (
<div key={todo.id}>
{/* komponen Todo */}
<Todo
id={todo.id}
text={todo.text}
onHandleDeleteButton={this.handleDeleteButton}
/>
</div>
);
})}
{/* komponen FormTodo */}
<FormTodo onAddTodo={this.addTodo} />
</div>
);
}
}
ReactDOM.render(<App />, rootElement);
</script>
</body>
</html>
Posting Komentar untuk "Membuat Simple Aplikasi Todo dengan React.js"
Posting Komentar