Tự học React JS thời đại dịch Corona nCoV – Phần 2

Tiếp theo phần 1, trong phần này chúng ta sẽ có thể phát triển app to-do list hoàn chỉnh hơn. Nên kiến thức phần này có thể sẽ giúp ích cho bạn rất nhiều. Hãy khám phá nào


1063
1.7k shares, 1063 points

Sử dụng CSS trong React

Trước khi code bất kì dòng JavaScript nào, bạn cần biết cách add styles vào components trong React.

Trong phần 1 chúng ta đã xóa file App.css vì không cần đến chúng. Và sau đây là 2 cách sử dụng CSS trong React: local hoặc global. File CSS ở local được chia theo từng style dựa trên mỗi component. Điều này giúp các app có được nhiều style dựa trên những component đã có.

Tạo component cho app

Đầu tiên, chúng ta hãy thêm dữ liệu vào to-do list ở state

import React, {Component} from 'react';
export default class App extends Component{
  state={
   'todos':[
       {'name':'Walk the dog', 'id': 0},
       {'name':'Bake a cake', 'id': 1},
        {'name':'Study for the test', 'id': 2}
        ]
      }
render(){
  return(
    <div>
     <h1>To-do list app using React </h1>
   </div>
  )
 }
}

Chúng ta vừa thêm dữ liệu vào state, với thuộc tính là name và id. Thuộc tính name thể hiện hành động trong phần to-do list, còn id dùng để phân biệt với nhau.

Trong phần trước chúng ta đang ở phần render cho page. Tiếp theo chúng ta hãy xem sơ đồ để hiểu rõ hơn về cách thức hoạt động của React

Chúng ta không sử dụng component để render mà chỉ sử dụng để duy trì state của to-do list. Chúng ta sẽ sử dụng component todos để xuất tất cả dữ liệu ra trình duyệt

Props trong React

Props là cách mà component có thể nhận được các giá trị của thuộc tính truyền từ bên ngoài vào.

Props là cách mà các component có thể nói chuyện với nhau (trao đổi dữ liệu với nhau) và được truyền từ component chính xuống.

Props là bất biến (nó không thay đổi giá trị trừ khi dữ liệu gốc của nó thay đổi).

Tạo component todos

Đầu tiên chúng ta tạo file todos.js như bên dưới

import React from 'react';
const Todos=({todos})=>{
 const todoItems=[];
 todos.forEach(todo=>{
  todoItems.push(
    <div key={todo.id}>
      <li>{todo.name} <button className="btn btn-delete">X</button>
      </li>
    </div>
  )
});
return(
  <div className="list-container">
    <ul className="list">
     {todoItems}
   </ul>
  </div>
 )
}
export default Todos;

Chúng ta chỉ update phần UI, bên trong hàm Todos() chúng ta lấy giá trị từ App Component. Và tạo ra list todoItems. Trong React, các biến JavaScript có thể được xuất trực tiếp trong JSX bằng cách bỏ chúng vào {}.

Bây giờ, tất cả những gì chúng ta phải làm là import vào App Component và chuyển state của App Component cho Todos.

import Todos from ‘./todos’
...
...
<Todos todos={this.state.todos}></Todos>
...
File App.js sẽ như thế này

Bây giờ là kết quả hiển thị trên browser

Render dữ liệu ra browser

Đã hiển thị được to-do list dưa trên dữ liệu được thêm vào. Bước tiếp theo chúng ta sẽ viết function cho dấu x để xóa to-do mình muốn.

Chúng ta sẽ sử dụng sự kiện onClick để xóa, điều đầu tiên cần nghĩ đến là state, thay đổi state để làm nó biến mất.

Gán State trong React

State đã được tóm tắt ở phần đầu. Để dễ dàng thao tác thay đổi dữ liệu động trên component. Tuy nhiên, bạn không thể thay đổi state trực tiếp. Nên bạn không thể viết:

this.state.todos.push({‘name’:‘clean room’, ‘id’:4})

Để thay đổi giá trị ta dùng hàm setState() thông qua biến tham chiếu id

deleteTodos=(id)=>{
  let todos=this.state.todos.filter(todo=>{
    return todo.id!==id;
  })
  this.setState({
     todos: todos
  })
}

Chúng ta sẽ chuyển hàm removeTodos () làm props cho Todos component.

<Todos deleteTodos={this.deleteTodos} todos={this.state.todos}>
</Todos>

Bước tiếp theo ta gắn event vào mỗi item cuả todo

const Todos=({deleteTodos,todos})=>{
...
 <li >{todo.name} <button className=”btn btn-delete”
   onClick={()=>{deleteTodos(todo.id)}}> X
               </button>
</li>
</div>
)
...

Vào browser và thử xóa nào :

Animated GIF

