2015-10-30 20 views
6

Tôi muốn thực hiện thả xuống với phản ứng và redux. Dropdown sẽ là một phần của thành phần khác, do đó, nó thực sự "Dumb" thành phần. Nhưng trình đơn thả xuống nên gọi tới api để tìm nạp các mục, áp dụng các bộ lọc tùy chỉnh và v.v. Các cuộc gọi Api phải được xác thực, các mã thông báo đã lưu trữ trạng thái toàn cầu. Tôi có nên chuyển mã thông báo cho các đạo cụ thành phần không? Hoặc có một cách tốt hơn để làm điều này?Thực hiện cuộc gọi api từ các thành phần câm với Redux

Trả lời

7

Một thành phần câm, theo định nghĩa, nên câm: có nghĩa là nó nên lấy mọi thứ cần "từ trên cùng", tức là thông qua các đạo cụ.

Chỉ thành phần "thông minh" ("được kết nối" với Redux), lên cấp bậc, sẽ xử lý việc tìm nạp dữ liệu bằng hành động mới (async), sau đó sửa đổi trạng thái khi trả về cuộc gọi API, tái render thành phần Dumb của bạn với các đạo cụ mới của nó.

Vì vậy, trong Redux:

  • phần Dumb của bạn phải mất hai đạo cụ: một với các giá trị đến từ API của bạn (mà thực sự là một phần của bạn "nhà nước"), một trong những khác một hàm được gọi khi thả xuống các mục đã chọn của bạn thay đổi. <MyDumbComponent data={this.props.data} onChange={this.onChange.bind(this)} />
  • Sau đó, thành phần "thông minh" lên phân cấp sẽ nghe hàm onChange đó và gửi Hành động (FETCH_DATA)
  • Hành động (async) sẽ gọi API và khi nhận dữ liệu, hãy gọi một Hành động khác (FETCH_DATA_SUCCESS) với dữ liệu
  • Sau đó, Redux, với bộ giảm tốc, sẽ cập nhật trạng thái của nó từ tải trọng Hành động
  • Điều này sẽ kết xuất lại Thành phần của bạn với đạo cụ mới (dữ liệu mới).

Bạn có thể muốn đọc: http://redux.js.org/docs/basics/UsageWithReact.html

Và liên quan đến hành động async: http://redux.js.org/docs/advanced/AsyncActions.html

1

phần Dumb không có nghĩa là nó có thể làm bất cứ điều gì giống như lấy thông tin cập nhật, nó có nghĩa là nó 'câm' đến khái niệm về redux và không biết gì về cửa hàng của bạn hoặc thư viện bạn đang sử dụng. Lợi ích là bạn có thể thay đổi việc thực hiện thông lượng của mình và bạn chỉ có một chút công việc để cập nhật các thành phần thông minh.

Đối với loại kịch bản bạn mô tả, bạn sẽ cung cấp cho <Menu> một chức năng thông qua các đạo cụ sẽ chạy khi <Menu> muốn cập nhật dữ liệu. <Menu> không biết gì về Redux - nó chỉ thực hiện một chức năng - nhưng nó vẫn có thể tìm nạp dữ liệu mới. Tùy thuộc vào sự phức tạp, bạn có thể chuyển qua trình tạo hành động thô (ràng buộc với dispatchAction) và chạy nó.

import * as dataActions from './actions'; 
// We have dataActions.fetchItems() which is the action creater to get new items. 

// Attach items, and the action creator (bound to dispatch) to props 
@connect((store) => { 
    return {items: store.data.items} 
}, dataActions) 
class ItemsPage extends Component { 
    static propTypes = { 
     items: PropTypes.object, // the items from the store, from @connect 
     fetchItems: PropTypes.func // action dispatcher, from @connect 
    } 

    render() { 
     return (<Menu onChange={this.props.fetchItems} />) 
    } 
} 

// Our 'dumb' component that doesnt know anything about Redux, 
// but is still able to update data (via its smart parent) 
class Menu extends Component { 
    static propTypes = { 
     onChange: PropTypes.func // same as fetchItems 
    } 

    render() { 
     return (<button onClick={this.props.onChange}>Update items</button>); 
    } 
} 
Các vấn đề liên quan