Câu hỏi phỏng vấn Reactjs ( Phần 2 )

Câu hỏi phỏng vấn Reactjs ( Phần 2 )

React là một thư viện JavaScript mã nguồn mở, linh hoạt và hiệu quả cho phép các nhà phát triển tạo ra các ứng dụng web đơn giản, nhanh chóng và có thể mở rộng. Jordan Walke, một kỹ sư phần mềm làm việc cho Facebook đã tạo ra React. Nó được triển khai lần đầu tiên trên news feed của Facebook vào năm 2011 và trên Instagram vào năm 2012. Các nhà phát triển từ nền tảng Javascript có thể dễ dàng phát triển các ứng dụng web với sự trợ giúp của React.
Ở hiện tại, việc lựa chọn công nghệ phù hợp để ứng dụng hoặc phát triển web đang trở nên khó khăn hơn. React đã được coi là thư viện/framework frontend phát triển nhanh nhất trong số tất cả. Sự phát triển của Javascript đang nổi lên và ổn định trên thị trường và nhu cầu tuyển dụng React đang tăng lên theo cấp số nhân. React rõ ràng là một lợi thế đối với các nhà phát triển front-end vì nó có đường cong học tập nhanh, trừu tượng rõ ràng và các thành phần có thể tái sử dụng. Hiện tại, vẫn chưa có dấu hiệu dừng cho React vì nó vẫn sẽ tiếp tục phát triển.
Tiếp nối Câu hỏi phỏng vấn Reactjs ( phần 1 ), hôm nay mình sẽ giới thiệu đến các bạn những câu hỏi phỏng vấn Reactjs Nâng cao hơn, cùng mình tham khảo nhé.
20. Hook tuỳ chỉnh là gì?
21. Strict mode trong React là gì?
22. Ngăn chặn re-render trong React?
23. Các cách khác nhau để chỉnh style component?
24. Các kỹ thuật tối ưu hiệu suất ứng dụng React?
25. Truyền dữ liệu giữa các component?
26. High-Order Component là gì?
27. Các giai đoạn trong vòng đời component?
28. Các phương thức trong vòng đời component?
29. React hook có làm việc với static typing?
30. Các kiểu Hooks trong React?
31. Sự khác biệt giữa lớp và React Hook?
32. Hiệu suất của React Hook so với lớp?
33. Các hook có thay thế được lớp hoàn toàn?
34. React Router là gì?
35. React Hook có thể thay thế Redux?
36. Render có điều kiện trong React?
37. Sự khác biệt giữa NavLink và Link?
38. withRouter trong react-router-dom là gì?
39. Cách hiển thị dữ liệu API với Axios?
40. Caching trong React?

20. Hook tuỳ chỉnh là gì?

Một hook tùy chỉnh(custom hooks) là một hàm trong Javascript có tên bắt đầu bằng use và gọi các hook khác. Nó là một phần của bản cập nhật hook React v16.8 và cho phép bạn sử dụng lại logic trạng thái mà không cần phải cấu trúc lại cấu trúc phân cấp component.
Trong hầu hết các trường hợp, hook tùy chỉnh được coi là đủ để thay thế render props và HoC (High-Order components) và giảm số lượng lồng ghép cần thiết. Hooks tuỳ chỉnh sẽ cho phép bạn tránh nhiều lớp trừu tượng hoặc wrapper hell có thể đi kèm với render props và HoC.
Nhược điểm của Hooks tuỳ chỉnh là nó không thể được sử dụng bên trong các lớp.

Câu hỏi phỏng vấn React cho Experienced

21. Strict mode trong React là gì?

StrictMode là công cụ được thêm vào ở React v16.3 để highlight các vấn đề tiềm ẩn trong React. Nó thực hiện kiểm tra bổ sung lên ứng dụng.

function App() { return ( <React.StrictMode> <div classname="App"> <Header/> <div>
                    Page Content
                </div> <Footer/> </div> </React.StrictMode> );}

Để khởi động StrictMode, thẻ <React.StrictMode> được thêm vào ứng dụng:

import React from "react";import ReactDOM from "react-dom";import App from "./App";const rootElement = document.getElementById("root");ReactDOM.render(<React.StrictMode> <App /></React.StrictMode>,rootElement);

StrictMode giúp giải quyết các vấn đề sau:
  • Xác định các component với phương thức lifecycle
  • Một số phương thức lifecycle không an toàn khi dùng bất đồng bộ trong ứng dụng react. Với thư viện bên thứ 3, thật khó để đảm bảo một số phương thức lifecycle nhất định không được dùng.
  • StrictMode giúp ta bằng cách cung cấp cảnh báo với bất kỳ class component nào sử dụng phương thức lifecycle không an toàn.
  • Cảnh báo sử dụng chuỗi API kế thừa
  • Nếu sử dụng phiên bản cũ của React, callback ref được đề nghị là cách để quản lý refs thay vì dùng chuỗi refs. StringMode đưa ra cảnh báo nếu bản sử dụng chuỗi ref để quản lý refs.
  • Cảnh báo sử dụng findDOMNode
  • Phương thức findDOMNode() dùng để tìm cây của node DOM. Phương thức này đã không còn hỗ trợ trogn React. Do đó, StrictMode đưa ra cảnh báo khi ta dùng phương thức này.

22. Ngăn chặn re-render trong React?

Nguyên nhân cho re-render: - Re-render một component và con của nó xảy ra khi props hoặc state của component thay đổi - Re-render component không có cập nhật, sẽ ảnh hưởng đến hiệu suất của ứng dụng
Cách để chặn re-render:

class Parent extends React.Component { state = { messageDisplayed: false }; componentDidMount() { this.setState({ messageDisplayed: true }); } render() { console.log("Parent is getting rendered"); return ( <div className="App"> <Message /> </div> ); }} class Message extends React.Component { constructor(props) { super(props); this.state = { message: "Hello, this is vivek" }; } render() { console.log("Message is getting rendered"); return ( <div> <p>{this.state.message}</p> </div> ); }}

Component Parent là cha của component Message. Bất kỳ thay đổi nào đến Parent sẽ dẫn đến re-render ở cả Message. Để ngăn chặn điều này, ta sử dụng phương thức shouldComponentUpdate():

class Message extends React.Component { constructor(props) { super(props); this.state = { message: "Hello, this is vivek" }; } shouldComponentUpdate() { console.log("Does not get rendered"); return false; } render() { console.log("Message is getting rendered"); return ( <div> <p>{this.state.message}</p> </div> ); }}

Như đã thấy, ta trả về false cho phương thức shouldComponentUpdate() ngăn chặn component con bị re-render.

23. Các cách khác nhau để chỉnh style component?

Inline Styling: ta có thể chỉnh style trực tiếp lên phần tử bằng cách dùng thuộc tính style. Nhớ giá trị của style luôn là đối tượng JavaScript:

class RandomComponent extends React.Component { render() { return ( <div> <h3 style={{ color: "Yellow" }}>This is a heading</h3> <p style={{ fontSize: "32px" }}>This is a paragraph</p> </div> ); }}

Javascript Object: ta có thể tạo đối tượng JavaScript và tập mô tả thuộc tính style. Các đối tượng có thể dùng như giá trị của thuộc tính style.

class RandomComponent extends React.Component { paragraphStyles = { color: "Red", fontSize: "32px" }; headingStyles = { color: "blue", fontSize: "48px" }; render() { return ( <div> <h3 style={this.headingStyles}>This is a heading</h3> <p style={this.paragraphStyles}>This is a paragraph</p> </div> ); }}

CSS Stylesheet: Ta sẽ tạo một file CSS riêng và viết tất cả style cho component trong file đó. Sau đó import nó vào file React.

import './RandomComponent.css'; class RandomComponent extends React.Component { render() { return ( <div> <h3 className="heading">This is a heading</h3> <p className="paragraph">This is a paragraph</p> </div> ); }}

CSS Module: Tương tự như file CSS, nhưng ta sửa thành .module.css, với cách này tên lớp sẽ được mã hoá, đồng thời nó hỗ trợ kiểu viết tương tự sass.

.paragraph{
    color:"red";
    border:1px solid black;
}

