thắc mắc Tại sao ReactJS lại hot đến vậy ạ?

  • Người tạo chủ đề Người tạo chủ đề Celsius
  • Ngày bắt đầu Ngày bắt đầu
https://fsoft-academy.edu.vn/course/professional-react-developer/
Em định bỏ tiền học khóa này, các bác đánh giá giúp em khóa này có đáng học không ạ. Em chưa biết gì ngoài html, css
Em cảm ơn các bác
không
không chỉ khoá này mà mọi khoá dạy React đều không đáng học
ngày xưa docs React còn nghèo nàn thì học cũng được. Chứ còn bây giờ docs React xịn xò với rõ ràng hơn rất nhiều r
Cứ setup một project r tự học hỏi th là được

via theNEXTvoz for iPhone
 
Nếu khong thích ReactJS có thể tham khảo NextJS :mad: NextJS sẽ là tương lai :nosebleed:
s e nghe bác khuyên kiểu đừng học cấp 1, học thẳng cấp 2 đi. js là nền móng của reactjs, reactjs là nền móng của nextjs, k học th trước s biết th sau tnao mà làm. :sweat:

Angular nó không bị 5 người 10 ý như react => high maintainability

e nhớ k nhầm react là library, angular là framework
 
s e nghe bác khuyên kiểu đừng học cấp 1, học thẳng cấp 2 đi. js là nền móng của reactjs, reactjs là nền móng của nextjs, k học th trước s biết th sau tnao mà làm. :sweat:



e nhớ k nhầm react là library, angular là framework
Đúng r fence
ngay vụ routing dù đã có một library khác defined structure là react-router r mà vô từng dự án khác nhau cách apply routing lại khác nhau :shame:
Như framework của React như Next hoặc Remix thì routing bắt buộc phải cố định

via theNEXTvoz for iPhone
 
không
không chỉ khoá này mà mọi khoá dạy React đều không đáng học
ngày xưa docs React còn nghèo nàn thì học cũng được. Chứ còn bây giờ docs React xịn xò với rõ ràng hơn rất nhiều r
Cứ setup một project r tự học hỏi th là được

via theNEXTvoz for iPhone
rồi đọc mãi mà không hiểu thì phải làm sao, ông nghĩ ai cũng là senior học cái nào mới thì chỉ cần đọc docs là xong à
 
rồi đọc mãi mà không hiểu thì phải làm sao, ông nghĩ ai cũng là senior học cái nào mới thì chỉ cần đọc docs là xong à
Vậy thì lên reddit hay voz mà hỏi :go:
bỏ một đống tiền ra cho trung tâm để họ đọc giúp mình React Docs à
Tự va chạm r tự đi hỏi nó sẽ nhớ lâu hơn là đi học đó


via theNEXTvoz for iPhone
 
Dell ai khuyên nên skip deps cả, đừng có dỗi hờn em chã như thế
Cái khuyên là nên chọn deps có tư duy, chứ ko phải xem doc+lint như bố, nó báo gì là nghe răm rắp
Cái tư duy khuyên người khác "Cứ làm theo docs tao bảo đi, còn có lỗi gì hay lặp vô tận thì là do mày code ngu" nghe có ỉa chảy ko cơ chứ...ko có nổi 1 lời giải thích.
Bác nào chưa rõ thì đọc thêm cái này thử
https://dmitripavlutin.com/react-useeffect-infinite-loop/
Lint nó đéo phân biệt đc primitive với object đâu, cứ máy móc lint fix cho lắm vào kiểu j cũng ăn quả crash browser :):)
Tôi dev mấy năm trời ko lẽ ếu hiểu infinite loop là gì, rồi shallow compare của react là cái bỏ mẹ gì. So sánh t với gà à???

Bây giờ nhé quay lại từ đầu. 1 ông jr nào đó hỏi nên điền cái deps gì nhé. Tôi mới suggest cái eslint nhé vì nó gợi ý phải điền cái gì vào. Xong mấy ông tướng nào đó nhảy bổ vào lườm quýt vụ auto fill ra vẻ pro rồi nổ tung trời ko phải cái gì cũng điền. Nhưng trước mắt code đã viết ra rồi thì phải xem deps cần fill gì trước từ đó fill vào mới nói chuyện tiếp dc.

