2015-07-14 15 views
12

Đây là mảnh của tôi về mã, trong đó hoạt động một cách chính xác (bổ sung hồ sơ), nhưng ném một lỗi sau khi bổ sung:React.js: Bạn được gọi là 'setState` với một callback đó không phải là callable

Uncaught Error: Invariant Violation: enqueueCallback(...): You called setProps , replaceProps , setState , replaceState , or forceUpdate with a callback that isn't callable.

handleSubmit: function(e) { 
    e.preventDefault(); 
    return $.post('', {page: this.state}, 
     function(data) { 
     this.props.handleNewPage(data); 
     return this.setState(this.getInitialState(), 'JSON'); 
     }.bind(this) 
    ); 
    } 

Hiện không có tuyến đường nào. Ai đó có thể giúp tôi giải quyết vấn đề này không?

+1

đã thử điều này? 'return this.setState (this.getInitialState, 'JSON');' – philipp

+0

hoạt động tương tự. –

Trả lời

31

Tham số thứ hai (tùy chọn) là setState là hàm gọi lại, không phải là chuỗi. Bạn có thể chuyển một hàm sẽ được thực thi sau khi thao tác hoàn tất.

+0

xóa đối số thứ hai 'JSON' thực sự đã giúp! Cảm ơn rất nhiều :) –

+0

setState thực sự chấp nhận gọi lại làm đối số đầu tiên: https://facebook.github.io/react/docs/component-api.html –

+2

@HannesJohansson Tham số đầu tiên có thể là hàm ** ** (không phải gọi lại, có sự khác biệt) hoặc đối tượng. Hoặc là làm việc tốt. Một cuộc gọi lại hoàn toàn là một chức năng được * gọi lại * khi một thao tác được hoàn thành. Đó không phải là trường hợp với đối số đầu tiên của setState. –

1

Bạn thực sự gọi getInitialState thay vì cung cấp tham chiếu đến chính hàm đó trên dòng return this.setState(this.getInitialState(), 'JSON'); và đối số thứ hai sẽ không bao giờ là gì ngoài chức năng gọi lại.

this.setState mong muốn một hàm sẽ trả về đối tượng trạng thái dưới dạng một đối số hoặc đối tượng để kết hợp trạng thái hiện tại với (cộng với tùy chọn gọi lại làm đối số thứ hai để chạy sau khi trạng thái đã được đặt). Vì vậy, hoặc bạn chỉ cung cấp một hàm trả về trạng thái mới, hoặc bạn cung cấp một đối tượng mà trạng thái hiện tại sẽ được hợp nhất với tư cách đối số đầu tiên và một cuộc gọi lại sẽ được thực thi sau khi trạng thái được đặt làm đối số thứ hai.

Hoặc là this.setState(this.getInitialState) hoặc this.setState(this.getInitialState()) hoặc this.setState(newState, callback).

Kiểm tra chữ ký trong API here.

Các vấn đề liên quan