Ta có thể import file vào component như sau:

import styles from './styles.module.css'; class RandomComponent extends React.Component { render() { return ( <div> <h3 className="heading">This is a heading</h3> <p className={styles.paragraph} >This is a paragraph</p> </div> ); }}

24. Các kỹ thuật tối ưu hiệu suất ứng dụng React?

  • useMemo()
  • Là hook dùng cho caching CPU.
  • Đôi khi trong các ứng dụng web, các hàm đắt (tính toán nhiều, tốn bộ nhớ) được gọi liên túc do re-render đẫn đến tốc độ render chậm, hiệu suất kém.
  • useMemo() có thể sử dụng cho cache cám hàm như vậy. Bằng cách dùng useMemo() các hàm đó chỉ được gọi khi cần thiết.
  • React.PureComponent
  • Là class component cơ sở để kiểm tra state và props của một component để biết khi nào nó nên được cập nhật.
  • Thay vì dùng React.Component, ta có sử dụng React.PureComponent để giảm việc re-render không cần thiết.
  • Duy trì vị trí state
  • Đây là quá trình chuyển state đến nơi bạn nhất có thể.
  • Thỉnh thoảng ta có các state không cần thiết nằm trong component cha để gây khó đọc và bảo trì hơn, thậm chí là dẫn đến re-render không cần thiết.
  • Để tốt hơn, ta chuyển các state vô nghĩa ở component cha sang một component riêng biệt.
  • Lazy Loading
  • Đây là kỹ thuật dùng để giảm thời gian tải của ứng dụng React. Lazy loading giúp tối ưu hiệu suất ứng dụng web bằng cách chỉ tải khi cần thiết.

25. Truyền dữ liệu giữa các component?


Từ component cha sang component con (dùng props)
Ta có thể làm như sau:

import ChildComponent from "./Child"; function ParentComponent(props) { let [counter, setCounter] = useState(0); let increment = () => setCounter(++counter); return ( <div> <button onClick={increment}>Increment Counter</button> <ChildComponent counterValue={counter} /> </div> );}

Như ta có thể thấy trong đoạn code trên, ta đang hiển thị component con bên trong component cha, bằng cách cung cấp một prop tên là counterValue. Giá trị của counter được chuyển từ component cha sang con.
Ta có thể sử dụng dữ liệu được chuyển đến component con như sau:

function ChildComponent(props) { return ( <div> <p>Value of counter: {props.counterValue}</p> </div> );}

Từ component con sang cha (dùng callback)
Ta có các bước sau:
  • Tạo một callback trong component cha nhận dữ liệu cần thiết như tham số.
  • Truyền callback này như props cho component con.
  • Gửi dữ liệu từ component con bằng cách dùng callback.
Ví dụ:
Tạo callback và gửi nó như prop đến component con:

function ParentComponent(props) { let [counter, setCounter] = useState(0); let callback = valueFromChild => setCounter(valueFromChild); return ( <div> <p>Value of counter: {counter}</p> <ChildComponent callbackFunc={callback} counterValue={counter} /> </div> );}

Sau đó ta truyền dữ liệu từ component con đến component cha:

function ChildComponent(props) { let childCounterValue = props.counterValue; return ( <div> <button onClick={() => props.callbackFunc(++childCounterValue)}>
                Increment Counter
            </button> </div> );}

Bây giờ khi ta click vào button, ta sẽ tăng giá trị childCounterValue đến props.callbackFunc.

26. High-Order Component là gì?

High-Order Component (HOC) là một hàm nhận một component làm tham số và trả về một component mới.

Tại sao lại cần HOC
Trong phát triển ứng dụng React, ta có thể phát triển component khá giống nhau với vài sự khác biệt nhỏ. Trong hầu hết trường hợp, việc phát triển các component tương tự không phải là vấn đề, nhưng khi ứng dụng lớn hơn, chúng ta cần giữ cho code mình DRY. Do đó, chúng ta muốn một sự trừu tượng cho phép chúng ta xác định logic này ở một nơi duy nhất và chia sẻ nó trên các component. HOC cho phép chúng ta tạo ra sự trừu tượng đó.
Ví dụ:
Component sau dùng để hiển thị danh sách bài viết:

