useRef() hook | Cách sử dụng useRef() hook

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

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

  • @LapTrinhThatKyDieu
    @LapTrinhThatKyDieu 3 года назад +36

    cái quan trọng không phải là useRef sẽ đc call ở mounted, nó sẽ được call ở lần đầu render component. và mỗi khi setState qua useState sẽ dẫn đến rerender component, nhưng set giá trị cho ref thì không.
    việc dùng useRef thay vì move biến ra ngoài component(tạo closure) là bởi do logic sẽ cần phải duy trì trong vòng đời của component, nếu move ra closure thì sinh ra nhiều instances của component đó sẽ dùng cùng 1 data(semi global), nó sẽ phù hợp với các chức năng cần thế, ví dụ tạo unique ID cho mỗi component chẳng hạn.

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

      Cảm ơn bạn về góp ý cực kì chính xác và hữu ích với mình nhé. Thật sự lúc quay video mình không có nghĩ tới semi global luôn ý. Cảm ơn bạn nhiều nhé 😍😍

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

      Ơ anh Tiệp ạ, bấm vô kênh em mới nhận ra. Hâm mộ anh đã lâu ạ, đúng expert comment chỉ có chuẩn. Em học hỏi nhiều được từ comment của anh, hi vọng sẽ có thêm nhiều góp ý của anh hơn. Sáng ra được idol comment chắc vui cả ngày 😍😍

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

      @@F8VNOfficial bữa nào rảnh anh nói sâu thêm vụ này cho mấy bạn hiểu nha. thanks anh.

    • @atnguyentien7770
      @atnguyentien7770 Год назад +1

      @@F8VNOfficial anh cho em hỏi tạo sao tạo unique ID cho mỗi component lại move biến ra ngoài component

    • @thanhduynguyen6253
      @thanhduynguyen6253 11 месяцев назад

      @@atnguyentien7770 tại vì cơ chế hoạt động của React và Javascript là khi 1 hàm (ở đây function component cx là 1 hàm, như video đã đề cập), khi render thì function component sẽ chạy lại, và khi chạy lại thì giá trị của cai unique ID sẽ được set lại chứ không còn giữ giá trị khi bạn đã setInterval nữa. Nói chung vde này liên quan đến scope của biến đó

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

    Rất hay và sâu sắc luôn ạ, cám ơn a Sơn 😍

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

    Hay quá, coi 3 lần rồi, càng xem càng thấy hay

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

    Cảm ơn anh nhiều ạ! Xem rất dễ hiểu và đầy đủ

  • @thangdoan.
    @thangdoan. 2 года назад

    Anh Sơn Mãi Đỉnh !!!!

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

    anh Sơn ơi nếu như em nhấn start nhiều lần là nó sẽ chạy càng nhanh hơn á anh. Anh xem có cách ào fix lại không anh

    • @tranxuantien1495
      @tranxuantien1495 2 года назад +7

      mình fix được rồi, đây là code cho bạn nào cần.
      const handleStart = () => {
      if (timerID.current) {
      } else {
      timerID.current = setInterval(() => {
      setShow((prev) => prev - 1);
      }, 1000);
      }
      };
      const handleStop = () => {
      clearInterval(timerID.current);
      timerID.current = false;
      };

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

    9:50 kích liên tục vào nút Start, sẽ thấy số giây đêm nhanh chậm lung tung, console.log ra thì thấy số nhảy tưng tưng, là sao vậy các bạn?

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

      vì chưa clear các interval cũ đấy bạn, sẽ có nhiều interval chạy song song, các interval đó dùng hàm setState, mà hàm này chạy bất đồng bộ nên các kết quả bị lung tung

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

      Bạn dùng useEffect rồi cleanup function vào ấy bạn

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

    thay vì dùng một useRef() để gán giá trị thì có thể dùng state để thay thế ko a.

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

      Được em nhé, nhưng sai mục đích của khái niệm được sinh ra. Em ko re-render thì ko cần xài state

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

    Khi em bấm vào chữ start nhiều lần nhiều setInterval sẽ bị gọi nhiều lần, số cũng bị giảm nhanh không ấn stop được. Nên em fix bằng cách cho thêm dòng này vào đầu hàm handleStart() :
    timerId.current && clearInterval(timerId.current);

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

      chỉ cần clearInterval(timerId.current) để khi component render lại nó xóa timerId cũ rồi gán lại timerId mới là được rồi ấy

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

    useRef thì nên so sánh với property trong class chứ so sánh với 1 biến global bên ngoài vậy k đúng. Khi sinh ra nhiều instance của component đó thì sẽ ntn?

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

    Click button Start thì count sẽ đếm ngược 1 đơn vị. nhưng nếu click "Start" nhiều lần thì count đếm ngược loạn xạ lên thầy ạ. phần này fix như nào vậy Thầy

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

    Chỗ handleStart lúc đầu có setState đc để clearInterval ko a nhỉ :v

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

      Cần clearInterval đi không nếu bấm liên lục Start thì nó cứ setInterval liên tục time chạy max nhanh, khỏi Stop luôn. Mà hình như bên ngoài cũng cần 1 cái clearInterval không lúc đang chạy mà Toggle cái là lỗi tràn bộ nhớ ngay

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

      Mình nghĩa gán setInterval váo 1 biến rồi dùng useEffect clear luôn cho nhanh bác

  • @rezsz3494
    @rezsz3494 7 месяцев назад

    cam on ban toi da dat diem 10

  • @thanhbinhnguyen5943
    @thanhbinhnguyen5943 6 месяцев назад

    bài này nếu tình huống user nhấn start liên tục thì hàm setInterval sẽ được gọi lại nhiều lần và leak memory đúng k ạ ?

    • @ucluu2948
      @ucluu2948 5 месяцев назад

      chuẩn chuẩn, mình có code ra như này nè
      const handleStart = () => {
      if (timeOut.current) {
      clearInterval(timeOut.current);
      }
      timeOut.current = setInterval(() => {
      setCount((prevState) => prevState - 1);
      }, 1000);
      };
      const handleStop = () => {
      if (timeOut.current) {
      clearInterval(timeOut.current);
      timeOut.current = null;
      }
      };
      bạn tham khảo nha

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

    E hay dùng ref này cho audio với video 😄

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

      Dùng với audio, video cũng tương tự như với các thẻ khác đó em. Đều là tham chiếu tới DOM element đó

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

    a sơn ơi, vd mình muốn lấy nhìu element thì mình phải dùng nhìu useRef đúng hk a, hay là mình chỉ lấy 1 element cha r mình query tới mấy child bên trong vậy ạ. e cảm ơn

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

      Đúng rồi, làm như code thuần thôi bạn. Nhưng cái này ít dùng khi làm với React, vì hầu hết mọi bài toán phổ thông sẽ có cách giải quyết bằng React (dùng state để thay đổi elements). Trong một số bài toán đặc thù hơn, cần can thiệp trực tiếp vào DOM elements mà không qua React elements thì mới phải dùng thuần bạn nhé

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

      dạ em cảm ơn a Sơn rất nhiều ạ

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

    chào anh Sơn, em muốn làm 1 timer như trên nhưng không có nút 'dừng lại', khi em bấm vào nút 'bắt đầu' thì đồng thời nó vừa đếm ngược và vừa ẩn cái nút 'bắt đầu' đi, anh có thể chỉ em cách làm được không? Rất mong anh trả lời comment của em, cảm ơn anh! :D

    • @TMT-ii3ro
      @TMT-ii3ro 2 года назад

      cái này bạn cho nó một cái cờ true/false => đầu tiên vào cho nó bằng true->hiện
      sau khi onClick set nó lại false->ẩn

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

      dung boolean classname theo 1 state di la duoc ban a

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

    Anh Sơn ơi, tai sao em ấn start 3 lần sau đó ấn stop lại không dừng được. anh có thể giải thích giúp em không

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

      const handleStart = () => {
      if(timeid.current){
      }else{
      timeid.current = setInterval(() => {
      setCountDown(prev => prev - 1)
      console.log('start' )
      }, 100)
      }
      };
      const handleStop = () => {
      clearInterval(timeid.current)
      timeid.current = ''
      console.log('stop')
      };

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

      e tự fix đc r heehe. cho b nào cùng thắc mắc

  • @namnguyen-tl6gt
    @namnguyen-tl6gt 3 года назад

    Hay quá anh ơi

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

    hay quá đi anh

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

    Cảm ơn bạn. Bài học rất hay.. Hiện tại mình có đang gặp một vấn đề khi re-render lại dữ liệu ở 2 commponent vd: làm sao để cập nhật thông tin user trên Nav khi mình cập nhật thông tin ở component User ( cả 2 thằng này cùng cấp chỉ nhận App làm cha) Rất mong bạn giải đáp giúp mình. Thanks!!!

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

      Dùng context API của react hoặc thư viện redux ấy b

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

    tuyệt vời anh :3

  • @longnguyen-sh3cg
    @longnguyen-sh3cg 3 года назад

    Nếu muốn lấy 1 thánh phần trong React
    thì nên dùng document.queryselector() hay dùng ref gắn cho element vậy mọi người ?

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

      Theo mình là dùng useRef, vì component chạy code từ trên xuống và add phần return vào DOM gần như sau cùng(hiện tại mình chỉ biết useEffect/useLayoutEffect chạy sau cùng) thế nên nếu dùng document.queryselector ngoài useEffect thì lúc đó trong DOM thật chưa có gì cả, nên không thể get Element được

  • @h.n.a.d7804
    @h.n.a.d7804 3 года назад

    sao trên web f8 chưa có vậy ạ

  • @tge-hung2465
    @tge-hung2465 3 года назад

    hay qua anh oi

  • @DuyTran-ss4lu
    @DuyTran-ss4lu 2 года назад

    Hay

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

    Hay anh ơi

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

    tại sao lại dùng ref mà không dùng getElementByID ạ?

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

      vì mình đang học react chứ ko phải học js

    • @HieuTran-ej4yn
      @HieuTran-ej4yn 2 месяца назад

      React ai dùng getelement nữa cha

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

    Anh Sơn ơi tại sao console.log(h1Ref.current) lại cần cho vào trong useEffect ạ? em log ở ngoài nó undifi

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

      Vì callback trong useEffect nó được gọi sau khi elements đc mounted vào DOM. Em xem kỹ lại bài useEffect em nhé

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

    setState được thực thi sau khi state được gọi

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

    e nghĩ a nên có thêm video về class component nữa a ạ. trc e có chợt thấy component life cycle nên muốn học, nhỡ có lúc cần dùng thì sao. e nghĩ những bạn mới học fw fe chắc chưa biết đến life cycle nhiều nên có video sẽ tốt hơn ạ

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

      Anh sẽ cố gắng em ơi, class trông thế mà đi làm thực tế nhiều khi phải maintain dự án cũ vẫn dùng class component em ơi

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

      @@F8VNOfficial ít có channel nào dạy hay như anh nên em chẳng muốn xem ở đâu nữa, chỉ muốn xem a dạy thôi 😂

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

    😍😍😍 quá hay

  • @bachkhoait4.052
    @bachkhoait4.052 2 года назад

    Em nhìn vào con số đếp ngược em lại sợ . Vì em sợ thời gian trôi nhanh

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

    a nói về redux đi ạ

  • @NhatNguyen-zg6il
    @NhatNguyen-zg6il 2 года назад

    11:40 preState , State

  • @11.tavanhung92
    @11.tavanhung92 3 года назад +1

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

    mình sinh viên năm nhất đang học c++ thì dùng ứng dụng gì thực hành cho dễ vậy ạ, mình có tải cái visual studio mà nó k chạy đc, ai biết trả lời giúp mình với

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

    5:30 nếu viết ra ngoài thì mất chất react kk

  • @NhatNguyen-zg6il
    @NhatNguyen-zg6il 2 года назад

    9: