- vừa được xem lúc

So sánh Class components và Functional components

0 0 106

Người đăng: Bac Hai

Theo Viblo Asia

Trong bài này chúng ta sẽ cùng nhau tìm hiểu sự khác nhau giữa functional và class components trong React và khi nào chúng ta nên chọn cái nào.

Cách đơn giản nhất để xác định một component trong React là tạo một hàm Javascript:

function Welcome(props) { return <h1>Hello, {props.name}</h1>;
}

Trên thực tế nó chỉ là một hàm trả về một phần tử React. Tuy nhiên chúng ta cũng có thể sử dụng cú pháp ES6 để viết các component như:

class Welcome extends React.Component { render() { return <h1>Hello, {this.props.name}</h1>; }
}

Cả 2 ví dụ trên thì đều cho ra một kết quả giống nhau. Vậy thì chúng ta lại tự đặt ra câu hỏi rằng: "Khi nào chúng ta sử dụng function và khi nào thì sử dụng class?". Để giải được câu hỏi đó trước hết chúng ta cùng nhau đi tìm hiểu sự khác nhau giữa functional và class component nhé 😄.

Cú pháp

Sự khác biệt rõ nhất là cú pháp. Một functional component thực tế chỉ là một hàm Javascript đơn giản chấp nhận các props như là một argrument và trả về một phần tử React.

Một class component yêu cầu chúng ta cần kế thừa từ phần React.Component và tạo một function render trả về một phần từ React. Điều này sẽ đòi hỏi chúng ta phải code nhiều hơn nhưng cũng sẽ cung cấp một số lợi ích mà chúng ta sẽ thấy sau này.

Cùng nhìn về ví dụ code được chuyển đổi bời mã Babel chúng ta sẽ thấy một số khác biệt chính:

// Function component
const Car = () => { return <h2>Hi, I am also a Car!</h2>;
} // Class component
class Car extends React.Component { render() { return <h2>Hi, I am a Car!</h2>; }
}

Với ví dụ trên chúng ta hoàn toàn có thể nhận ra sự khác biệt giữa functional và class components. Functional đơn giản chỉ là một hàm trong javascript còn class component là các lớp đơn giản yêu cầu bạn mở rộng từ React để cấu tạo nên components.

props

Chúng ta cần sử dụng props khi sử dụng cùng một Component nhưng với những thông số khác nhau.

Ví dụ chúng ta có một component in ra chữ Xin chào, nhưng vì muốn tái sử dụng để in ra Xin chào bạn, sử dụng props:

// Functional
const Hello = (props) => { return ( <div className="App"> Hello {props.name} </div> );
} // Class component
class Hello extends React.Component { render() { return ( <div className="App"> Hello {this.props.name} </div> ); }
} // Sử dụng
<Hello name="You" />

Với props trong Class Component được xem như giá trị truyển vào cho hàm khởi tạo class. Còn props trong Function Component thì được xem như là giá trị truyền vào hàm pure function khi định nghĩa component.

State

Trước khi phiên bản React 16.8 ra đời thì chúng ta gần như không thể nào sử dụng state trong functional. Tuy nhiên phiên bản react 16.8 xuất hiện với một thuật ngữ hoàn toàn mới đó là hooks. Với việc xuất hiện hook thì việc sử dụng state trong functional hoàn toàn dễ dàng. Các bạn có thể tìm hiểu thêm tại https://vi.reactjs.org/docs/hooks-intro.html.

state trong Class Component dược định nghĩa như sau:

import React, { Component } from 'react'; class TestComponent extends Components { constructor(props) { super(props); // khởi tạo giá trị state this.state = { isLoading: false }; } render() { return <div>TestComponent</div>; }
}

Khi muốn thay đổi giá trị state bạn gọi phương thức setState của component:

this.setState((state) => ({ isLoading: true }));

state trong Function Component được định nghĩa như sau:

import React, { useState } from 'react'; export function TestComponent(props) { // giá trị khởi tạo state được truyền vào trong useState hook const [state, setState] = useState({ isLoading: false }); return <div>TestComponent</div>;
}

Các bạn để ý hàm useState trả về giá trị của component state trong biến state và hàm setState. Khi muốn thay đổi giá trị của state thì bạn có thể gọi hàm setState.

setState({ isLoading: true });

Kết luận:

Có những ưu và khuyết điểm trong cả 2 cách sử dụng trên nhưng có lẽ functional đang chiếm ưu thế hơn trong tương lai. Như chúng ta nhận thấy việc sử dụng functional làm cho code ngắn gọn, đơn giản hơn giúp chúng ta dễ phát triển và bảo trì hơn. Với mình sau khi đọc về react hook mình nhận thấy thích sử dụng các functional component hơn =)). Còn vơi bạn thì sao hãy để lại ý kiến đóng góp dưới comment cho mình nha. Cảm ơn các bạn đã theo dõi.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Những điều cần lưu ý và sử dụng Hook trong React (Phần 5)

V. Sử dụng useRef như thế nào cho đúng.

0 0 127

- vừa được xem lúc

7 Cách viết code React "clean" hơn

Mở đầu. Là nhà phát triển React, tất cả chúng ta đều muốn viết code sạch hơn, đơn giản hơn và dễ đọc hơn. 1. Sử dụng JSX shorthands.

0 0 188

- vừa được xem lúc

Create app covid-19 use Reactjs

Chào các bạn hôm nay mình sẽ chia sẻ với các bạn một app covid-19, để mọi người cùng tham khảo, tính năng của App này chỉ đơn giản là show số liệu về dịch Covid của các nước trên thế giới như: Số ngườ

0 0 39

- vừa được xem lúc

ReactJS Custom Hooks

ReactJS cung cấp rất nhiều cho bạn các hook mà bạn có thể sử dụng hằng ngày vào project của mình. Nhưng bên cạnh đó bạn có thể tự tạo ra các hook của riêng bạn để sử dụng, làm cho việc tối ưu hóa code

0 0 65

- vừa được xem lúc

3 cách để tránh re-render khi dùng React context

3 cách để tránh re-render khi dùng React context. Nếu đã từng sử dụng React context cho dự án của bạn, và gặp phải tình trạng các component con - Consumer re-render rất nhiều lần, thậm chí bị sai logi

0 0 25

- vừa được xem lúc

Tìm hiểu về React Hook: Sử dụng useDebugValue

Trong bài viết hôm này, tôi sẽ giới thiệu các bạn một React Hook tiếp theo, đó là useDebugValue. useDebugValue là gì .

0 0 45