Tiếp theo điền vào mà loop thì phải điều tra vì sao cái deps nó thay đổi mỗi lần render. Do props truyền vào, value computed ko dc memo bla bla từ đó xài thêm useMemo useCallback nếu cần thiết or tìm cách để ko tạo lại object, func.

Optimize ngon nữa thì tìm cách bỏ bớt deps đi nhưng đảm bảo linter vẫn work, logic bussiness đúng đó mới là pro. Cái gì nó cũng có quá trình, còn mấy ông pro, skip deps, ko cần linter nói tụi jr nó nghe theo ko phải bậy à. 99% work flow react fill đủ dep là vậy thôi có gì cao siêu. 1% dành cho mấy ông viết lib or cần siêu optimize sâu or xài cái gì đó.

Jr chắc mới làm biết phải skip deps hay optimize thế nào quá, tuân thủ theo linter rồi học thêm là bt. Còn senior thì cũng phải cân linter thôi, dev pro thế nào cũng cũng có lúc có bug cả. Tôi xưa gà cũng chuyên skip deps sau này nhiều bug phát sinh, tech debt. Mấy năm nay ko cheat deps code lúc nào cũng work. Có linter check, trước mắt cứ code theo linter rồi test. Cuộc sống nhàn nhã thư thái cho đến khi vào mấy cái project của mấy anh chuyên eslint ignore, ko biết xài useCallback useMemo.
 
Sửa lần cuối:
T con viết ra hẳn useDeepEffect, ... cơ, check cho chuẩn chỉ, trong react là shadow comperision mà
Tại sao ko nghĩ là viết code bt mà useEffect vẫn work chế ra chi useDeepEffect. Vì so sánh deep chậm nên cụ React ban đầu chỉ xài shallow compare là có lý do.

Ví dụ có nhiều cách optimize


JavaScript:
  const { name, age } = {
    name: "Linh",
    age: 18,
  };
  useEffect(() => {
    console.log(name, age);
  }, [name, age]);

Ví dụ object nó ko có memo vì shallow compare xài === thì destruct ra name or age mà so sánh
or so sanh object.name, object.age

Vâng vâng và vâng vâng nhiều khi chưa cần đụng useMemo.

Chưa kể viết component thì nên hạn chế xài object props.

ví dụ <User data={object} /> Nếu nó chỉ xài name với age thì <User name={obj.name} age={obj.age} /> Shallow compare age number với name string là quá đơn giản ko phải memo nữa. Nếu xài thêm React.Pure với componetn User nữa thì đãm bảo nó ko re render luôn. Đồng thời component User là độc lập, ko cần phải lo ngoay ngoái props data đã được memo chưa.

Có nhiều cách optimize deps, nhưng trước mắt phải học theo linter, doc thì mới ngộ ra nhưng cái như thế này. Tôi viết trên đây ban đầu chỉ dành cho jr thôi. Ai bỉ bôi tôi xài auto fill thì nên nhớ mấy anh pro sẵn rồi và k phải là đối tượng tôi hướng tới.

Trình tôi giờ tôi vẫn auto fill deps nhưng tôi nhìn vào là cái là biết cái thằng deps nào sẽ gây trouble để có kế sách đối phó. Chứ ếu phải fill vào để đó + ko test.
Mà chưa kể mấy anh thích tự điền thì tùy tôi lười gõ auto fill rồi sửa thêm xóa tý là xong đỡ type nhiều đỡ mỏi tay. Có khi mấy anh skip hết deps chứ bt ko lẽ ko gõ bất kì deps nào? :go:
 
Sửa lần cuối:
Giữa swr và react query đều có thế mạnh riêng, giờ mình chủ yếu mình quản lý server state thì cái nào trội hơn mn
 
