hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
    • Cấu trúc dữ liệu và giải thuật
    • Lập Trình C# Cơ Bản
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • ReactJS
React strict mode (chế độ phát triển) trong React

React strict mode (chế độ phát triển) trong React

  • 04-10-2022
  • Toanngo92
  • 0 Comments

Tháng 8 năm 2018, React React bổ sung Component <React.StrictMode /> , vì lí do đó, khi khởi tạo bất kì dự án nào của React, trong file index.js của ứng dụng luôn luôn bắt đầu với cấu trúc như sau:

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
   <React.StrictMode>
    <App />
   </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

Để hiểu vấn đề này, chúng ta cần tìm hiểu rõ hơn về Life Cycle trong React:

Ở các phiên bản trước, nhận ra sự phức tạp của vòng đời React, component có thể mount, rồi unmount lại nhiều lần mà vẫn giữ nguyên state trước đó, và có nhiều tình huống useEffect bị gọi lại nhiều lần gây lỗi logic, nên từ phiên bản React 18 trở đi, chế độ này được React phát triển với kì vọng giúp các developer kiểm tra trước các vấn đề trong môi trường development, (khi component được mount lại sau khi unmount có gây ảnh hưởng tới state không) nhằm hỗ trợ các developer cũ dễ dàng update phiên bản và giúp nhận diện các lỗi dễ phát sinh trong quá trình phát triển.

Vậy tại sao phải quan tâm tới chế độ này ?

Mục lục

  • Strict Mode sẽ chạy code 2 lần
  • Giải quyết vấn đề code chạy 2 lần

Strict Mode sẽ chạy code 2 lần

Đây là một vấn đề ai tiếp cận ReactJS với dự án mới gần đây đều gặp phải (bao gồm cả mình). Chế độ nghiêm ngặt của React thực hiện là chạy một số method (phương thức)/ callback (lệnh gọi lại) nhất định hai lần (CHỈ ở chế độ DEV). Các method, callback sau sẽ được chạy hai lần ở Chế độ nghiêm ngặt (CHỈ ở chế độ DEV):

  • Class component constructor method
  • Render method (bao gồm function component)
  • setState updater functions (tham số đầu tiên)
  • static getDerivedStateFromProps lifecycle
  • React.useState state initializer callback function
  • The React.useMemo callback

React làm điều này vì nó không thể cảnh báo bạn một cách đáng tin cậy về các tác dụng phụ mà bạn thực hiện trong các phương pháp đó. Nhưng nếu những phương thức đó là không cần thiết, thì việc gọi chúng nhiều lần sẽ không gây ra bất kỳ rắc rối nào.

Lưu ý rằng các lệnh gọi lại useEffect và useLayoutEffect không được gọi hai lần ngay cả trong chế độ nhà phát triển + chế độ nghiêm ngặt vì toàn bộ điểm của các lệnh gọi lại đó là thực hiện các tác dụng phụ.

Lưu ý :

useEffect và useLayoutEffect không được gọi hai lần trong chế độ nhà phát triển.

useReducer bạn truyền cho React.useReducer cũng không được gọi hai lần trong chế độ nhà phát triển.

Tất nhiên, khi deploy ứng dụng bằng script build, tất cả các cảnh báo sẽ biến mất và lệnh gọi lại chỉ được gọi một lần. Điều này là do những thứ này chỉ ở đó để giúp bạn trong quá trình phát triển và sẽ không ảnh hưởng đến ứng dụng trong môi trường production.

Giải quyết vấn đề code chạy 2 lần

Tham khảo tại Stack Overflow (reducer function is being called twice)

Để giải quyết vấn đề này, việc đơn giản và hay sử dụng nhất trong thực tế là chúng ta cần loại bỏ cấu trúc <React.StrictMode> đang bọc component <App/> trong file index.js và chỉ sử dụng nó trong quá trình phát triển tính năng mới để debug ứng dụng. Ví dụ:

function App() {
  return (
    <div>
      <SomeComponent />
      <React.StrictMode>
        <SomeNewFeature />
      </React.StrictMode>
      <SomeComponent />
    </div>
  )
}

Bạn có thể sử dụng ở bất kỳ đâu trong ứng dụng của mình ở bất kỳ độ sâu nào. Đây có thể là một cách tuyệt vời để chọn một số phần nhất định của ứng dụng của bạn vào chế độ nghiêm ngặt mà không nhận được rất nhiều cảnh báo ở khắp mọi nơi. Chúc bạn thành công !

Bài viết liên quan:

useMemo trong ReactJS
Định tuyến trong ứng dụng React với React Router
Giới thiệu Redux và quản lý state với Redux trong React
Gọi API trong React với useEffect Hook
Xử lý tải dữ liệu bất đồng bộ (Async Data Loading), lazyload trong React
Xử lý Form (biểu mẫu) trong React
Xử lý các sự kiện trong DOM và Window bằng React
Debug (gỡ lỗi) React component thông qua React Developer Tools
khái niệm React Context và chia sẻ state qua các component với React Context
Cách quản lý state(trạng thái) bằng Hooks trên React Component
Quản lý state (trạng thái) trong React Class Component
Hướng dẫn định kiểu (style) cho React Component

THÊM BÌNH LUẬN Cancel reply

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

2. PHÂN TÍCH VÀ ĐẶC TẢ HỆ THỐNG

1. TỔNG QUAN KIẾN THỨC THỰC HÀNH TRIỂN KHAI DỰ ÁN CÔNG NGHỆ THÔNG TIN

Hướng dẫn tự cài đặt n8n comunity trên CyberPanel, trỏ tên miền

Mẫu prompt tạo mô tả chi tiết bối cảnh

Một số cải tiến trong ASP.NET Core, Razor Page, Model Binding, Gabbage collection

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×