Two-way binding | Ràng buộc hai chiều | React hooks

Поділитися
Вставка
  • Опубліковано 10 жов 2021
  • 👉 Xem Lộ Trình Học: fullstack.edu.vn/learning-paths
    👉 Đăng Ký Học Offline Tại F8: short.f8team.dev/dang-ky-hoc-...
    Trong bài học này chúng ta sẽ cùng tìm hiểu về khái niệm Two-way binding | Ràng buộc hai chiều | React hooks
    Two-way binding là ràng buộc dữ liệu 2 chiều, điều này thường được nhắc tới khi các bạn làm việc với biểu mẫu (form) trong các lib/framework front-end. Trong video này chúng ta sẽ cùng nhau đi qua các ví dụ để các bạn có thể ứng dụng được useState() nhé.
    #hoclaptrinh #hoclaptrinhmienphi #javascript #reactjs #frontend #backend #devops #f8
    -------
    ☻ Phần mềm sử dụng trong video:
    Công cụ dịch Tiếng Anh: bit.ly/2Wsuhet
    Công cụ đo đạc giao diện web: s.net.vn/D8kL
    Công cụ viết CV xin việc chuyên nghiệp: mycv.vn
    --------------
    ☻ Khóa học lập trình web MIỄN PHÍ:
    Kiến thức nhập môn: fullstack.edu.vn/courses/less...
    Xây dựng giao diện với HTML, CSS: fullstack.edu.vn/courses/html...
    Xây dựng web responsive: fullstack.edu.vn/courses/resp...
    Lập trình Javascript cơ bản: fullstack.edu.vn/courses/java...
    Lập trình Javascript nâng cao: fullstack.edu.vn/courses/java...
    Làm việc với Terminal & Ubuntu: fullstack.edu.vn/courses/wind...
    Xây Dựng Website với ReactJS: fullstack.edu.vn/courses/reactjs
    Xây dựng web với Node & Express: fullstack.edu.vn/courses/nodejs
    HTML, CSS tips: fullstack.edu.vn/courses/html...
    Ứng dụng cảnh báo khi sờ lên mặt: fullstack.edu.vn/courses/tool...
    Xem thêm tại: fullstack.edu.vn/courses
    -------------------------------------
    F8 Official
    (c) Sơn Đặng
    Website: fullstack.edu.vn
    Facebook cá nhân: / sondnf8
    Nhóm Học Lập Trình Web: / f8official
    Email: contact@fullstack.edu.vn
    © Bản quyền thuộc về Channel F8 Official ☞ Do not Reup
    © Nghiêm cấm sử dụng video nhằm mục đích thương mại dưới mọi hình thức.
  • Наука та технологія

