React useEffect hook chi tiết dành cho người mới | React JS

Поделиться
HTML-код
  • Опубликовано: 4 фев 2025

Комментарии • 92

  • @F8VNOfficial
    @F8VNOfficial  3 года назад +34

    👉 Trong video có đoạn mình nói ngược, add/remove event listener mới là dựa trên observer pattern (publish/subscribe) các bạn nhé. Mình chia video làm 4 phần siêu chi tiết, các phần sau mỗi video khoảng hơn 10 phút. Mình sẽ nói về:
    1. useEffect với dependencies
    2. useEffect với DOM event listener
    3. useEffect với setInterval, setTimeout

    • @giahuyha6189
      @giahuyha6189 3 года назад +2

      cho em hỏi là trong làm việc thực tế khi có nhiều Effect chỉ chạy 1 lần thì anh thường gom vào code chung trong 1 useEffect hay tách ra ạ

    • @ducvo1679
      @ducvo1679 3 года назад +1

      cảm ơn thầy Sơn rất nhiều ạ 🥰

    • @F8VNOfficial
      @F8VNOfficial  3 года назад +6

      @@giahuyha6189 Logic khác nhau (làm các việc khác nhau) thì em tách ra làm nhiều useEffect nhé

  • @annbui6900
    @annbui6900 Год назад +16

    Em cám ơn thầy Sơn nhiều lắm ạ. Nhờ loạt video giải thích tường tận ba cách dùng của useEffect, em đã đậu vào dream company 🙌🏼😄❤️
    Đây là lần thứ ba em phỏng vấn lại, tạch hai lần trước và cuối cùng lần này đậu. Lúc người ta hỏi về useEffect, em trả lời như được mùa ấy, tường tận phân tích 3 cách dùng lẫn ví dụ từ thầy Sơn.
    Cám ơn thầy Sơn đã rất có tầm có tâm, nhờ có video thầy Sơn không thôi em bơi theo mệt nghĩ. Hehe
    Chúc thầy Sơn luôn nhiều sức khỏe.
    Học trò từ phương xa 😄

  • @ThienNguyen-ec7le
    @ThienNguyen-ec7le 3 года назад +1

    Tốc độ ra video quá tuyệt vời luôn học thôi ae ơi!

  • @hiephoangvan943
    @hiephoangvan943 3 года назад +4

    Anh dạy rất kĩ, ngày nào cũng hóng anh ra bài mới để học ^^

  • @mak8naf0813
    @mak8naf0813 3 года назад +4

    cái cách vào video rồi mở laptop lên sau này có thể thành thương hiệu của anh Sơn luôn ấy (~ ̄▽ ̄)~

  • @nguyenquocan8949
    @nguyenquocan8949 3 года назад +2

    anh dạy kĩ vô cùng, dễ hiểu nữa

  • @deporesmartino1472
    @deporesmartino1472 2 года назад +1

    Dạy rất kỹ và hay , cảm ơn anh nhiều

  • @dpd246
    @dpd246 3 года назад

    Hay quá anh ơi, em vẫn mông lung phần này mà nay anh nói em thấy dễ hiểu quá ạ ^^

  • @tiendung2071
    @tiendung2071 Год назад

    e cảm ơn a nhiều ạ, may mà có a mà mấy cái hook e làm quen trong 1 nốt nhạc

  • @noras9835
    @noras9835 3 года назад

    Cảm ơn anh video hữu ích lắm ạ, phong cách chân thật mà hiện đại 🤗

  • @duahaugaming8715
    @duahaugaming8715 3 года назад

    cảm ơn anh, video hay quá, hôm qua em vừa gặp lỗi với call api ^^

  • @NghiaLe-uz5gg
    @NghiaLe-uz5gg Месяц назад

    mn cho em hỏi là Khi mà nhấn nút "Toggle" trong App, component Content được mounted vào DOM. Thì React sẽ render JSX của Content đầu tiên (trả về và với posts là mảng rỗng lúc đầu) hay là sẽ gọi useEffect trước. Em thấy trong video có bảo là "Callback của useEffect sẽ được gọi sau khi component mounted ".

  • @HuyNguyen-vl4yl
    @HuyNguyen-vl4yl 2 года назад

    Cảm ơn anh video rất dễ hiểu

  • @ThinhNguyen-zb6rv
    @ThinhNguyen-zb6rv 3 года назад

    Quá tuyệt vời anh ơi , em cảm ơn anh nhìuuu

  • @tiendatniit
    @tiendatniit Год назад

    Video vô cùng bổ ít cho ae nào muốn leo rank :)

  • @nhanhautran3882
    @nhanhautran3882 2 года назад

    Em cám ơn anh rất nhiều !!!

  • @amanda2348-g9j
    @amanda2348-g9j 2 года назад

    13:05 giải thích tại sao viết code trong useEffect

  • @benalpha2297
    @benalpha2297 3 года назад

    Hóng video a Sơn như hồi xưa hóng quà mẹ đi chơ về :)))))))))

  • @tuantuthan8825
    @tuantuthan8825 2 года назад

    cảm ơn anh ạ

  • @amanda2348-g9j
    @amanda2348-g9j 2 года назад

    17:00 strictMode

  • @hoaimiqng
    @hoaimiqng 3 года назад

    Fan cứng 😊

  • @duongnguyen6647
    @duongnguyen6647 3 года назад +1

    Video này anh đc 9.5đ thôi nhé, ì phéc k phải e phệch nha anh 😀

    • @F8VNOfficial
      @F8VNOfficial  3 года назад +2

      Âm "k" mà đọc lên giọng á em. Em lại cao thủ Eng lích à 🤣🤣. Vẫn cảm ơn góp ý của em nhiều nha vì nhiều từ anh vẫn đọc sai tè le ý mà. Chủ yếu em nên focus vào nội dung nhé

  • @duyphan2919
    @duyphan2919 3 года назад

    anh dạy kĩ quá chắc em khỏi đọc docs :))

  • @luubaoncter8734
    @luubaoncter8734 3 года назад +1

    Về ví dụ sử dụng useEffect chỉ truyền callback ở phút 8:50 thì em/mình có thắc mắc là: Trong thẻ input mình đâu cần phải đặt lại attribute value={ title } đúng không anh/mọi người ?

    • @realhoanghai
      @realhoanghai 3 года назад +1

      đặt để tận dụng 2 way binding á b

    • @trandinhthang5778
      @trandinhthang5778 2 года назад +1

      không nhất thiết phải đặt trong mọi trường. trường hợp như bạn muốn set lại value rỗng thì mới cần

  • @huy4854
    @huy4854 3 года назад

    Anh làm API luôn nha anh

  • @CuongNguyen-oh5xm
    @CuongNguyen-oh5xm Год назад

    em thấy anh để lại cái stricMode 17:49 nhưng 23:22 anh vẫn chạy 1 lần là sao ạ. em kh hiểu

  • @pineapplesub3581
    @pineapplesub3581 3 года назад

    Hay quá anh ơi!

  • @benalpha2297
    @benalpha2297 3 года назад

    20:28 Anh cho em hỏi chỗ này khi setPosts bằng một giá trị reference (như array trong clip) thì sẽ bị rơi vào lòng lặp vô tận, nhưng khi setPosts là một giá trị primitive như số hoặc chuỗi thì lại ko bị nhỉ?

    • @F8VNOfficial
      @F8VNOfficial  3 года назад +3

      React nó dùng toán tử === để so sánh, nếu state mới khác state cũ nó sẽ render lại em nhé. Trong ví dụ dùng array như trong clip bị render lại vì mỗi lần setPosts là 1 array mới em nhé (khác địa chủ vùng nhớ).

    • @benalpha2297
      @benalpha2297 3 года назад

      @@F8VNOfficial À à em quên mất, state nó trùng với state trước thì nó đâu render lại làm gì haha 😁 Cảm ơn anh.

  • @vangianginh4224
    @vangianginh4224 3 года назад

    hay quá a ơi

  • @lanhanhnguyen4577
    @lanhanhnguyen4577 3 года назад

    Chạy bo không bằng a Sơn ra video rùi^^

  • @hungoan7699
    @hungoan7699 2 года назад +1

    A Sơn e có 1 số câu hỏi về kỹ thuật muốn hỏi thì có thể gửi qua đâu được anh?

  • @triuc8755
    @triuc8755 Год назад

    Có ai biết cách co, kéo của sổ ưindow phút @5:50 như anh sơn không?
    Chỉ mình với.
    Mò mãi không ra

  • @dung_gl
    @dung_gl 3 года назад

    quá đỉnh luôn anh ơi

  • @DeepDiveIntoLife196
    @DeepDiveIntoLife196 3 года назад +1

    Chào anh ...

  • @pntmusic8670
    @pntmusic8670 3 года назад +1

    Trong useEffect ta return thi ket qua nhu nao anh

  • @congnamle3632
    @congnamle3632 3 года назад

    Hay quá anh ơi

  • @huyhoang8679
    @huyhoang8679 3 года назад +1

    Video bổ ích.
    Hời ơi bảo sao nó chạy vô tận, lên đọc docs chục lần vẫn ko biết chán nản luôn. Mà anh ơi đọc docs cũng phải có cách đúng ko ạ, em đọc doc thật sự thấy trang Mozila là giao diện đẹp, dễ nhìn dễ tim, dễ hiểu, em có đọc docs của Microsoft mà thấy rối quá.

    • @anhJourney
      @anhJourney 3 года назад

      docs nhiều cái xem hiểu sơ sơ thôi chứ chủ yếu vẫn phải có thầy dậy mới hiểu được bạn ạ. Như sau học react rồi học Material UI ko có thầy dạy bó tay luôn =))

  • @Steve_Duong
    @Steve_Duong 2 года назад

    ❤❤❤❤

  • @thunguyen-om4mb
    @thunguyen-om4mb 3 года назад +1

    a ơi , a có mở lớp online dạy js k ạ ?

  • @petslover4306
    @petslover4306 3 года назад

    Thật sự quá hay. Dạy rất có tâm ! Tuyệt vời.

  • @QNhuCK
    @QNhuCK 2 года назад +8

    Anh cho em hỏi, em đọc doc React có đoạn này:
    [ Does useEffect run after every render? Yes! By default, it runs both after the first render and after every update. (We will later talk about how to customize this.) Instead of thinking in terms of “mounting” and “updating”, you might find it easier to think that effects happen “after render”. React guarantees the DOM has been updated by the time it runs the effects. ]
    Theo em hiểu thì mounted với render là không giống nhau, nhưng đoạn này nói nghe có vẻ giống nhau. Anh giải thích thêm chỗ này giúp em được không ạ?

    • @NguyenNguyen-fj1qh
      @NguyenNguyen-fj1qh 2 года назад +9

      Trong React, mỗi component có một hàm render() chứa các thông tin về cách component sẽ được hiển thị trên trình duyệt. Khi component được tạo ra và thêm vào DOM, điều này gọi là "mounting".
      Quá trình mounting bắt đầu bằng việc tạo một instance của component và gọi hàm componentDidMount(), sau đó component được thêm vào DOM. Nếu trạng thái của component thay đổi, hàm render() sẽ được gọi lại để cập nhật UI và hiển thị các thay đổi mới.
      Vậy, "mounting" là quá trình tạo ra và thêm component vào DOM, trong khi "render" là việc hiển thị component trên trình duyệt dựa trên thông tin trong hàm render().
      Ví dụ, chúng ta có một component tên là UserProfile với một thuộc tính username:
      import React, { useState, useEffect } from 'react';
      function UserProfile({ username }) {
      const [userData, setUserData] = useState(null);
      //componentDidMount()
      useEffect(() => {
      // Call API to fetch user data
      fetch(`api.example.com/users/${username}`)
      .then(response => response.json())
      .then(data => {
      setUserData(data);
      });
      }, [username]);
      if (!userData) {
      return Loading...;
      }
      //render()
      return (

      {userData.name}
      {userData.email}

      );
      }
      Khi component UserProfile được tạo ra và thêm vào DOM, hàm componentDidMount() sẽ được gọi. Trong ví dụ trên, chúng ta sử dụng useEffect để gọi API và lấy dữ liệu của người dùng. Khi dữ liệu được trả về, chúng ta sử dụng setUserData để cập nhật trạng thái và gọi lại hàm render() để hiển thị thông tin của người dùng.

  • @DukeLe35
    @DukeLe35 3 месяца назад

    xin qua 🎉

  • @amanda2348-g9j
    @amanda2348-g9j Год назад

    7:32 Tại sao đoạn này cũng dùng StrictMode mà nó không console log ra "Mounted" 2 lần vậy ạ, e thử nó console log ra 2 lần mà a?

    • @ThangNguyen-wh2vk
      @ThangNguyen-wh2vk 11 месяцев назад

      mình cũng bị như này, bây h bạn biết lý do chưa chỉ cho mình vs, mình cảm ơn bạn nhiều

    • @rayun7014
      @rayun7014 10 месяцев назад

      @@ThangNguyen-wh2vk Mình xóa StrictMode đi bạn mình cũng bị v

  • @minhduynguyen884
    @minhduynguyen884 2 года назад +4

    Sao em thử console.log trong useEffect( () => { console.log('test') }) thì nó lại in ra test tới 2 lần vậy á. Mong được các cao nhân chỉ giáo

    • @vunguyenhuy3688
      @vunguyenhuy3688 2 года назад +1

      mình cũng bị xong bạn pp nào chưa'

    • @atchaukhac7731
      @atchaukhac7731 2 года назад +1

      đoạn 17:10s a Sơn có nói do cái Strictmode nha các bạn.

  • @manhhoach2575
    @manhhoach2575 Месяц назад

    máy em 32gb mà code đến phút21 hơi đơ, xem task manager thấy cắn 2gb ram

  • @vuongqtvn
    @vuongqtvn 3 года назад

    ❤️

  • @deverycode
    @deverycode 3 года назад

    Học xong khóa React JS thử build quả web F8 clone =)))

  • @linhtaquang8650
    @linhtaquang8650 3 года назад

    Mình làm giống anh Sơn, nhưng dùng API trên trang thời tiết. Cứ mỗi lần f5 thì giá trị lại trở về giá trị undifined, gây ra lỗi k trỏ đến được property mọi người có thể chỉ mình cách khắc phục không

  • @manquangduy6932
    @manquangduy6932 Год назад

    trường hợp 1 nó lắp vô cùng là vì sao ạ

  • @vunguyenhuy3688
    @vunguyenhuy3688 2 года назад

    sao em viết như anh mà gọi content thì dù sài useEffect vẫn in ra mounted vậy

  • @namlethanh607
    @namlethanh607 3 года назад

    Anh cho em hỏi sao em mở cái console lên mà nó không hiện gì ạ

  • @ngthuongnguyen9804
    @ngthuongnguyen9804 2 года назад

    A ơi cho e hỏi, sau lần .then() thứ nhất thì kết quả nhận về .then() thứ 2 chứa data rồi sao mình còn đặt state là mảng rỗng đc ạ

    • @F8VNOfficial
      @F8VNOfficial  2 года назад

      Ở phút/giây nào em nhỉ

    • @ngthuongnguyen9804
      @ngthuongnguyen9804 2 года назад

      @@F8VNOfficial vâng a, ở phần promis bắt đầu phút thứ 20 a ơi?

    • @F8VNOfficial
      @F8VNOfficial  2 года назад +1

      Mảng rỗng nó đặt làm initialState thôi em ơi, sau đó, API gọi lấy đc mảng dữ liệu posts (phần then thứ 2) sẽ set lại state em nhé. Sau khi set lại, thì state posts không phải là mảng rỗng ban đầu nữa.

    • @ngthuongnguyen9804
      @ngthuongnguyen9804 2 года назад

      Dạ vâng, e cảm ơn a!

    • @ngthuongnguyen9804
      @ngthuongnguyen9804 2 года назад

      cho e làm phiền a xíu nữa. cho e hỏi trong thằng .then() thứ 2 là: .then(posts => {setPosts(posts)} ) thằng posts đứng trước, trước khi setPosts nó rỗng hay chứa dữ liệu api trả về ạ. e cảm ơn anh

  • @tripham8864
    @tripham8864 3 года назад

    Về sau anh có dùng axios để gọi api ko ạ. E đang dùng th này với useEffect nhưng còn khá mơ hồ

    • @F8VNOfficial
      @F8VNOfficial  3 года назад

      Khác gì đâu em nhỉ, trong JS có XHR và fetch để call API thôi. Thì axios cũng là dùng XHR thôi mà, mơ hồ kiểu gì em nói ra anh xem

    • @tripham8864
      @tripham8864 3 года назад

      @@F8VNOfficial dạ, khi e ở component con dùng POST và cập nhật lại state ở component cha có useEffect dùng GET thì lệnh GET của component cha ấy chưa nhận đc cái của th POST mà re-render luôn ạ. Có vẻ như vấn đề này là side effects chứ ko nằm ở axios ạ. E cảm ơn a đã quan tâm.

    • @F8VNOfficial
      @F8VNOfficial  3 года назад

      ​@@tripham8864 Đúng rồi em, không liên quan gì tới axios hết em nhé. Em check lại xem tác nhân nào gây ra việc component cha bị re-render nhé, xem có thao tác nào setState hay dispatch redux action nào gây ra việc re-render đó.

    • @tripham8864
      @tripham8864 3 года назад

      @@F8VNOfficial em fix được rồi cảm ơn a. Hóng về sau a có video về tổ chức call API chứ gọi trực tiếp ở useEffect có vẻ ko chuyên nghiệp lắm :D

    • @F8VNOfficial
      @F8VNOfficial  3 года назад

      ​@@tripham8864 Theo em không chuyên nghiệp ở chỗ nào em?

  • @nguoixanh
    @nguoixanh 3 года назад

    Bạn ơi cho mình hỏi:
    Mình tạo custom hook (call API), tại component sử dụng nó, mình muốn là khi nhấn vào 1 button mới gọi hook để call API, nên mình call hook trong hàm handleClick, nhưng nó báo "Invalid hook call. Hooks can only be called inside of the body of a function component".
    Có cách nào giải quyết (trong thực tế đi làm) bạn nhỉ?

    • @trietnguyenhoangminh8811
      @trietnguyenhoangminh8811 Год назад

      này là do bạn đang dùng class component nên nó mới ko cho sử dụng hook đó

  • @vankhanhinfo
    @vankhanhinfo 2 года назад

    Cho em hỏi chút, mỗi lần nhập ký tự vào ô input thì lại re-render lại component, điều này có ảnh hưởng đến performant ko ạ, ví dụ component đó có nhiều element

    • @lightd1404
      @lightd1404 2 года назад

      theo mình nghĩ là nõ cũng ảnh hưởng đó nhưng với dụ án to =)) cón như mh ví dụ nhỏ nhỏ thì chắc k sao

  • @thanhhuytruong31
    @thanhhuytruong31 3 года назад +1

    anh ơi , vậy return trong useEffect thì sao ạ

    • @tuanpham-vb5sd
      @tuanpham-vb5sd 3 года назад +1

      phần code return sẽ đc chạy khi component unmount đấy b

  • @vuongtranminh4890
    @vuongtranminh4890 3 года назад

    Nếu phần callAPI e để là 1 hàm return về posts ở giá trị initial của useState thì cũng chỉ được gọi có 1 lần như vậy có được không ạ? A giải thích cho e với ạ

    • @trandinhthang5778
      @trandinhthang5778 2 года назад +2

      useState sẽ được thực thi rồi mới render UI. viêc bạn call api sẽ block việc render UI rồi. vì vậy nên sử dụng useEffect vì hàm callback trong useEffect sẽ được gọi sau khi render UI. anh Sơn có giải thích khúc side effect đó bạn

    • @vuongtranminh4890
      @vuongtranminh4890 2 года назад

      @@trandinhthang5778 cảm ơn bạn mình hiểu rõ rồi

  • @hieunguyenthanh5328
    @hieunguyenthanh5328 8 месяцев назад

    ❤❤❤❤