Phần này nói đến vụ truyền props và thay đổi state làm mình bất ngờ.
-
Nhu cầu ban đầu là gì? Đó là khi click chọn vào 1 trong các ô trong phần Video List, thì ô Video Detail sẽ tự động thay đổi, chuyển sang video vừa được chọn.
-
Vậy tác giả đã hướng dẫn làm như thế nào?
Ý tưởng chung: Sử dụng callback, truyền từ App -> Video List -> Video_list_item -> thay đổi Video_Detail
- Bước 1: Từ component App, truyền 1 callback function vào component VideoList dưới dạng props. Props này gán vào attribute
onVideoSelect. Chưa nói đến vụ đây là callback, function này có tác dụng nhận vào 1 object video, rồi truyền sang cho hàm setState() để đặt lại state của App, cụ thể là properties selectedVideo. Một khi hàm này được gọi, state của App thay đổi, nghĩa là React sẽ render lại những component liên quan đến phần thay đổi trong App, ở đây là selectedVideo, dẫn đến component VideoDetail sẽ được render lại.
<VideoList
onVideoSelect={selectedVideo => this.setState({selectedVideo})}
videos={this.state.videos}
/>
- Bước 2: Trong component VideoList, truyền tiếp function kia cho VideoListItem dưới dạng props. Props này gán vào attribue
onVideoSelect (cùng tên).
return <VideoListItem
onVideoSelect={props.onVideoSelect}
key={video.etag}
video={video} />
- Bước 3: Trong component VideoListItem, truyền tiếp function kia vào event handle
onClick của element <li>. Nghĩa là khi bạn <li> này bị click chọn, thì function kia được gọi. Event handler onClick của bạn <li> này sẽ truyền vào object video cho function, vậy là xong, fucntion đã có đủ mọi thứ để chạy. Và nó chạy giống như mục đích đặt ra, đã nói ở bước 1.
<li onClick={() => onVideoSelect(video)} className="list-group-item">
- Vậy có gì thấy hay?:
Hay ở chỗ function nói trên đã "du lịch xuống" 2 level:
- từ App -> VideoList,
- từ VideoList -> VideoListItem*,
Đến tận VideoListItem, nó mới được truyền vào tham số để chạy. Kết quả chạy này, lại có tác dụng kích động phản ứng ở tận ... App. Quá ngạc nhiên.
Theo cái hiểu hiện tại, mỗi component đều có state riêng, method setState() ở component nào sẽ có tác dụng chỉ với component đấy. Vậy mà mà method setState() kia chu du tận đâu, vậy mà vẫn quay về thay đổi component mà ban đầu nó được gửi đi.
Phần này nói đến vụ truyền props và thay đổi state làm mình bất ngờ.
Nhu cầu ban đầu là gì? Đó là khi click chọn vào 1 trong các ô trong phần Video List, thì ô Video Detail sẽ tự động thay đổi, chuyển sang video vừa được chọn.
Vậy tác giả đã hướng dẫn làm như thế nào?
Ý tưởng chung: Sử dụng callback, truyền từ App -> Video List -> Video_list_item -> thay đổi Video_Detail
onVideoSelect. Chưa nói đến vụ đây là callback, function này có tác dụng nhận vào 1 object video, rồi truyền sang cho hàmsetState()để đặt lại state của App, cụ thể là properties selectedVideo. Một khi hàm này được gọi, state của App thay đổi, nghĩa là React sẽ render lại những component liên quan đến phần thay đổi trong App, ở đây là selectedVideo, dẫn đến componentVideoDetailsẽ được render lại.onVideoSelect(cùng tên).onClickcủa element<li>. Nghĩa là khi bạn<li>này bị click chọn, thì function kia được gọi. Event handleronClickcủa bạn<li>này sẽ truyền vào object video cho function, vậy là xong, fucntion đã có đủ mọi thứ để chạy. Và nó chạy giống như mục đích đặt ra, đã nói ở bước 1.Hay ở chỗ function nói trên đã "du lịch xuống" 2 level:
Đến tận VideoListItem, nó mới được truyền vào tham số để chạy. Kết quả chạy này, lại có tác dụng kích động phản ứng ở tận ... App. Quá ngạc nhiên.
Theo cái hiểu hiện tại, mỗi component đều có state riêng, method
setState()ở component nào sẽ có tác dụng chỉ với component đấy. Vậy mà mà methodsetState()kia chu du tận đâu, vậy mà vẫn quay về thay đổi component mà ban đầu nó được gửi đi.