Tại sao ko nghĩ là viết code bt mà useEffect vẫn work chế ra chi useDeepEffect. Vì so sánh deep chậm nên cụ React ban đầu chỉ xài shallow compare là có lý do.

Ví dụ có nhiều cách optimize


JavaScript:
  const { name, age } = {
    name: "Linh",
    age: 18,
  };
  useEffect(() => {
    console.log(name, age);
  }, [name, age]);

Ví dụ object nó ko có memo vì shallow compare xài === thì destruct ra name or age mà so sánh
or so sanh object.name, object.age

Vâng vâng và vâng vâng nhiều khi chưa cần đụng useMemo.

Chưa kể viết component thì nên hạn chế xài object props.

ví dụ <User data={object} /> Nếu nó chỉ xài name với age thì <User name={obj.name} age={obj.age} /> Shallow compare age number với name string là quá đơn giản ko phải memo nữa. Nếu xài thêm React.Pure với componetn User nữa thì đãm bảo nó ko re render luôn. Đồng thời component User là độc lập, ko cần phải lo ngoay ngoái props data đã được memo chưa.

Có nhiều cách optimize deps, nhưng trước mắt phải học theo linter, doc thì mới ngộ ra nhưng cái như thế này. Tôi viết trên đây ban đầu chỉ dành cho jr thôi. Ai bỉ bôi tôi xài auto fill thì nên nhớ mấy anh pro sẵn rồi và k phải là đối tượng tôi hướng tới.

Trình tôi giờ tôi vẫn auto fill deps nhưng tôi nhìn vào là cái là biết cái thằng deps nào sẽ gây trouble để có kế sách đối phó. Chứ ếu phải fill vào để đó + ko test.
Mà chưa kể mấy anh thích tự điền thì tùy tôi lười gõ auto fill rồi sửa thêm xóa tý là xong đỡ type nhiều đỡ mỏi tay. Có khi mấy anh skip hết deps chứ bt ko lẽ ko gõ bất kì deps nào? :go:
Chuẩn ông, t review code gặp case auto fill vô deps cho chắc cú nhiều lắm rồi :)))
 
Chuẩn ông, t review code gặp case auto fill vô deps cho chắc cú nhiều lắm rồi :)))

Code cũ cty có nhiều đoạn ko optimize nên cái deps nó dài đằng đặc. Ko có linter mà tự điền tay thì rất dễ miss, trừ phi vừa code cái deps nào điền nó vào array ngay. Tôi thì style cứ viết hết logic trước rồi auto fill + sửa, sau đó check lại deps optimize này nọ, move bớt logic sang effect khác.

Nhiều khi task gấp ko có time suy nghĩ sâu xa nên đôi lúc tôi nghĩ bà con viết effect cb logic nhiều line xài nhiều deps là bình thường, mà nhiều xài nhiều deps tự fill tay, no linter thì miss rất dễ, gây ra bug, tech debt. Ai chửi viết code ngu, dài cũng đúng nhưng vs mỗi cty ngoài kia outsrc product khác nhau, chạy task cũng khác. Có cty 1 cái task cho nửa ngày, có cty cho 1 task có khi 2 3h.

Mà thôi tôi cũng srr kéo pic đi xa quá. Giải thích dài dòng, có lẽ skill communication ko dc tốt :shame:

Túm váy với jr thì eslint + auto fill là hint để điền cái gì, nhưng điền vô rồi thì phải test lại rồi học lý do tại sao cái dep no thay đổi ngoài mong muốn dẫn đến effect run nhiều lần or ko đúng mình mong muốn rồi tìm cách optimize. Xưa mới ra hook chửi thề suốt, nhưng làm theo linter rồi thì mới thấy nhiều cái mình ngu ko hiểu rồi học dần dần. Giờ ba cái effect deps như trò mèo.
 
Code cũ cty có nhiều đoạn ko optimize nên cái deps nó dài đằng đặc. Ko có linter mà tự điền tay thì rất dễ miss, trừ phi vừa code cái deps nào điền nó vào array ngay. Tôi thì style cứ viết hết logic trước rồi auto fill + sửa, sau đó check lại deps optimize này nọ, move bớt logic sang effect khác.

