Skip to content

S2 - L29 - Video Selection #7

@ngminhtrung

Description

@ngminhtrung

Phần này nói đến vụ truyền props và thay đổi state làm mình bất ngờ.

  1. 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.

  2. 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">
  1. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions