1; https://github.com/ThaiHoangtvh/Reactjs2/blob/master/src/components/Todo.js
không nên viết function inline: onClick={() =>onDeleteClick(todo.id)} vì mỗi lần render file thì nó sẽ khởi tạo lại function => ảnh hưởng tới performence của component, nên tạo 1 biến và sử dụng hàm useCallback để xử lí sự kiện onClick,
=> const onDeleteClick = useCallback(() => { handleDeleteClick(todo.id) }, [todo.id])
onClick={onDeleteClick}
const onAddBtnClick = useCallback((e) =>{
if(textInput === ""){
alert('Bạn cần nhập task');
}else{
setTodoList([...todoList, {id: uuidv4(), name: textInput, isCompleted: false}]);
setTextInput("");
}
}, [textInput, todoList]);
=> hook không nên phụ thuộc vào 1 biến satet và trong hook đó lại thay đổi giá trị của biến đó
},[]) => Không nên tạo function rồi gọi lại trong hook, vì bản thân hook khi được gọi thì nó sẽ thực hiện xử lí những dòng code trong hook đó rồi => xóa dòng const setID = () =>{ và dòng call funtion setID();
=> (id,isCompleted) không nên truyền nhiều biến vào, chỉ nên truyền 1 biến là object, và biến object đó sẽ chứa các phần tử của object đó, (id, a, isCompleted) => ({id,isCompleted}) onCheckBtnClick({id: 1, isCompleted; true })
<Textfield
ClassName = "txt_add"
id = "input_add"
placeholder = "Nhập task..."
value = {textInput}
onchange = {onTextInputChange}
/> => đổi tên props onchange => handleChange
1; https://github.com/ThaiHoangtvh/Reactjs2/blob/master/src/components/Todo.js không nên viết function inline: onClick={() =>onDeleteClick(todo.id)} vì mỗi lần render file thì nó sẽ khởi tạo lại function => ảnh hưởng tới performence của component, nên tạo 1 biến và sử dụng hàm useCallback để xử lí sự kiện onClick, => const onDeleteClick = useCallback(() => { handleDeleteClick(todo.id) }, [todo.id]) onClick={onDeleteClick}
2: https://github.com/ThaiHoangtvh/Reactjs2/blob/master/src/components/TodoList.js Nên sử dụng memo vì có truyền prop todoList (todoList là 1 biến state => nó sẽ thay đổi trong quá trình người dùng sử dụng) 1: const a = useMemo(() => { return b; }, [todoList]) 2: export default memo(TodoList)
3: https://github.com/ThaiHoangtvh/Reactjs2/blob/master/src/components/footer.js => tốt 4; https://github.com/ThaiHoangtvh/Reactjs2/blob/master/src/components/header.js => tốt 5: https://github.com/ThaiHoangtvh/Reactjs2/blob/master/src/components/button/index.js => Không nên sử dụng biến đầu vào prop, vì nó có chưa tất cả prop default + prop custom => nhưng trong component mình chỉ cần lấy những prop custom => prop default sẽ dư thừa không cần thiết => ảnh hưởng tới performence
6: https://github.com/ThaiHoangtvh/Reactjs2/blob/master/src/components/input/index.js => Sửa giống số 5 import React from "react"; const Textfield = (Props) =>{ return ( <input className={Props.ClassName} id={Props.id} placeholder={Props.placeholder} value = {Props.value} onChange = {Props.onchange}> ) } export default Textfield => nên xử lí hàm onChange và truyền giá trị lên props parent tại component
import React from "react"; const Textfield = ({handleChange}) =>{ const onChange = useCallback((event) => { handleChange && handleChange(event.target.value) }, [handleChange]); return ( <input className={Props.ClassName} id={Props.id} => nên bỏ placeholder={Props.placeholder} value = {Props.value} onChange = {onChange}> ) }
7: https://github.com/ThaiHoangtvh/Reactjs2/blob/master/src/App.js const onTextInputChange = useCallback((e) =>{ setTextInput(e.target.value) },[]); => chỉ nên nhận giá trị value từ component input truyền lên setTextInput(value)
const onAddBtnClick = useCallback((e) =>{ if(textInput === ""){ alert('Bạn cần nhập task'); }else{ setTodoList([...todoList, {id: uuidv4(), name: textInput, isCompleted: false}]); setTextInput(""); } }, [textInput, todoList]); => hook không nên phụ thuộc vào 1 biến satet và trong hook đó lại thay đổi giá trị của biến đó
},[]) => Không nên tạo function rồi gọi lại trong hook, vì bản thân hook khi được gọi thì nó sẽ thực hiện xử lí những dòng code trong hook đó rồi => xóa dòng const setID = () =>{ và dòng call funtion setID();
=> (id,isCompleted) không nên truyền nhiều biến vào, chỉ nên truyền 1 biến là object, và biến object đó sẽ chứa các phần tử của object đó, (id, a, isCompleted) => ({id,isCompleted}) onCheckBtnClick({id: 1, isCompleted; true })
<Textfield ClassName = "txt_add" id = "input_add" placeholder = "Nhập task..." value = {textInput} onchange = {onTextInputChange} /> => đổi tên props onchange => handleChange