Và bây giờ, bạn có thể xóa item trong todo list rồi

Tạo component addTodos

Vừa viết xong hàm xóa, giờ đến lượt hàm “add” . Tiếp tục nhìn vào sơ đồ để hiểu được cách thức hoạt động và ý tưởng.

Để chức năng “thêm todo” xuất hiện trên giao diện, cần tạo input để nhập tên của nó. Mỗi khi nhập ký tự vào, state trong React sẽ được cập nhật lại.

Khi bạn tạo component addTodos, mọi thứ sẽ trở nên dễ dàng hơn. Component này sẽ render input cùng với nút thêm bên trong render () dưới dạng mẫu JSX.

Vì vậy, addTodos là một component container và nó sẽ có trạng thái sẽ lưu trữ các công việc mới được thêm vào. Đoạn này sẽ được code như sau:

import React,{Component} from ‘react’;
export default class AddTodos extends Component{
  state={
   ‘name’: null
   }
render(){
 return(
  <div>
    <form>
     <label htmlFor=”item”></label>
     <input type=”text” placeholder=”Add a todo…” id=”item”/>
     <button className=”btn btn-add”>Add</button>
   </form>
  </div>
  )
 }
}

Tiếp theo ta gán state vào component addTodos. Sử dụng setState() như sau để có được kết quả như ý muốn

import React,{Component} from ‘react’;
export default class AddTodos extends Component{
....
handleChange=(e)=>{
 this.setState({
  [‘name’]:e.target.value
})
render(){
...
  <input onChange={this.handleChange} type=”text” placeholder=”Add a todo…” id=”item”/>
....
}

Thêm console.log() để kiểm tra có dữ liệu có đúng hay chưa

handleChange=(e)=>{
  this.setState({
[‘name’]:e.target.value
})
 console.log(this.state);
}
To Do List App React
Component addTodos

Lưu ý : tất cả đều được render từ component gốc , đó là App Component .Vì vậy, import vào trong App.js và render dưới dạng JSX bên trong hàm render.

...
import AddTodos from ‘./addtodos’;
...
render(){
....
  <AddTodos></AddTodos>
...
}

Quay lại browser và thao tác ngay lập tức để được kết quả như sau

To Do List App React
State thay đổi liên tục

Cách sử dụng event onSubmit

Bây giờ, điều duy nhất còn lại phải làm là thêm các todos đó vào trang khi chúng ta nhấp vào nút thêm. Ở phần này sử dụng event onSubmit để chuyển state của component addTodos trong React. Hãy nhớ rằng: state có thể được truyền dưới dạng props từ component cha sang component con.

Tạo một hàm bên trong component addTodos, lấy todos hiện tại làm tham số, gán id duy nhất cho nó, sau đó thêm nó vào state của component app. Chúng ta chuyển function này dưới dạng props cho component addTodos, kích hoạt nó bên trong hàm onSubmit từ đó chúng ta chuyển state hiện tại của component addTodos sang hàm addTodos ().

...
import AddTodos from './addTodos';
export default class App extends Component{
...
addTodos=(newTodo)=>{
  newTodo.id=this.state.todos[this.state.todos.length-1].id+1;
  let todos=[...this.state.todos,newTodo]
  this.setState({
    todos
 })
...
render(){
  ...
   <AddTodos addTodos={this.addTodos} />
 ...
}

Bây giờ chúng ta cần gọi method làm props và chuyển state của component addTodos làm tham số. Chúng ta sẽ thực hiện điều này bên trong hàm onSubmit, sau khi một event onSubmit được kích hoạt

....
export default class AddTodos extends Component{
...
  handleSubmit=(e)=>{
          e.preventDefault();
         this.props.addTodos(this.state);
         document.querySelector(‘form’).reset();
     }
...
}

Đến bước này, đã gần hoàn tất.

Chúng ta thêm hàm handleSubmit() vào bên trong event onSubmit:

...
export default class AddTodos extends Component{
    ....
    render(){
      return(
          ....
         <form onSubmit={this.handleSubmit}>
          ...
      )
   }
...
}

Kết quả app đã hoàn chỉnh như sau :

To Do App React
To Do List App React

Kết luận

Qua phần này, chúng ta đã hiểu rõ hơn về thao tác và cách hoạt động của React. Cùng với kiến thức đã biết ở Tự học React JS thời đại dịch Corona nCoV – Phần 1, giúp bạn có thể viết được một app to-do list cơ bản.


Like it? Share with your friends!

1063
1.7k shares, 1063 points

What's Your Reaction?

hate hate
3330
hate
confused confused
1998
confused
fail fail
999
fail
fun fun
666
fun
geeky geeky
333
geeky
love love
2664
love
lol lol
2997
lol
omg omg
1998
omg
win win
999
win