2014-10-14 23 views
22

Tôi đang cố gắng 'đặt lại' phần tử ReactJS.Làm cách nào để 'đặt lại' một phần tử ReactJS?

Trong trường hợp này, phần tử là 90% + nội dung của trang.

Tôi đang sử dụng replaceState để thay thế trạng thái của phần tử với trạng thái ban đầu.

Thật không may, các phần tử con có trạng thái 'riêng' không được đặt lại. Đặc biệt, các trường biểu mẫu giữ nội dung của chúng.

Có cách nào buộc buộc trả lại phần tử hay không, điều này cũng sẽ làm cho các phần tử phụ hiển thị lại, như thể trang vừa tải?

+0

Có lẽ bạn nên chuyển tiểu bang làm đạo cụ cho trẻ em – David

+0

Nếu bạn sử dụng mô hình [thành phần được kiểm soát] (https://facebook.github.io/react/docs/forms.html#controlled-components) được đề cập trong tài liệu React và lưu trữ trạng thái cao lên cấp bậc mà bạn đang gọi 'replaceState', bạn cũng có thể "đặt lại" trạng thái của biểu mẫu. –

+1

@ssorallen Các đầu vào được nhúng trong các phần tử có chức năng và thông tin liên lạc riêng với máy chủ. ví dụ. trường "tên người dùng" thực hiện kiểm tra AJAX riêng cho các bản sao, như một phần của xác thực * trường *. – fadedbee

Trả lời

49

Thêm key vào phần tử buộc phần tử (và tất cả các phần tử con) được hiển thị lại khi khóa đó thay đổi.

(Tôi thiết lập giá trị của 'chìa khóa' để chỉ đơn giản là dấu thời gian khi các dữ liệu ban đầu đã được gửi.)

render: function() { 
    return (
    <div key={this.state.timestamp} className="Commissioning"> 
     ... 
1

Trong khi tôi không cá nhân tôi nghĩ bạn nên lưu trữ địa phương, tiểu bang thành phần tạm thời (như các hộp đầu vào đang tiến hành) ở một vị trí tập trung (như một cửa sổ thông lượng) trong hầu hết các trường hợp, ở đây có thể có ý nghĩa, tùy thuộc vào số lượng bạn có, đặc biệt vì nó giống như các đầu vào đã có một số tương tác máy chủ/xác thực xung quanh chúng. Đẩy trạng thái đó lên cấu trúc phân cấp thành phần hoặc vào một số vị trí trung tâm khác có thể giúp ích rất nhiều trong trường hợp này.

Một ý tưởng thay thế ngoài đỉnh đầu của tôi là sử dụng mixin trong các thành phần có thể cần đặt lại trạng thái cục bộ và thực hiện một số loại kích hoạt sự kiện, v.v. Ví dụ, bạn có thể sử dụng Node của EventEmitter hoặc một thư viện như EventEmitter3 với một mixin như thế này (cảnh báo: không kiểm tra, có lẽ tốt nhất này là giả :)

var myEmitter = new EventEmitter(); // or whatever 

var ResetStateMixin = { 
    componentWillMount: function() { 
    myEmitter.on("reset", this._resetState); 
    }, 

    componentWillUnmount: function() { 
    myEmitter.off("reset", this._resetState); 
    }, 

    _resetState: function() { 
    this.replaceState(this.getInitialState()); 
    }, 

    triggerReset: function() { 
    myEmitter.emit("reset"); 
    } 
}; 

Sau đó, bạn có thể sử dụng nó trong các thành phần như sau:

React.createClass({ 
    mixins: [ResetStateMixin], 

    getInitialState: function() { 
    return { ... }; 
    }, 

    onResetEverything: function() { 
    // Call this to reset every "resettable" component 
    this.triggerReset(); 
    } 
}); 

này là rất cơ bản và khá nặng tay (bạn chỉ có thể đặt lại tất cả các thành phần, mỗi thành phần gọi replaceState(this.getInitialState()), vv) nhưng những vấn đề có thể được giải quyết bằng cách mở rộng một chút (ví dụ như có nhiều bộ phát sự kiện, cho phép thành phần mixin -specific resetState triển khai, v.v.).

Cần lưu ý rằng bạn do phải sử dụng các đầu vào được kiểm soát để tính năng này hoạt động; trong khi bạn không cần phải đẩy trạng thái của bạn lên tất cả các phân cấp thành phần, bạn vẫn muốn tất cả các đầu vào của mình có các trình xử lý valueonChange (v.v).

+0

Trong trường hợp nào tốt hơn là thêm một 'khóa' vào phần tử? – fadedbee

+0

@brandon, tôi có thể yêu cầu bạn xem xét câu hỏi liên quan đến 'phản hồi kết xuất' ở đây không: http://stackoverflow.com/questions/27913004/react-js-render-a-component-from-outside-react? –

+0

Tôi đồng ý với bạn về giải pháp thông lượng. Chỉ cần suy nghĩ về khả năng bắn một hành động mỗi khi biểu mẫu thay đổi (có thay đổi đầu vào). – backdesk

6

Phương pháp this.replaceState(this.getInitialState()) không thực sự đặt lại trẻ em là đầu vào, nếu đó là những gì bạn đang tìm kiếm. Đối với bất kỳ ai muốn chỉ cần đặt lại các trường biểu mẫu của mình, có chức năng DOM reset() tiêu chuẩn sẽ xóa tất cả các yếu tố đầu vào trong một phần tử đã cho.

Vì vậy, với phản ứng, nó muốn được một cái gì đó như thế này:

this.refs.someForm.getDOMNode().reset(); 

Doumentation:

https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/reset

4

Nếu nó là một hình thức mà bạn muốn thiết lập lại, bạn chỉ có thể sử dụng

này
// assuming you've given {ref: 'form'} to your form element 
React.findDOMNode(this.refs.form).reset(); 
Các vấn đề liên quan