Theo Reacjs.org, thành phầnWillMount sẽ không được hỗ trợ trong tương lai.
https://reactjs.org/docs/react-component.html#unsafe_componentwillmount
Không cần sử dụng thành phầnWillMount.
Nếu bạn muốn làm một cái gì đó trước khi thành phần được gắn kết, chỉ cần thực hiện nó trong hàm tạo ().
Nếu bạn muốn thực hiện các yêu cầu mạng, đừng thực hiện nó trong thành phầnWillMount. Đó là bởi vì làm điều này sẽ dẫn đến lỗi bất ngờ.
Yêu cầu mạng có thể được thực hiện trong thành phầnDidMount.
Hy vọng nó giúp.
cập nhật ngày 08/03/2019
Lý do tại sao bạn yêu cầu thành phầnWillMount có thể là vì bạn muốn khởi tạo trạng thái trước khi kết xuất.
Chỉ cần làm điều đó trong useState.
const helloWorld=()=>{
const [value,setValue]=useState(0) //initialize your state here
return <p>{value}</p>
}
export default helloWorld;
hoặc có thể Bạn muốn chạy một hàm trong thành phầnWillMount, ví dụ, nếu mã gốc của bạn trông như thế này:
componentWillMount(){
console.log('componentWillMount')
}
với hook, tất cả những gì bạn cần làm là loại bỏ phương thức vòng đời:
const hookComponent=()=>{
console.log('componentWillMount')
return <p>you have transfered componeWillMount from class component into hook </p>
}
Tôi chỉ muốn thêm một cái gì đó vào câu trả lời đầu tiên về useEffect.
useEffect(()=>{})
useEffect chạy trên mọi kết xuất, nó là sự kết hợp của thành phầnDidUpdate, thành phầnDidMount và thành phầnWillUnmount.
useEffect(()=>{},[])
Nếu chúng ta thêm một mảng trống trong useEffect thì nó chỉ chạy khi thành phần được gắn kết. Đó là bởi vì useEffect sẽ so sánh mảng bạn truyền cho nó. Vì vậy, nó không phải là một mảng trống. Nó có thể là mảng không thay đổi. Ví dụ: nó có thể là [1,2,3] hoặc ['1,2']. useEffect vẫn chỉ chạy khi thành phần được gắn kết.
Nó phụ thuộc vào bạn cho dù bạn muốn nó chỉ chạy một lần hay chạy sau mỗi lần kết xuất. Sẽ không nguy hiểm nếu bạn quên thêm một mảng miễn là bạn biết bạn đang làm gì.
Tôi đã tạo một mẫu cho hook. Làm ơn hãy kiểm tra nó.
https://codesandbox.io/s/kw6xj153wr
cập nhật ngày 21/08/2019
Nó đã là một màu trắng kể từ khi tôi viết câu trả lời ở trên. Có một điều mà tôi nghĩ bạn cần chú ý. Khi bạn sử dụng
useEffect(()=>{},[])
Khi phản ứng so sánh các giá trị bạn truyền vào mảng [], nó sử dụng Object.is () để so sánh. Nếu bạn truyền một đối tượng cho nó, chẳng hạn như
useEffect(()=>{},[{name:'Tom'}])
Điều này giống hệt như:
useEffect(()=>{})
Nó sẽ kết xuất lại mỗi lần vì khi Object.is () so sánh một đối tượng, nó sẽ so sánh tham chiếu của nó chứ không phải giá trị của chính nó. Nó giống như lý do tại sao {} === {} trả về false vì các tham chiếu của chúng khác nhau. Nếu bạn vẫn muốn so sánh bản thân đối tượng không phải là tham chiếu, bạn có thể làm một cái gì đó như thế này:
useEffect(()=>{},[JSON.stringify({name:'Tom'})])