Sự khác nhau khi gọi hàm thực thi trong ComponentWillMount và hàm setState()
Em có thắc mắc thế này, trong ví dụ này của e : https://codesandbox.io/s/j4n1ojpr1w
Tại sao trong componentWillMount()
khi gọi hàm printCount
phải có dấu ()
, còn khi gọi trong call back của hàm setState
mình lại không cần ạ. Mọi người giải thích giùm e với.
E xin cảm ơn nhiều ạ !
3 CÂU TRẢ LỜI
Có một vài điểm em cần nắm rõ, thì sẽ hiểu được bản chất của vấn đề hơn
Một function trong Javascript thực tế cũng chỉ là một object, nên em có thể thực hiện các phép gán, hay pass các object đó vào trong một hàm khác. Ví dụ
function test() {
console.log('Hello');
}
a = test;
a(); // gọi hàm, in ra Hello
Việc em dùng ()
thì là một lời gọi hàm, còn không có, thì nó chỉ như một biến (object) bình thường mà thôi.
Như vậy this.printCount();
thì là lời gọi để chạy hàm printCount
, còn this.setState({ count: this.state.count + 1 }, this.printCount);
thì tức là em truyền this.printCount
như là một biến vào trong hàm this.setState()
. Khi đó người ta gọi this.printCount
là một callback
, và nó chưa được gọi (chưa được chạy) ngay. Việc gọi hàm đó được thực hiện ở đâu đó trong phần logic bên trong hàm setState
.
tks anh rất nhiều ạ !
khi gọi hàm printCount phải có dấu () vì ở đây đang thực thi hàm khi gọi trong call back của hàm setState mình lại không cần vì đang truyền hàm làm tham số
==> ý bạn nghĩa là khi ta truyền tham số
là một hàm
thì sẽ không cần sử dụng dấu ()
nữa .
Mình có thử thêm ()
vào sau hàm printCount ()
ở hàm setState
thì nó vẫn chạy, nhưng hình như nó lại chạy trước cả hàm setState(), bạn có thể giải thích thêm chỗ này cho mình với được không?
@wiliamfeng Hàm setState có thể có dạng như này
function setState(data, callback) {
state = data;
callback();
}
Dấu ()
tức để để thực hiện luôn cái funciton đấy. Vì cái argument thứ 2 của setState
nó nhận một function callback, callback này được chạy trong setState. Chính vì thế lúc này mình không có dấu ()
để callback không chạy trước khi setState chạy.
cái argument thứ 2 của setState nó nhận một function callback, callback này được chạy trong setState.
====> Chính vì thế lúc này mình không có dấu ()
Trời !!!!!!!! Sao giải thích kì vậy anh ? cái argument thứ 2 của setState nó nhận một function callback, callback này được chạy trong setState
==> cái này thì ai nhìn vào chả biết thế ạ.
setState nó nhận một function callback
xong lại callback này được chạy trong setState.
Ủa hai câu này là một mà
@wiliamfeng Ừ nhỉ, đọc lại mới thấy mình giải thích hơi kỳ. Đúng ra phải nói rõ bản chất thì e mới hiểu được. Srr em nhé. Em đọc answer của anh Thang Tran Duc bên trên để hiểu rõ bản chất của nó nhé. Nếu không hiểu được bản chất thì đọc answer của anh đúng là hơi khó hiểu thật.