// "GlobalDataSource" is some global data sourceclass ArticlesList extends React.Component { constructor(props) { super(props); this.handleChange = this.handleChange.bind(this); this.state = { articles: GlobalDataSource.getArticles(), }; } componentDidMount() { // Listens to the changes added GlobalDataSource.addChangeListener(this.handleChange); } componentWillUnmount() { // Listens to the changes removed GlobalDataSource.removeChangeListener(this.handleChange); } handleChange() { // States gets Update whenver data source changes this.setState({ articles: GlobalDataSource.getArticles(), }); } render() { return ( <div> {this.state.articles.map((article) => ( <ArticleData article={article} key={article.id} /> ))} </div> ); }}

Component sau dùng để hiển thị danh sách người dùng:

// "GlobalDataSource" is some global data sourceclass UsersList extends React.Component { constructor(props) { super(props); this.handleChange = this.handleChange.bind(this); this.state = { users: GlobalDataSource.getUsers(), }; } componentDidMount() { // Listens to the changes added GlobalDataSource.addChangeListener(this.handleChange); } componentWillUnmount() { // Listens to the changes removed GlobalDataSource.removeChangeListener(this.handleChange); } handleChange() { // States gets Update whenver data source changes this.setState({ users: GlobalDataSource.getUsers(), }); } render() { return ( <div> {this.state.users.map((user) => ( <UserData user={user} key={user.id} /> ))} </div> ); }}

Bây giờ ta có hai component có chức năng giống nhau chỉ khác về API được gọi. Ta sẽ tạo một HOC dùng chung cho cả hai:

// Higher Order Component which takes a component// as input and returns another component// "GlobalDataSource" is some global data sourcefunction HOC(WrappedComponent, selectData) { return class extends React.Component { constructor(props) { super(props); this.handleChange = this.handleChange.bind(this); this.state = { data: selectData(GlobalDataSource, props), }; } componentDidMount() { // Listens to the changes added GlobalDataSource.addChangeListener(this.handleChange); } componentWillUnmount() { // Listens to the changes removed GlobalDataSource.removeChangeListener(this.handleChange); } handleChange() { this.setState({ data: selectData(GlobalDataSource, this.props), }); } render() { // Rendering the wrapped component with the latest data data return <WrappedComponent data={this.state.data} {...this.props} />; } };}

Trong đoạn code trên ta tạo HOC trả về một component và thực hiện vài hành động có thể dùng chung trên cả component ArticleList UsersList.
Tham số thứ hai là hàm gọi cho phương thức trên API.
Ta đã giảm code trùng lặp giữa componentDidUpdate componentDidMount. Bây giờ ta có component ArticleList UsersList như sau:

const ArticlesListWithHOC = HOC(ArticlesList, (GlobalDataSource) => GlobalDataSource.getArticles());const UsersListWithHOC = HOC(UsersList, (GlobalDataSource) => GlobalDataSource.getUsers());

27. Các giai đoạn trong vòng đời component?

Có 3 giai đoạn trong vòng đời component React.
  • Mounting: đề cập đến việc đưa phần tử vào DOM của trình duyệt. Vì React dùng virtual DOM, toàn bộ DOM của trình duyệt đã render sẽ không được làm mới. Bao gồm các phương thức trong giai đoạn này bao gồm: constructor componentDidMount.
  • Updating: Trong giai đoạn này, component sẽ được cập nhật khi có thay đổi state hoặc props của component. Các phương thức trong giai đoạn này: getDerivedStateFromProps, shouldComponentUpdate, render, và componentDidUpdate.
  • Unmounting: Ở giai đoạn cuối, component sẽ bị xoá khỏi DOM. Giai đoạn này sẽ có phương thức là componentWillUnmount.

28. Các phương thức trong vòng đời component?

Trong vòng đời của React sẽ có các phương thức sẽ được gọi tự động ở các giai đoạn khác nhau trong vòng đời của component và do đó nó cung cấp khả năng kiểm soát tốt những gì xảy ra tại điểm được gọi. Nó cung cấp năng lực để kiểm soát và thao tác hiệu quả những gì diễn ra trong suốt vòng đời của component.
Ví dụ: nếu bạn đang phát triển ứng dụng YouTube, thì ứng dụng sẽ sử dụng mạng để đệm video và nó tiêu tốn pin (giả sử chỉ có hai mạng này). Sau khi phát video, nếu người dùng chuyển sang bất kỳ ứng dụng nào khác, thì bạn nên đảm bảo rằng các tài nguyên như mạng và pin đang được sử dụng hiệu quả nhất. Bạn có thể dừng hoặc tạm dừng tải video vào bộ đệm, do đó sẽ ngừng sử dụng pin và mạng khi người dùng chuyển sang ứng dụng khác sau khi phát video.
Vì vậy, chúng ta có thể nói rằng nhà phát triển sẽ có thể tạo ra một ứng dụng chất lượng với sự trợ giúp của các phương pháp vòng đời và nó cũng giúp các nhà phát triển đảm bảo lập kế hoạch những gì và làm như thế nào tại các thời điểm sinh, phát triển hoặc chết của giao diện người dùng.
Các phương thức trong vòng đời:
  • constructor(): phương thức được gọi khi component được tạo trước khi thực hiện bất kỳ hành động gì. Nó giúp tạo state và props.
  • getDerivedStateFromProps(): nó sẽ gọi trước khi phần tử được render vào DOM. Nó giúp thiết lập đối tượng state dựa trên props khởi tạo. Phương thức getDerivedStateFromProps sẽ có một state như đối số và trả về một đối tượng để thay đổi state. Nó sẽ là phương thức đầu tiên được gọi khi thực hiện cập nhật.
  • render(): phương thức này sẽ render HTML từ DOM với thay đổi mới nhất. Phương thức render sẽ được gọi mỗi khi có thay đổi đến component.
  • componentDidMount(): phương thức sẽ được gọi sau khi render component. Ta có thể chạy lệnh cần component đã được lưu trong DOM.
  • shouldComponentUpdate(): trả về giá trị boolean để quyết định xem có render hay không. Mặc định sẽ là True.
  • getSnapshotBeforeUpdate(): cung cáp truy cập cho props cung như state trước khi cập nhật. Nó dùng cho kiểm tra giá trị trước khi cập nhật.
  • componentDidUpdate(): được gọi sau khi cập nhật component trong DOM.
  • componentWillUnmount(): phương thức được gọi khi component bị xoá khỏi DOM.

29. React hook có làm việc với static typing?

Static typing đề cập đến quá trình kiểm tra code trong suốt thời gian biên dịch để đảm bảo mọi biến đề sẽ được nhập. React Hook là hàm được thiết kế để đảm bảo mọi thuộc tính sẽ được nhập tĩnh. Để thực thi nhập tĩnh chặt chẽ hơn trong code, ta có thể sử dụng API React với các Hook tùy chỉnh.

30. Các kiểu Hooks trong React?

Hook có sẵn: là các hooks được hỗ trợ sẵn trong React: - Hook cơ bản: + useState(): là component dùng cho thiết lập và chỉnh sửa state. + useEffect(): cho phép thực hiện side effect trên function component. + useContext(): dùng cho tạo dữ liệu chung có thể truy cập trong hệ phân cấp component mà không cần truyền dữ liệu theo props từ trên xuống. - Hook nâng cao: + useReducer(): dùng cho các logic state phức tạp có nhiều giá trị con khi cập nhật state phụ thuộc vào state trước đó. Nó sẽ giúp tối ưu hoá hiệu suất component khi kích hoạt các bản cập nhật sâu hơn vì nó được truyền xuống thay vì callback. + useMemo(): điều này sẽ được sử dụng để tính toán lại giá trị đã ghi nhớ khi có sự thay đổi trong một trong các phần phụ thuộc. Việc tối ưu hóa này sẽ giúp tránh các tính toán tốn kém trên mỗi lần render. + useCallback(): hữu ích khi truyền callback vào component con đã tối ưu hoá và phụ thuộc vào tham chiếu để ngăn chặn các render không cần thiết. + useImperativeHandle(): cho phép chỉnh sửa thực thể sẽ được truyền cho đối tượng ref. + useDebugValue(): dùng cho hiển thị nhãn hoặc hook tuỳ chỉnh trong React DevTools. + useRef(): Nó sẽ cho phép tạo một tham chiếu đến phần tử DOM trực tiếp trong function component. + useLayoutEffect(): dùng cho đọc bố cục từ DOM và re-render bất đồng bộ.
Hook tuỳ chỉnh: là một hàm JavaScript. Hoạt động giống như một hàm thông thường với "use" phía trước để React hiểu đó là một hook tuỳ chỉnh và sẽ mô tả các hàm đặc biệt theo quy tắc của Hook. Hơn thế nữa, việc phát triển hook tuỳ chỉnh cho phép bạn trích xuất logic component trong các hàm có thể tái sử dụng