Nhiều khi task gấp ko có time suy nghĩ sâu xa nên đôi lúc tôi nghĩ bà con viết effect cb logic nhiều line xài nhiều deps là bình thường, mà nhiều xài nhiều deps tự fill tay, no linter thì miss rất dễ, gây ra bug, tech debt. Ai chửi viết code ngu, dài cũng đúng nhưng vs mỗi cty ngoài kia outsrc product khác nhau, chạy task cũng khác. Có cty 1 cái task cho nửa ngày, có cty cho 1 task có khi 2 3h.

Mà thôi tôi cũng srr kéo pic đi xa quá. Giải thích dài dòng, có lẽ skill communication ko dc tốt :shame:

Túm váy với jr thì eslint + auto fill là hint để điền cái gì, nhưng điền vô rồi thì phải test lại rồi học lý do tại sao cái dep no thay đổi ngoài mong muốn dẫn đến effect run nhiều lần or ko đúng mình mong muốn rồi tìm cách optimize. Xưa mới ra hook chửi thề suốt, nhưng làm theo linter rồi thì mới thấy nhiều cái mình ngu ko hiểu rồi học dần dần. Giờ ba cái effect deps như trò mèo.
Cho m hỏi theo kn của fen thì sau khi autofill xong, những dep nào nên check lại để bỏ ra hoặc optimize nhỉ?
 
Cho m hỏi theo kn của fen thì sau khi autofill xong, những dep nào nên check lại để bỏ ra hoặc optimize nhỉ?
Vì effect run shallow === nên string number thường khá an toan. Riêng function, array, object thì chú ý tiếp. Nếu đến từ lib khi khả năng 99.99% đã dc memo rồi nên cứ điền vào deps

JavaScript:
import React from 'react';
import { useTranslation } from 'react-i18next';

export function MyComponent() {
  const { t, i18n } = useTranslation();
  // or const [t, i18n] = useTranslation();

  return <p>{t('my translated text')}</p>
}

Ví dụ biến t, và i18n từ hook useTranslation này đã memo hết rồi nên deps có hint đòi điền thì cứ thoải mái. Nói chung sợ thì cứ test lại chứ 99.99% xài lib thì tôi chưa gap thằng nào chưa memo.

Còn của mình thì như có đề cập bên trên array, object dc thì destruct ra ráng move nó về so sánh string, number === là an toàn.

Nếu cần cả array và object thì thì kiểm tra nó đến từ đâu. Nếu đến từ store như redux, react-query, lấy từ state của React.state thì cũng khá an toàn. Vì nó đã lưu lại reference trong memory rồi, mục tiêu những cái state đổi thì chạy lại effect đúng thì nhét vào deps thôi.

Nếu object, array kiểu mỗi lần re render tự tạo or inline create
JavaScript:
function ABC() {

  const object = .... = {
    name: props.name,
    age: Math.max(age, assumeAge),
  }

  // tinh toan o dau do moi ra dc object
// object2 inline
// BCD xài useEfffect với object và object2
  return <BCD object={object} object2={{hello: "world"}} />

}

Xem thử destruct như ví dụ cmt trên kia dc ko. Nếu nhất quyết phải truyền object và object2 và BCD ko destruct dc object, array thì phải xài useMemo. Object2 nếu chỉ thuần config ko liên quan đến tính toán state thì có thể move ra ngoài

JavaScript:
const object2 = {hello: "world"}

function ABC() {

  const object = useMemo(() => {
    return {


    name: props.name,

    age: Math.max(age, assumeAge),

  }

  }, [props.name, age, assumeAge])

// BCD xài useEfffect với object và object2
  return <BCD object={object} object2={object2} />

}
 
Vì effect run shallow === nên string number thường khá an toan. Riêng function, array, object thì chú ý tiếp. Nếu đến từ lib khi khả năng 99.99% đã dc memo rồi nên cứ điền vào deps