КОМЕНТАРІ • 135

  • @F8VNOfficial
    @F8VNOfficial  Рік тому +11

    React là 1 (one) way binding. Việc chúng ta binding state vào value của input để nó trở thành 2 (two) ways binding các bạn nhé. Khi đi phỏng vấn, NTD mà hỏi React là 1 way binding hay 2 ways binding thì các bạn trả lời là 1 way binding nhé (mình có nói ở 08:12).
    Các bạn tham khảo thêm:
    - reactjs.org/docs/two-way-binding-helpers.html (helper dùng cho React < v15 để dễ dàng triển khai 2 ways binding)
    - reactgo.com/two-way-data-binding-react/

    • @namnguyen-gk5kx
      @namnguyen-gk5kx 6 місяців тому

      A có thể giải thích hàm handleCheck 1 nơi dùng object course.id, 1 nơi dùng id không ạ, mong a phản hồi sớm

  • @vanhieule9248
    @vanhieule9248 День тому

    mn cho em hỏi là khi onchane gọi đến setChecked thì nó phải render hết lại thì tại sao nó vẫn giữ trạng thái được chọn nhỉ, em nghĩ khi render lại thì không còn cái nào được chọn chứ ạ

  • @hieptrinh8215
    @hieptrinh8215 2 роки тому +1

    dạy cuốn thực sự, cám ơn bạn nhiều!

  • @KhanhNguyen-hl5ot
    @KhanhNguyen-hl5ot 2 роки тому +1

    anh dạy dễ hiểu thiệt sự ❤❤❤

  • @dattranthanh6757
    @dattranthanh6757 2 роки тому +1

    Anh giảng hay quá. Cám ơn anh.

  • @khanhbt14
    @khanhbt14 2 роки тому +1

    Bài này a giảng hay quá

  • @hieulevan4300
    @hieulevan4300 2 роки тому +15

    Nếu có kiếp sau em nguyện làm vợ a Sơn để chăm sóc cho a cả đời

  • @vietuc8485
    @vietuc8485 2 роки тому +1

    tks anh video bổ ích quá ạ

  • @anhtrannguyenminh250
    @anhtrannguyenminh250 2 роки тому +1

    cảm ơn anh đã gợi ý một ý tưởng hay phần checkbox

  • @KhangNguyen-kq2iw
    @KhangNguyen-kq2iw 2 роки тому +20

    Thầy Sơn dạy dễ hiểu ghê luôn, mang lại kiến thức rất khác biệt, có thể áp dụng vào các dự án thực tế, vừa kĩ càng, vừa chứa lượng kiến thức rất lớn luôn

  • @haingotue4008
    @haingotue4008 2 роки тому +8

    Thầy dạy siêu có tâm, em học đi học lại bài này cố gắng nuốt từng chữ thầy dạy. Em cảm ơn thầy nhiều ạ

  • @MagicMusiclike
    @MagicMusiclike 2 роки тому +3

    Cảm ơn những kiến thúc anh chia sẻ, xem video của anh có thể nói là kỹ càng từng chút một, em học hỏi được rất nhiều kiến thức từ những video của anh. Cảm ơn anh đã mang giá trị rất lớn cho cộng đồng coder .

  • @tonalone2912
    @tonalone2912 2 роки тому +1

    hay anh. Kiến thức này ở các kênh khác không có.
    Giúp em hiểu rõ hơn về React.
    Thanks anh nhiều!

  • @HuyLe-ee1uz
    @HuyLe-ee1uz 2 роки тому +1

    Clip anh làm vui quá

  • @vanle8514
    @vanle8514 2 роки тому +1

    Ví dụ checked đưa ra quá hay. Thông não. Like!

  • @DavidJames535
    @DavidJames535 2 роки тому +1

    Hay quá anh . Giờ e được thông não 🤩🤩

  • @quangminh8580
    @quangminh8580 Рік тому

    cảm ơn thầy rất nhiều !

  • @hoangduong610
    @hoangduong610 2 роки тому +1

    đang khó state này vô xem video của a cái làm được luôn

  • @tuananhhoang9528
    @tuananhhoang9528 2 роки тому +1

    Ân nhân của em đây rồi. Đúng phần checkbox em cần

  • @lamle6397
    @lamle6397 2 роки тому +1

    bài này quá hay luôn

  • @maivan5759
    @maivan5759 Рік тому +1

    anh dạy cực hay, cực có tâm, cực chi tiết, xem của anh xong xem những người khác thấy chênh lệch thật sự, cảm ơn anh, chúc anh nhiều sức khỏe

  • @dpd246
    @dpd246 2 роки тому +2

    Em cảm ơn anh ạ. Nhờ có phần checkbox của anh mà em hiểu thêm bản thân cần cải thiện thêm về logic ạ .

    • @F8VNOfficial
      @F8VNOfficial  2 роки тому +3

      Đúng rồi em, làm lập trình thì mình cần nảy ra cách làm với logic trước rồi mới làm

  • @bynemusic311
    @bynemusic311 2 роки тому +1

    đợi mãi a sơn mới ra

  • @phamquangthieu00
    @phamquangthieu00 2 роки тому +2

    Mong khóa Node sắp tới của anh Sơn sẽ là NestJS ạ

  • @quanta7687
    @quanta7687 2 роки тому +4

    trước em học đến đây ko biết vận dụng vào kiểu gì bây giờ anh dạy kèm ví dụ đúng tuyệt với luôn mong là mỗi hook anh đều có ví dụ

    • @F8VNOfficial
      @F8VNOfficial  2 роки тому

      Như em mới học thì em thấy những cái nào khó hiểu trong React?

  • @phungtruongdinhquan7765
    @phungtruongdinhquan7765 2 роки тому +1

    Em phải coi đi coi lại cái đoạn logic đấy, anh đã giải thích kỹ mà e đọc vẫn lú =)))

  • @sonlehung6193
    @sonlehung6193 Рік тому

    bài này khá khoa

  • @nguyenngoctri2207
    @nguyenngoctri2207 2 роки тому +1

    Quá hay

  • @TienPhan-ih6ij
    @TienPhan-ih6ij 2 роки тому +1

    Bắt đầu thấy căng căng rồi

  • @available6733
    @available6733 2 роки тому +1

    yêu thầy Sơn

  • @phanducanh96
    @phanducanh96 2 роки тому +1

    Vãi thầy nói nhầm :)), cơ mà vẫn dễ hiểu ạ hehe

  • @HTTOffical
    @HTTOffical 2 роки тому +1

    Thầy sơn làm khóa React Naitve đi ạ

  • @ongangminh6627
    @ongangminh6627 2 роки тому +1

    Thuật ngữ Two-way binding nó same same như controlled component và One-way binding nó là uncontrolled component cho ae nào chưa biết

  • @NamangMinh1
    @NamangMinh1 2 роки тому +2

    Anh Sơn ơi.Bao giờ anh ra xong khóa reactjs thì anh ra react native nhé anh

  • @thanhduynguyen6253
    @thanhduynguyen6253 8 місяців тому

    với ví dụ của checkbox thì ko cần attribute checked={checked.includes(course.id)} cũng được ạ

  • @Mossad84
    @Mossad84 Рік тому

    Mình xem bài này không dưới 5 lần mới thông.

  • @tuanato5973
    @tuanato5973 2 роки тому +3

    Không sao đâu anh ơi, đoạn đấy nghe phát biết anh nói nhầm mà =)))))

    • @F8VNOfficial
      @F8VNOfficial  2 роки тому +1

      Oki thế thì ngon, anh kiểu bị ám ảnh ấy haha. Rõ ràng học tới đây ai cũng phải hiểu rõ về array methods rồi mà anh cứ đi lo thừa 🤣

    • @tuanato5973
      @tuanato5973 2 роки тому +1

      @@F8VNOfficial anh có dặn là phải học kỹ lại js cơ bản rồi mới qua react mà 🤣 nên em nghĩ mn đều hiểu

  • @blockchain_bull
    @blockchain_bull Рік тому

    hóng khóa springboot nâng cao ạ.

  • @tuanato5973
    @tuanato5973 2 роки тому +1

    Chấmmmmm

  • @bynemusic311
    @bynemusic311 2 роки тому

    A sơn bao giờ a làm một khóa Angular đi ạ

  • @thanhlamnguyenvo5717
    @thanhlamnguyenvo5717 2 роки тому +10

    Cho em hỏi chỗ 21:30 sao không dùng onChange={handleCheck(id)} được mà phải dùng onChange={() => handleCheck(id)} vậy ạ?

    • @DavidJames535
      @DavidJames535 2 роки тому +4

      với reactjs nó sẽ tự chạy dòng mặc dù bạn chưa gọi hàm đó . Nên sẽ để lồng thêm hàm ở ngoài nữa

    • @vuongnh1705
      @vuongnh1705 2 роки тому +3

      () là dấu gọi hàm nếu bạn gọi handleCheck(id) thì khi load giao diện lên nó sẽ chạy hàm đó luôn mặc dù bạn chưa click vào button

  • @phanhaiang7052
    @phanhaiang7052 2 роки тому +2

    Anh bị ám ảnh sự hoàn hảo hả a >

    • @F8VNOfficial
      @F8VNOfficial  2 роки тому

      Em hiểu rõ về cái này ko, có vẻ anh bị thế thật hic

    • @phanhaiang7052
      @phanhaiang7052 2 роки тому

      @@F8VNOfficial dạ hong anh ơi 😂😂😂😂

    • @KhangNguyen-kq2iw
      @KhangNguyen-kq2iw 2 роки тому

      @@F8VNOfficial hehe, nhờ thầy Sơn có sự cầu toàn trong mọi việc, nên các bài giảng của thầy lúc nào cũng đi vô rất rất là chi tiết v nè, ai xem kênh thầy đều có và sẽ có cái nền móng vững vàng lắm luôn, mãi iu thầy giáo Sơn

    • @phattrantuan1564
      @phattrantuan1564 8 місяців тому

      @@F8VNOfficial có câu "nhất cần thiên hạ vô nan sự" đấy anh. Hiểu nôm na là khi một người thể hiện sự tươm tất của mình thì người xung quanh cũng được hưởng phúc từ cái sự chu đáo của người đó nữa.

  • @hoangnguyen-rv9jg
    @hoangnguyen-rv9jg 2 роки тому +5

    Em làm giống anh mà cmp của em khi khởi tạo hay khi setState đều bị re-render 2 lần(cả ví dụ change input đơn giản code giống a). Anh giải thích hộ em chỗ này vs ạ
    import {useState} from "react"
    import React,{useState} from "react"
    function App() {
    const [job,setJob] = useState('');
    console.log(job)// bị re-render 2 lần mỗi khi setJob hoặc khởi tạo cmp
    return (


    setJob(e.target.value)}/>
    Add


    );
    }
    export default App;
    ** note: Em học tới bài useEffect thì đã tìm ra nguyên nhân r ạ. Do thằng => log ra 2 lần :((

    • @xuanmanhdao
      @xuanmanhdao Рік тому

      Mình xem tuần tự nên đến video này cũng bị giống bạn loay hoay suốt không hiểu tại sao 🥲

    • @SonNguyen-pg9ms
      @SonNguyen-pg9ms Рік тому

      xem đến useEffect là hiểu hả bn mình cũng bị v

  • @hoangtri9569
    @hoangtri9569 2 роки тому +1

    a Sơn đúng kiểu chơi html element thuần :v ngoài kia toàn mấy ông chơi Formik, React Hook form

    • @F8VNOfficial
      @F8VNOfficial  2 роки тому +7

      Share kiến thức thì share phần base thôi em. Sau anh em thích dùng cái gì thì đọc docs dùng mà vẫn hiểu bản chất. Dùng lib ngay nhiều khi không hiểu nó làm gì

  • @TuanAnhNguyen-vn7mo
    @TuanAnhNguyen-vn7mo 2 роки тому +2

    Có extension nào gợi ý html với css trong js ko ạ

  • @yenka3205
    @yenka3205 2 роки тому +3

    Đã học và hiểu. Cảm ơn thầy Sơn rất nhiều
    import { useState } from "react";
    const giftList = ["CPU i9", "RAM 32GB RGB", "RGB Keyboard"];
    const courseList = [
    {
    id: 1,
    name: "HTML, CSS",
    },
    {
    id: 2,
    name: "Javascript",
    },
    {
    id: 3,
    name: "ReactJs",
    },
    ];
    function App() {
    const [gift, setGift] = useState();
    const [name, setName] = useState("");
    const [email, setEmail] = useState("");
    const [checked, setChecked] = useState(2);
    const [checkedBox, setCheckedBox] = useState([]);
    const handleRandomGift = () => {
    const index = Math.floor(Math.random() * giftList.length);
    setGift(giftList[index]);
    };
    const handleSubmit = () => {
    console.log({ name, email });
    };
    const handleSubmitCourse = () => {
    console.log({ id: checked });
    };
    const handleCheckBox = (id) => {
    setCheckedBox((prevState) => {
    const isCheckedBox = checkedBox.includes(id);
    if (isCheckedBox) {
    return checkedBox.filter((item) => item !== id);
    } else {
    return [...prevState, id];
    }
    });
    };
    const handleSubmitCourseBox = () => {
    console.log({ idList: checkedBox });
    };
    return (


    {gift || "Chưa có phần thưởng"}
    Lấy thưởng



    Name:
    setName(e.target.value)} />



    Email:

    setEmail(e.target.value)} />

    Register


    {courseList.map((course) => (

    setChecked(course.id)}
    id={`course-${course.id}`}
    />

    {course.name}


    ))}
    Submit Course


    {courseList.map((course) => (

    handleCheckBox(course.id)}
    id={`course-checkbox-${course.id}`}
    />

    {course.name}


    ))}
    Submit Course


    );
    }
    export default App;

  • @thanhminh9681
    @thanhminh9681 Рік тому

    Có ai như em không em thêm props value vào input thì không gõ được nữa.

    • @F8VNOfficial
      @F8VNOfficial  Рік тому

      Ko gõ được vì em chưa set lại state khi onChange đó

  • @AnAn-mb8ld
    @AnAn-mb8ld 2 роки тому +1

    Kiểu dử liệu tham chiếu trong js ở video nào v anh

  • @vuongqtvn
    @vuongqtvn 2 роки тому +1

    chào anh 🙌🙌

  • @becode9266
    @becode9266 2 роки тому +2

    Sao nhìn anh SƠn giống diễn viên trong phim "hương vị tình thần" thế nhỉ?

  • @NamLe-sl4qy
    @NamLe-sl4qy 2 роки тому +1

    13:00 bỏ value trong input đi nó vẫn in ra được trong console.log mà b 😅

  • @toannongquoc9004
    @toannongquoc9004 2 роки тому

    Trường hợp có nhiều block check box như kiểu filter by price, filter by category thì mình làm như nào mọi người nhỉ? Phải tạo ra nhiều checked à hay có cách nào viết để dùng chung không ạ?

  • @vncoolestguy
    @vncoolestguy Рік тому

    27:00 line 35 nó là return prev.filter(item=>item !== id) chứ nhỉ ?

  • @vankhanhinfo
    @vankhanhinfo 2 роки тому +1

    khi save ở vs code thì page ko auto load, có ae nào biết cách fix ko nhỉ

  • @thanhduynguyen6253
    @thanhduynguyen6253 8 місяців тому

    Trong bài học này và so sánh với vue khi sử dụng devtool của 2 thằng thì e thấy các state (có thể gọi là biến) trong reactjs không chi tiết như VueJs, vì trong vue các state hiện hẳn tên của state chứ ko như ReactJs chỉ hiện "State"

  • @NgocNguyen-lt9yv
    @NgocNguyen-lt9yv 2 роки тому +2

    Mn cho e hỏi. E làm phần checkbox ko cần có đoạn "checked = {checked.includes(course.id)}" để hiển thị phần được chọn như của a Sơn, nhưng kết quả vẫn đúng thì ntn ạ. Vì trong video e thấy nếu ko có thì nó sẽ ko hiện lên cái tick màu xanh ạ.

    • @hoangnguyen-rv9jg
      @hoangnguyen-rv9jg 2 роки тому +2

      Trong trường hợp giá trị khởi tạo là mảng rỗng [] thì của bạn là đúng. Nhưng trong trường hợp giá trị khởi tạo là mảng có phần tử [1,2,3] ... Thêm một số case không tác động tới checkbox nhưng giá trị checked vẫn phải thay đổi => cách làm của bạn bị thiếu nhé.

  • @atnguyen5240
    @atnguyen5240 Рік тому

    bài hay quá anh ơi em xem tận 3 lần vẫn chưa hiểu phai tin

  • @vanthemvo4954
    @vanthemvo4954 2 роки тому +1

    làm form mà seState như vậy thì sẻ bị re-render rất nhiều, sẻ ko tốt cho per, anh ra bài hướng dẫn xử lý re-render ạ.

    • @F8VNOfficial
      @F8VNOfficial  2 роки тому +15

      Em hiểu nhầm rồi đó, ai bảo em là re-render là không tốt cho performance? Re-render là việc cần thiết để update được trạng thái ứng dụng ra UI. Chỉ có việc re-render không kiểm soát và re-render không cần thiết mới ảnh hưởng tới performance. Giải quyết bằng cách chia component hợp lý và sử dụng các hooks như useMemo, useCallback và React.memo để giải quyết. Em không nên nghĩ render lại nhiều là ảnh hưởng, mà render lại thừa mới ảnh hưởng. Trong tình huống này ko có vấn đề gì về perfomance em nhé. Sau anh ra video về performance sau nha em.

    • @vanthemvo4954
      @vanthemvo4954 2 роки тому +2

      @@F8VNOfficial Cảm ơn trả lời của anh, em hiểu ra vân đề ở đâu rồi. Chúc anh nhiều sức khỏe!

  • @hiepnguyen-oh5xt
    @hiepnguyen-oh5xt 2 роки тому +1

    mọi người ơi cho em hỏi tại sao ở chỗ onChange lại phải thêm 1 function cha bên ngoài handleCheck ạ

    • @free2idol1
      @free2idol1 2 роки тому +3

      vì mặc định tất cả event handler như là onclick, onchange, onblur, etc... trong JS sẽ được pass 1 argument là DOM object nên nếu giờ muốn pass 1 custom argurment vào event handler đó thì phải wrap nó vào 1 function thì mới có thể pass được.
      VD: Foo thì khi gọi hàm foo() ở ngoài thì nó sẽ là ntn:
      foo = (event) => console.log(event) //event đây chính là argument mặc định tự động được pass vào mỗi khi sự kiện click được xảy ra.
      Giờ nếu muốn pass 1 custom argument thì phải wrap nó vào 1 function cha:
      foo(name)}>Foo
      foo = (name) => console.log(name) //lúc này thì name (là 1 custom argument) mới có thể được pass vào hàm foo().

    • @hiepnguyen-oh5xt
      @hiepnguyen-oh5xt 2 роки тому +1

      @@free2idol1 mình cảm ơn ạ

  • @ToanHuynh2910
    @ToanHuynh2910 2 роки тому +1

    cho mình hỏi là tại sao mình dùng splice như bên dưới thì lại không hoạt động đúng dc nhé:
    function handleOnChange(id) {
    setChecked((prev) => {
    const isChecked = checked.includes(id);
    if (isChecked) {
    /* return checked.filter((item) => item !== id); */
    checked.splice(checked.indexOf(id), 1);
    return checked;
    } else return [...prev, id];
    });
    }

    • @hoangnguyen-rv9jg
      @hoangnguyen-rv9jg 2 роки тому +1

      Mình có tìm hiểu và thử lại . Bạn dùng splice sẽ đổi cả giá trị checked và pre. Nghĩa là setState bạn truyền lại chính nó(không thay đổi giá trị tương tự setState(pre=> pre) ) nên sẽ không re-render lại khi gọi setState

  • @edward_7_3_9
    @edward_7_3_9 2 роки тому +1

    tại sao lúc filter return luôn cái state mà không setState lại nhưng nó vẫn nhận được vậy anh ơi.

    • @leehoan4760
      @leehoan4760 Рік тому

      vì hàm filter nó lặp cái mảng đang có bao nhiêu phần tử đang đc check xong nó filter thằng nào có id khác id trong mảng và nó trả về mảng mới gồm các phần tử trừ thằng id kia ra => setState lúc này là mảng có 2 nên show ra đc 2

  • @trungnguyenthanh5601
    @trungnguyenthanh5601 2 роки тому +1

    vue thì cứ v-model là xong, reactjs lằng nhằng vậy :))))

    • @top_1_florentino
      @top_1_florentino Рік тому

      vue nó extends điểm mạnh của angular + react mà ông

  • @munkchip710
    @munkchip710 2 роки тому +1

    cho e hỏi ở 26:54 dòng 35 và 37, sao mình ko thay biến checked thành biến prev nhỉ

    • @F8VNOfficial
      @F8VNOfficial  2 роки тому +2

      A ko để ý thôi, em dùng prev cho đồng nhất nhé. Còn 2 biến đều lưu cùng 1 địa chỉ vùng nhớ thôi

    • @munkchip710
      @munkchip710 2 роки тому +1

      @@F8VNOfficial e cảm ơn thầy Sơn nhiều, e đi làm gần 1 năm, main React sáng tới tối nhưng khi xem thầy dạy thì đều học được cái mới 😁😁

  • @mymy3031
    @mymy3031 5 місяців тому

    Mk vào trang f8 fullstack nhưng không vào học được. Có lỗi không đăng nhập được. Không biết vấn đề này có xảy ra với các bạn khác không

    • @F8VNOfficial
      @F8VNOfficial  5 місяців тому

      Bạn đăng nhập qua phương thức nào bạn ơi?

    • @mymy3031
      @mymy3031 5 місяців тому

      @ficial mk dùng email trc của mình để đăng nhập thì bị báo là "Mỗi người nên sử dụng riêng một tài khoản, tài khoản nhiều người sử dụng chung có thể sẽ bị khóa" nhg mk dùng có 1 mk à. Rồi mk đăng kí bằng cả số điện thoại lẫn email khác thì đều load rất lâu và ko vào được. Mình có console thì báo lỗi failed to load resource vs cả access to xmlhttpRequest bị block bởi CORS policy

  • @truongtranvan7590
    @truongtranvan7590 2 роки тому +1

    Cho em hỏi trong hàm handleCheck. Mảng "checked" với mảng "prev" nó giống hay khác nhau vậy anh, tại thấy khúc trên a dùng mảng "checked", khúc cuối push id vào a dùng mảng "prev"

    • @F8VNOfficial
      @F8VNOfficial  2 роки тому +1

      À ở đây nó giống nhau thôi, anh copy lên nên nhầm trên lại dùng checked, em xem bài trước để hiểu là nó giống nhau nha em

  • @sonlengoc948
    @sonlengoc948 Рік тому

    làm sao để lấy value của input này gắn sang input kia anh
    ví dụ em có 2 input
    khi em nhập 1 cái input, thì cái còn lại tự nhận value của cái kia

    • @F8VNOfficial
      @F8VNOfficial  Рік тому +1

      Khi change input 1 thì em set data vào state, dùng state truyền cho prop value của input 2 em nhé

  • @vanvantran1061
    @vanvantran1061 2 роки тому +1

    phút thứ 21:25 tại sao không thể lấy được id từ vị trí handleCheck vậy anh, và tại sao lại dùng 1 hàm cha để gọi lại hàm HandleCheck mà ko truyền thẳng hàm handleCheck vào vậy ạ

    • @trungphanphuoc1426
      @trungphanphuoc1426 2 роки тому +1

      handleCheck là cái function, out of scope nên k thấy lấy đc cái id, nên phải truyền param vào để xử lý.
      2. Để dễ maintain, xử lý, clean code hơn :)))

    • @tuannguyenhuu964
      @tuannguyenhuu964 2 роки тому

      vì chỉ có thể lấy được id khi đoạn code nằm bên trong cái method MAP thôi bạn

  • @pineapplesub3581
    @pineapplesub3581 2 роки тому +1

    Có bạn nào hiểu tại sao có cái tham số prev trong chỗ callback setChecked không mọi người. Cái prev đó ở đâu ra, khai báo ở đâu mà dùng vậy nhỉ mọi người?
    Thanks!

    • @khanhbt14
      @khanhbt14 2 роки тому +2

      Prev đó chính là cái state khởi tạo ban đầu, tham số đó bạn đặt tên gì cũng đc.

    • @pineapplesub3581
      @pineapplesub3581 2 роки тому +1

      @@khanhbt14 Mình vẫn chưa hiểu ở chỗ là tải sao đặt cái chữ 'prev' hoặc 1 tên khác vào trong setState() là nó mặc định trở thành thằng state trước đó? Ví dụ để setChecked(checked => [...checked, id]) thì mình còn hiểu, còn để prev mình chưa thể nào hiểu được.

    • @minhtran-uv4nd
      @minhtran-uv4nd 2 роки тому +2

      [checked, setChecked] = useState() . Thì cái tham số prev đó tương ứng với biến checked . hiểu nôm na thì prev = checked .

    • @F8VNOfficial
      @F8VNOfficial  2 роки тому +1

      Bạn miss bài trước hả? Với cả tên tham số đặt đúng quy ước đặt tên biến là được chứ prev hay checked trong ngữ cảnh này khác gì nhau đâu. Prev là trước đó, prevState của setChecked thì nó là giá trị trước đó của checked sau khi set state

    • @pineapplesub3581
      @pineapplesub3581 2 роки тому

      @@F8VNOfficial dạ em hiểu rồi ấy ah, cảm ơn anh nhiều nhé

  • @vutienle926
    @vutienle926 2 роки тому +1

    e thử xử lý khác a Sơn 1 tí đoạn nếu check vào phần tử đã chọn thì sẽ xóa phần tử đó ra khỏi mảng checked, lúc e console.log(checked) thì nó vẫn hiện ra mảng đã xóa phần tử check lần thứ 2, nhưng render ra HTML lại sai, và nếu check vào 1 checkbox bất kì thì nó lại hiện ra phần tử đã xóa trước đó, ai giải thích dùm e với
    Đây là hàm xử lý
    const handleChecked = (id) => {
    setChecked(prev => {
    const isChecked = prev.includes(id)
    if (isChecked) {
    // return prev.filter(item => item !== id) //đoạn này của anh Sơn thì return ra 1 mảng mới và gán mảng đó vào checked
    prev.splice(prev.indexOf(id), 1) // đoạn này e thử xóa phần tử có trong mảng
    return prev //sau đó return về mảng đã xóa phần tử
    } else {
    return [...prev, id]
    }
    })
    }

    • @hoangnguyen-rv9jg
      @hoangnguyen-rv9jg 2 роки тому +1

      Đoạn này mình nghĩ do bị bất đồng bộ của thằng setState. bạn dùng pre.splice nó đã thay đổi luôn giá trị cảu checked r. Sau setState lại dùng tiếp cái giá trị đã thay đổi đấy.(mình nghĩ thế ko chắc lắm nhé :v). Vẫn cần chuyên gia vào confirm

    • @hoangnguyen-rv9jg
      @hoangnguyen-rv9jg 2 роки тому +1

      Mình có tìm hiểu và thử lại r. Bạn dùng splice sẽ đổi cả giá trị checked và pre. Nghĩa là setState bạn truyền lại chính nó(không thay đổi giá trị tương tự setState(pre=> pre) ) nên sẽ không re-render lại khi gọi setState

    • @toannongquoc9004
      @toannongquoc9004 2 роки тому

      bạn return [...prev] thử xem nhé!

    • @hoangnguyen-rv9jg
      @hoangnguyen-rv9jg 2 роки тому

      @@toannongquoc9004 cái này là tạo 1 mảng mới. Tham trị và tham chiếu ý bạn. Spread dĩ nhiên so sánh sẽ ra 2 mảng khác nhau r

  • @vinhtran3204
    @vinhtran3204 Рік тому

    Anh sơn ơi tại sao phần checkbox khi em nhấn chọn 2 lần thì nó báo lỗi là Cannot read properties of undefined (reading 'includes') vậy anh

    • @hoanhm0409
      @hoanhm0409 10 місяців тому

      bug này là do cái đối tượng đang gọi đến includes là undefined

  • @nvtentertainment4098
    @nvtentertainment4098 7 місяців тому

    Angular JS hình như là 2 chiều Binding đúng không anh

  • @giaitri24h16
    @giaitri24h16 2 роки тому +1

    Mọi người cho mình hỏi: 1) Sao chỗ syle này lại cần 2 ngoặc nhọn nhỉ. mình để 1 thì báo lỗi, 2) tại sao lại để là 32 mà không phải là 32px vậy. Mong mọi người giải đáp giúp mình.

  • @myhanhnguyen5198
    @myhanhnguyen5198 2 роки тому

    setChecked((prev) => {
    const isChecked = checkedd.includes(id);
    if (isChecked) {
    //unchecked
    } else {
    return [...prev, id];
    }
    });
    anh ơi, cho em hỏi trong hàm setChecked(...), đoạn if(isChecked){....} else{ return [...prev, id];}
    em ko hiểu logic phần này, tại sao điều kiện nếu checked thì là unchecked, ngược lại thì trả về mảng chỉ bao gồm các giá trị id từ 1-3.
    ý nghĩa của biểu thức điều kiện ở đây là gì ạ? có ai có thể giải thích giúp em với ạ. em cảm ơn rất nhiều

    • @trungphanphuoc1426
      @trungphanphuoc1426 2 роки тому +2

      Là như này nhá, vì là checkbox nên có vụ check lại lần nữa thì uncheck nó đi.
      isChecked=checked.includes(id)
      //chổ này đặt cờ kiểm tra nếu list checked có chưa id đó thì return true
      //if kiểm tra cờ true thì thực hiện uncheck, bình thường thì nhiều người sẽ slice cái id đó ra khỏi list. Mà có cách nhanh khác nữa là filter cái list lấy ra những thằng có id khác thằng id ở param
      checked.filter(itemId=>itemId !== id)
      //chổ này nó sẽ return về cái list mới không chứa cái id đc truyền
      //nếu cờ isChecked = false
      Thì thực hiện push cái id đó vào list, nhưng mà làm gọn thì clone lại list checked rồi thêm id vào. Vì viết đúng concept react nên có prevState chứ mấy người lười thì họ return setChecked([...checked,id])

    • @myhanhnguyen5198
      @myhanhnguyen5198 2 роки тому +2

      @@trungphanphuoc1426 em cảm ơn anh nhiều ạ, giờ em hiểu rùi ạ chỗ này cần sửa là: nếu đặt cờ kiểm tra list checked chưa có id thì return false
      đúng ko anh?
      cờ là true: nếu như list checked chứa id trùng khi check

  • @TrucNguyen-ut7pc
    @TrucNguyen-ut7pc 2 роки тому +2

    Chủ tịch nói sai chỗ nào thì nói lại chỗ đó thôi, hoặc cắt video khúc đó nói lại thôi chứ nói lại từ đầu mất công lắm

  • @thienvu7683
    @thienvu7683 2 роки тому +2

    a có thể ví dụ trong trường hợp select all và deselect all được không ạ? 😂

    • @trungphanphuoc1426
      @trungphanphuoc1426 2 роки тому

      Select all thì push hết cái list vào, deselect all thì set lại empty thôi mà 😅

  • @manhdao155
    @manhdao155 Рік тому

    chỗ map sau => sao lại là dấu () vậy ạ, em dùng {} sai phải ngồi nhìn mãi :v

    • @TanNguyen-cs4me
      @TanNguyen-cs4me Рік тому

      Bạn xem lại Arrow Function sẽ hiểu nha. { } khi bên trong viết logic hàm callback. Còn ( ) khi bên trong chỉ viết giá trị trả về của hàm callback đó thôi. Nếu logic ko có gì quá phức tạp thì sẽ viết thẳng giá trị trả về như vậy luôn.

  • @duxng1787
    @duxng1787 2 роки тому +1

  • @quyenly405
    @quyenly405 Рік тому

    Lỗi
    Uncaught (in promise ) SyntaxError: "undefined" is not valid JSON
    at JSON.parse ()
    at content_bundle.js:1:974975
    Là bị gì vậy ạ . Cứ npm start là xem trên console trình duyệt xuất hiện và cho em giải pháp biến mất 😂

    • @KunzHorus
      @KunzHorus 11 місяців тому

      b fix dc chua chỉ mình vs

    • @quyenly405
      @quyenly405 11 місяців тому

      @@KunzHorus do trình duyệt khác chrome mới bị. Mình dùng côccoc

    • @KunzHorus
      @KunzHorus 11 місяців тому

      @@quyenly405 oki b

  • @hieuminh2809
    @hieuminh2809 Рік тому

    like🥰🥰🥰🥰🥰🥰

  • @cesmorf5398
    @cesmorf5398 2 роки тому +1

    Chỗ checked ={ !checked.includes(course.id) } ok ?

  • @B8Official
    @B8Official 2 роки тому +1

    Good job