31. Sự khác biệt giữa lớp và React Hook?


a

32. Hiệu suất của React Hook so với lớp?

  • React Hooks sẽ tránh được rất nhiều chi phí như tạo thực thể, liên kết các sự kiện, .., có trong các lớp.
  • Các hook trong React sẽ dẫn đến các cây component nhỏ hơn vì chúng sẽ tránh được việc lồng nhau tồn tại trong HOC và sẽ render props dẫn đến việc React phải thực hiện ít công việc hơn.r

33. Các hook có thay thế được lớp hoàn toàn?

Mục đích của Hook là thay thế các chức năng được cung cấp bởi lớp. Nhưng có các phương thức mà Hook vẫn chưa thay thế được lớp:
  • getSnapshotBeforeUpdate()
  • getDerivedStateFromError()
  • componentDidCatch()

34. React Router là gì?

React Router đề cập đến thư viện tiêu chuẩn được sử dụng để định tuyến trong React. Nó cho phép chúng tôi xây dựng một ứng dụng web trong React với điều hướng mà không cần làm mới trang khi người dùng điều hướng. Nó cũng cho phép thay đổi URL của trình duyệt và sẽ giữ cho giao diện người dùng đồng bộ với URL. React Router sẽ sử dụng cấu trúc component để gọi các component, sử dụng thông tin thích hợp có thể được hiển thị.
Cài đặt với npm:

npm install react-router-dom


35. React Hook có thể thay thế Redux?

React Hook không thể được coi là sự thay thế cho Redux (Nó là một thư viện JavaScript mã nguồn mở, hữu ích trong việc quản lý trạng thái ứng dụng) khi nói đến việc quản lý toàn bộ state trong các ứng dụng phức tạp lớn, mặc dù React sẽ cung cấp một hook useReducer quản lý các chuyển đổi trạng thái tương tự như Redux. Nhưng Redux hữu ích ở cấp độ thấp hơn của hệ thống phân cấp component để xử lý các phần của state phụ thuộc vào nhau, thay vì khai báo nhiều hook useState.
Trong các ứng dụng web thương mại lớn hơn, độ phức tạp sẽ cao, vì vậy chỉ sử dụng React Hook có thể không đủ. Một số nhà phát triển sẽ cố gắng giải quyết thách thức với sự trợ giúp của React Hooks và những người khác sẽ kết hợp React Hooks với Redux.

36. Render có điều kiện trong React?

Render có điều kiện đề cập kết quả động của giao diện người dùng dựa trên điều kiện state. Nó hoạt động tương tự điều kiện JavaScript. Sử dụng render có điều kiện, nó có thể chuyển đổi các hàm ứng dụng cụ thể, API dữ liệu, ẩn hoặc hiện các phần tử, phân quyền, xử lý xác thức,...
Các cách khác nhau cho triển khai render có điều kiện trong React:
  • Sử dụng if-else phù hợp với các ứng dụng vừa và nhỏ.
  • Sử dụng toán tử ba ngôi (?:) giúp giảm bớt câu lệnh if-else phức tạp.
  • Sử dụng biến phần tử, phù hợp cho viết code sạch.

37. Sự khác biệt giữa NavLink và Link?

<Link> dùng cho điều hướng các trang khác nhau trong ứng dụng web. Còn <NavLink> được dùng để thêm thuộc tính cho hoạt động chuyển hướng.
Cú pháp
  • Link:

