2016-03-10 13 views
10

Có cách nào để có được sự khác biệt mà React đang nhận được của DOM/Thành phần không? Tôi có thể tưởng tượng cố gắng lưu trữ các thay đổi khi chúng xảy ra để người dùng có thể 'hoàn tác' các thay đổi [và cá nhân quan tâm đến sự sẵn có của diff khác nằm bên dưới phần đầu (có lẽ nó sẽ có các thành phần đã thay đổi?)].Nhận được sự khác biệt về sự tái hiện trong React

EDIT: Tính năng hoàn tác chỉ là một ví dụ. Tôi chỉ quan tâm đến việc liệu ở trên có thể trích xuất từ ​​React, vì nó được cho là đang làm một sự khác biệt của cây mới và cũ.

+0

* "Tôi đang cố lưu trữ các thay đổi khi chúng xảy ra để người dùng có thể 'hoàn tác' thay đổi." * Thay vào đó hãy lưu nhanh trạng thái ứng dụng/thành phần của bạn. Sau đó, "hoàn tác" chỉ đơn giản là tải trạng thái trước đó. Nó thực sự không rõ ràng với tôi tại sao bạn sẽ muốn một sự khác biệt của ** DOM **. –

+0

Ứng dụng/thành phần chính nó giống cây - nó sẽ thuận tiện để có quyền truy cập vào diff, vì tôi vẫn muốn theo dõi nó, có lẽ lưu trữ thông tin cho các mục đích khác. Tôi sẽ cần phải tạo ra một khác biệt riêng biệt khác, nhưng nếu tôi có thể khai thác và nhận được thông tin đó; có khả năng hữu ích. – Cenoc

Trả lời

7

Tôi đang cố gắng để lưu trữ thay đổi khi chúng xảy ra vì vậy người dùng có thể 'hoàn tác' những thay đổi

đề xuất của tôi làm thế nào để thực hiện điều này:

Phản ứng làm cho kết quả nên chỉ dựa trên tiểu bang. Nếu bạn đưa ra trạng thái giống hệt nhau hai lần, thì DOM phải giống hệt nhau. Có thể các thành phần con phải là phi trạng thái.

componentWillUpdate phương pháp được chạy sau khi thay đổi về đạo cụ và tiểu bang.

Bạn có thể sao chép và lưu trạng thái sau bất kỳ thay đổi trạng thái nào.

Và nếu người dùng 'hoàn tác' thay đổi thì hãy đặt trạng thái đã lưu cũ làm trạng thái hiện tại.

Và DOM phải giống hệt với trạng thái trước đó.

+3

Đồng ý, với Phản ứng mục tiêu của bạn là không phải thay đổi DOM hoặc lo lắng về trạng thái DOM, thay vào đó bạn xử lý trạng thái dữ liệu của mình và DOM được trả về xác định từ đó. – tt9

+0

@ krzysztof-sztompka Trong khi tôi đồng ý với điều này, câu hỏi của tôi là hỏi từ quan điểm nếu bạn quan tâm đến DOM ảo. Tôi tưởng tượng sự khác biệt sẽ bao gồm các thành phần chứ không phải các phần tử DOM thực tế. – Cenoc

+0

Tôi hiểu quan điểm của bạn, nhưng trong câu trả lời của tôi, tôi đã cố gắng giúp bạn giải quyết vấn đề này theo cách Phản ứng. Làm việc với phản ứng, chúng ta nên rời khỏi dom ảo để phản ứng. Tôi không biết nếu điều này thậm chí có thể thao tác dom ảo. –

0

Sử dụng Redux kết hợp với redux-undo nếu bạn muốn chức năng hoàn tác/làm lại.

0

Để trả lời câu hỏi của bạn: lẽ, nhưng bạn không nên làm điều đó như thế

Hãy tưởng tượng nếu bạn có diff của DOM, sau đó bạn sẽ phải phân tích cú pháp DOM và tìm ra thay đổi dom ánh xạ đến các phần khác nhau của đạo cụ và nhà nước.

Thats lộn xộn.

var SomeComponent = React.createClass({ 
    onChange: function(newData){ 
    currentState = _.clone(this.state.currentState) 
    previousChanges = this.state.previousChanges.concat([currentState]) 

    this.setState({ 
     currentState: newData, 
     previousChanges: previousChanges 
    }) 
    }, 

    undo: function(){ 
    previousChanges = _.clone(this.state.previousChanges) 
    currentState = previousChanges.pop() // removes last item and returns it 

    this.setState({ 
     currentState: currentState, 
     previousChanges: previousChanges 
    })  
    }, 
    render: function(){ 
    <div> 
     <SomeAwesomeThing 
     currentState={this.state.currentState} 
     onChange={this.onChange} 
     onUndo={this.undo} 
     /> 
    </div> 
    } 
}) 

Bạn về cơ bản phải giữ con trỏ đến dữ liệu hiện tại và danh sách thay đổi, nơi mỗi thay đổi có thể dễ dàng được hoàn nguyên về.

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