JavaScript:
import React from 'react';
import { useTranslation } from 'react-i18next';

export function MyComponent() {
  const { t, i18n } = useTranslation();
  // or const [t, i18n] = useTranslation();

  return <p>{t('my translated text')}</p>
}

Ví dụ biến t, và i18n từ hook useTranslation này đã memo hết rồi nên deps có hint đòi điền thì cứ thoải mái. Nói chung sợ thì cứ test lại chứ 99.99% xài lib thì tôi chưa gap thằng nào chưa memo.

Còn của mình thì như có đề cập bên trên array, object dc thì destruct ra ráng move nó về so sánh string, number === là an toàn.

Nếu cần cả array và object thì thì kiểm tra nó đến từ đâu. Nếu đến từ store như redux, react-query, lấy từ state của React.state thì cũng khá an toàn. Vì nó đã lưu lại reference trong memory rồi, mục tiêu những cái state đổi thì chạy lại effect đúng thì nhét vào deps thôi.

Nếu object, array kiểu mỗi lần re render tự tạo or inline create
JavaScript:
function ABC() {

  const object = .... = {
    name: props.name,
    age: Math.max(age, assumeAge),
  }

  // tinh toan o dau do moi ra dc object
// object2 inline
// BCD xài useEfffect với object và object2
  return <BCD object={object} object2={{hello: "world"}} />

}

Xem thử destruct như ví dụ cmt trên kia dc ko. Nếu nhất quyết phải truyền object và object2 và BCD ko destruct dc object, array thì phải xài useMemo. Object2 nếu chỉ thuần config ko liên quan đến tính toán state thì có thể move ra ngoài

JavaScript:
const object2 = {hello: "world"}

function ABC() {

  const object = useMemo(() => {
    return {


    name: props.name,

    age: Math.max(age, assumeAge),

  }

  }, [props.name, age, assumeAge])

// BCD xài useEfffect với object và object2
  return <BCD object={object} object2={object2} />

}
Reply có tâm quá fen :p. Vụ đc lưu trong memory ý là mấy cái đó đã đc memo? Còn mấy cái state lấy từ context mà dạng object thì thường m có cần phải memo ko nhỉ?
 
Với function thì nếu thuần pure function ko liên quan state, props, sideEffect thì move ra ngoài.

còn function mà phụ thuộc vào deps thì tốt nhất nên useCallback
JavaScript:
// useCallback rồi đem xuống component props khác or useEffect
function abc() {
    return props.ax + state.ab;
}

Có 1 cái trick để giảm dep đó là setState của react nhận vào function

JavaScript:
function ABC(props) {
  const [state, setState] = useState(1);
 
  useEffect(() => {
      if(props.isBehind) {
       setState(state + 1)
   }
  }, [state, props.isBehind])
}

Ví dụ code này ai chạy chắc useEffect nó loop sml luôn. Vì mục tiêu của code chỉ là khi props.isBehind true thì state + 1; Nhưng nếu viết trên kia thì loop. Vì state dổi sẽ trigger lại function.
Mà nếu đổi bỏ state ra khỏi dep effect thì sẽ bị linter chửi. Tức quá ignore nó cũng ok nhưng có 1 đoạn code khác cập nhật state rồi thì state nằm trong Effect sẽ bị outdate dẫn đến state + 1 sai.


JavaScript:
function ABC(props) {
  const [state, setState] = useState(1);
 
  useEffect(() => {
      if(props.isBehind) {
       setState((prev) => {return prev + 1})
   }
  }, [props.isBehind])
}

Sủa lại setState xài function là xong.

Ở đây linter chỉ nhắc nhở mình thôi, còn code theo nó sẽ ko chắc đúng 100% (thực ra cũng đúng vì đòi xài state tron effect mà, lý thuyết nó ko sai) , cái này phải tập luyện
 
Sửa lần cuối:
Reply có tâm quá fen :p. Vụ đc lưu trong memory ý là mấy cái đó đã đc memo? Còn mấy cái state lấy từ context mà dạng object thì thường m có cần phải memo ko nhỉ?
state từ context thì context nó cũng lấy từ props or state thôi or tính toán ở đâu đó. Nên nếu Provider mà re render mấy cái value ko dc memo, lưu trong state thì thằng con năm dưới cũng chạy Effect lại theo.

Mà object thì cũng cứ destruct ra xài thôi mà đừng có memo nguyên cái object

Ví dụ
JavaScript:
// nằm ngoài function gọi tạo provider nên đã dc memo
const listLanguages = ['a', 'b']


<LanguageContext.Provider
      value={{
        listLanguages: listLanguages,
        // string    
        currentLang,
        // cb đã dc memo    
        changeLanguage,
             // cb đã dc memo    
        translate,
      }}

component nào xài context thì destruct ra rồi lấy listLanguages, currentLang, translate xài thì chỉ so sánh mấy cái này thôi đâu có truyên nguyên obj
 
Sửa lần cuối:
rồi đọc mãi mà không hiểu thì phải làm sao, ông nghĩ ai cũng là senior học cái nào mới thì chỉ cần đọc docs là xong à
bởi vậy mới hình thành kĩ năng tự research, học cho lắm vào rồi mai mốt ko biết tự research cứ lên mạng hỏi, nhiều đứa còn ko chịu đọc docs mà đã đi hỏi tùm lum, ko double check, toàn mấy cái skill cơ bản này làm đéo nào có khóa học nào dạy?

hồi xưa ko có khóa học thì senior chết hết à? senior ko ai đi lên từ khóa học cả.
 
tôi thì ko dùng
Tại sao ko nghĩ là viết code bt mà useEffect vẫn work chế ra chi useDeepEffect. Vì so sánh deep chậm nên cụ React ban đầu chỉ xài shallow compare là có lý do.

Ví dụ có nhiều cách optimize


JavaScript:
  const { name, age } = {
    name: "Linh",
    age: 18,
  };
  useEffect(() => {
    console.log(name, age);
  }, [name, age]);

Ví dụ object nó ko có memo vì shallow compare xài === thì destruct ra name or age mà so sánh
or so sanh object.name, object.age

Vâng vâng và vâng vâng nhiều khi chưa cần đụng useMemo.

Chưa kể viết component thì nên hạn chế xài object props.

ví dụ <User data={object} /> Nếu nó chỉ xài name với age thì <User name={obj.name} age={obj.age} /> Shallow compare age number với name string là quá đơn giản ko phải memo nữa. Nếu xài thêm React.Pure với componetn User nữa thì đãm bảo nó ko re render luôn. Đồng thời component User là độc lập, ko cần phải lo ngoay ngoái props data đã được memo chưa.

Có nhiều cách optimize deps, nhưng trước mắt phải học theo linter, doc thì mới ngộ ra nhưng cái như thế này. Tôi viết trên đây ban đầu chỉ dành cho jr thôi. Ai bỉ bôi tôi xài auto fill thì nên nhớ mấy anh pro sẵn rồi và k phải là đối tượng tôi hướng tới.

Trình tôi giờ tôi vẫn auto fill deps nhưng tôi nhìn vào là cái là biết cái thằng deps nào sẽ gây trouble để có kế sách đối phó. Chứ ếu phải fill vào để đó + ko test.
Mà chưa kể mấy anh thích tự điền thì tùy tôi lười gõ auto fill rồi sửa thêm xóa tý là xong đỡ type nhiều đỡ mỏi tay. Có khi mấy anh skip hết deps chứ bt ko lẽ ko gõ bất kì deps nào? :go:
tôi cũng vậy, tôi ít khi dùng useMemo cho lắm, bần cùng lắm mới dùng, đa số là destruct field trong obj ra hoặc bỏ nguyên cái obj đó vô state là hết render
 

Thống kê chủ đề

Ngày tạo
Celsius,
Người trả lời cuối
JavaNeverDie002,
Trả lời
690
Lượt xem
97.271
Quay lại
Lên đầu trang