<Link to="/">Home</Link>

  • NavLink:

<NavLink to="/" activeClassName="active">Home</NavLink>

Ví dụ
index.css

.active {
 color: blue;
}

Routes.js

import ReactDOM from 'react-dom'import './index.css'import { Route, NavLink, BrowserRouter as Router, Switch } from 'react-router-dom'import App from './App'import Users from './users'import Contact from './contact'import Notfound from './notfound' const Routes = ( <Router> <div> <ul> <li> <NavLink exact activeClassName="active" to="/">
                    Home
                </NavLink> </li> <li> <NavLink activeClassName="active" to="/users">
                    Users
                </NavLink> </li> <li> <NavLink activeClassName="active" to="/contact">
                    Contact
                </NavLink> </li> </ul> <hr /> <Switch> <Route exact path="/" component={App} /> <Route path="/users" component={Users} /> <Route path="/contact" component={Contact} /> <Route component={Notfound} /> </Switch> </div> </Router>) ReactDOM.render(Routes, document.getElementById('root'))

38. withRouter trong react-router-dom là gì?

withRouter() là một HOC cho phép truy cập thuộc tính đối tượng history ứng với <Route> gần nhất. Nó sẽ truyền match, location history như props đến component được bọc bất cứ khi nào nó render.
Ví dụ:

import React from "react"import PropTypes from "prop-types"import { withRouter } from "react-router" // A simple component that shows the pathname of the current locationclass ShowTheLocation extends React.Component { static propTypes = { match: PropTypes.object.isRequired, location: PropTypes.object.isRequired, history: PropTypes.object.isRequired } render() { const { match, location, history } = this.props return <div>You are now at {location.pathname}</div> }} const ShowTheLocationWithRouter = withRouter(ShowTheLocation)

39. Cách hiển thị dữ liệu API với Axios?

Axios là một promise dựa trên HTTP để tạo yêu cầu HTTP đến trình duyệt hay web server.
Tính năng
  • Interceptors: Truy cập cấu hình yêu cầu hoặc phản hồi (header, dữ liệu, v.v.) khi chúng gửi đến hoặc đi. Các hàm này có thể hoạt động như các cổng để kiểm tra cấu hình hoặc thêm dữ liệu.
  • Instances: Tạo thực thể có thể tái sử dụng như baseUrl, headers, và cấu hình khác đã thiết lập.
  • Defaults: Thiết lập giá trị chung cho header chung (như Authorization) với các yêu cầu. Nó hữu ích khi bạn cần xác thực đến server trên mọi yêu cầu.
Cài đặt

npm install axios -- save


Các phương thức thường dùng:
  • axios.request(config)
  • axios.get(url[, config])
  • axios.delete(url[, config])
  • axios.head(url[, config])
  • axios.options(url[, config])
  • axios.post(url[, data[, config]])
  • axios.put(url[, data[, config]])
  • axios.patch(url[, data[, config]])
Ví dụ POST:

axios.post('/url',{data: 'data'}) .then((res)=>{ //on success }) .catch((error)=>{ //on error })

Ví dụ GET:

axios.get('/url') .then((res)=>{ //on success }) .catch((error)=>{ //on error })

Xử lý nhiều yêu cầu đồng thời:

function getUserAccount() { return axios.get('/user/12345')} function getUserPermissions() { return axios.get('/user/12345/permissions')} axios.all([getUserAccount(), getUserPermissions()]) .then(axios.spread(function (acct, perms) { // Both requests are now complete }))

POST trong Component:

import React from 'react'import axios from 'axios' export default class PersonList extends React.Component { state = { name: '', } handleChange = event => { this.setState({ name: event.target.value }) } handleSubmit = event => { event.preventDefault() const user = { name: this.state.name } axios.post(`https://jsonplaceholder.typicode.com/users`, { user }) .then(res => { console.log(res) console.log(res.data) }) } render() { return ( <div> <form onSubmit={this.handleSubmit}> <label>
                Person Name:
                <input type="text" name="name" onChange={this.handleChange} /> </label> <button type="submit">Add</button> </form> </div> ) }}

40. Caching trong React?

Ta có thể caching dữ liệu trong React bằng nhiều cách như:
  • Local Storage
  • Redux Store
  • Giữa dữ liệu giữa mounting và unmounting
Memoization là một kỹ thuật mà chúng ta sẽ sử dụng để đảm bảo rằng chúng ta không gặp phải API nếu chúng tôi đã thực hiện một số loại yêu cầu tìm nạp nó ở một số giai đoạn đầu tiên. Việc lưu trữ kết quả của các cuộc gọi tốn kém sẽ tiết kiệm thời gian tải cho người dùng, nhờ đó tăng hiệu suất tổng thể.
Ví dụ:

const cache = {} const useFetch = (url) => { const [status, setStatus] = useState('idle') const [data, setData] = useState([]) useEffect(() => { if (!url) return const fetchData = async () => { setStatus('fetching') if (cache[url]) { const data = cache[url] setData(data) setStatus('fetched') } else { const response = await fetch(url) const data = await response.json() cache[url] = data // set response in cache setData(data) setStatus('fetched') } } fetchData() }, [url]) return { status, data }}

Ở đây ta ánh xạ URL tới dữ liệu của ta. Nếu ta thực hiện yêu cầu nạp dữ liệu hiện có, chúng ta sẽ lấy dữ liệu từ cache cục bộ của mình. Nếu không, ta tiếp tục thực hiện yêu cầu và đặt kết quả vào cache. Điều này đảm bảo tằng ta không gọi lại API khi đã có dữ liệu cục bộ.

Dùng useRef()

Với useRef(), ta có thể thiết lập và truy xuất dữ liệu có thể thay đổi dễ dàng và lưu giá trị suốt vòng đời component.

const useFetch = (url) => { const cache = useRef({}) const [status, setStatus] = useState('idle') const [data, setData] = useState([]) useEffect(() => { if (!url) return const fetchData = async () => { setStatus('fetching') if (cache.current[url]) { const data = cache.current[url] setData(data) setStatus('fetched') } else { const response = await fetch(url) const data = await response.json() cache.current[url] = data // set response in cache setData(data) setStatus('fetched') } } fetchData() }, [url]) return { status, data } }

Sử dụng localStorage


const InitialState = { someState: 'a'}class App extends Component { constructor(props) { super(props) // Retrieve the last state this.state = localStorage.getItem("appState") ? JSON.parse(localStorage.getItem("appState")) : InitialState } componentWillUnmount() { // Remember state for the next mount localStorage.setItem('appState', JSON.stringify(this.state)) } render() {
        ...
    }} export default App

Giữ dữ liệu giữa mounting và unmounting


import React, { Component } from 'react' // Set initial statelet state = { counter: 5 } class Counter extends Component { constructor(props) { super(props) // Retrieve the last state this.state = state this.onClick = this.onClick.bind(this) } componentWillUnmount() { // Remember state for the next mount state = this.state } onClick(e) { e.preventDefault() this.setState(prev => ({ counter: prev.counter + 1 })) } render() { return ( <div> <span>{ this.state.counter }</span> <button onClick={this.onClick}>Increase</button> </div> ) }} export default Counter
14
reactjs
interview
web
javascript

Bài viết mới

Bình luận của bạn

LogoCode4Change

Gia nhập đội ngũ của chúng tôi

Ra đời vào năm 2018, Code4Change là một đội ngũ gắn kết chặt chẽ và luôn chuyên tâm vào việc xây dựng sản phẩm, mang đến giải pháp tối ưu cho khách hàng. Sau 5 năm xây dựng và phát triển, tinh thần đó không hề thay đổi. Chúng tôi mở rộng quy mô với hơn 10 thành viên có chuyên môn và giàu kinh nghiệm thực chiến, đáp ứng mọi yêu cầu của khách hàng về dự án, từ việc lên ý tưởng đầu tiên cho đến ra mắt phát hành cuối cùng. 

Danh mục đầu tư của chúng tôi

Liên lạc

Đặt lịch tư vấn miễn phí

© 2023 Code4Change. All rights reserved.