2016-01-23 22 views
17

Tại sao các đối tượng trong Redux là bất biến? Tôi biết rằng một số khung như Angular2 sẽ sử dụng onPush và có thể tận dụng lợi thế của bất biến để so sánh trạng thái của các khung nhìn để hiển thị nhanh hơn, nhưng tôi tự hỏi liệu có lý do nào khác như Redux là không xác định khuôn khổ hay không. sử dụng bất biến (bất kể khung công tác).Tại sao các đối tượng trong Redux là bất biến?

Đánh giá cao mọi phản hồi.

+1

Nó làm cho mọi thứ dễ dàng hơn để lý do về, và giúp ngăn bạn vô tình thay đổi trạng thái bên ngoài cách thực hiện Redux. –

+3

tx cho câu trả lời ... nhưng loại mơ hồ của nó .. Tôi biết đó là những gì họ luôn luôn nói .. thay đổi một tên từ A đến B không làm cho nó phức tạp hơn hoặc khó khăn hơn về ... – born2net

+4

Hãy để tôi đặt nó theo cách này: nếu tôi biết rằng một cấu trúc dữ liệu là không thể thay đổi, tôi biết có những phần của mã hoàn toàn không thể thay đổi nó. Điều đó làm cho việc kiểm tra mã và tìm lỗi đơn giản hơn rất nhiều. –

Trả lời

12

Redux là một thư viện nhỏ đại diện cho trạng thái là (không thay đổi) đối tượng. Và trạng thái mới bằng cách chuyển trạng thái hiện tại thông qua các hàm thuần túy để tạo trạng thái ứng dụng/đối tượng hoàn toàn mới.

Nếu mắt bạn bị lóa mắt thì đừng lo lắng. Tóm lại, Redux không đại diện cho các thay đổi trong trạng thái ứng dụng của bạn bằng cách sửa đổi các đối tượng (như bạn làm với các mô hình hướng đối tượng). Thay vào đó, các thay đổi trạng thái được thể hiện dưới dạng sự khác biệt giữa đối tượng đầu vào và đối tượng đầu ra (var output = reducer(input)). Nếu bạn tắt tiếng input hoặc output bạn làm mất hiệu lực trạng thái.

Để tóm tắt một cách khác, bất biến là yêu cầu của Redux vì Redux đại diện cho trạng thái ứng dụng của bạn là "ảnh chụp nhanh đối tượng đông lạnh". Với ảnh chụp nhanh rời rạc này, bạn có thể lưu trạng thái của mình hoặc trạng thái đảo ngược và thường có nhiều "kế toán" hơn cho tất cả các thay đổi trạng thái.

Trạng thái ứng dụng của bạn là chỉ được thay đổi bằng danh mục hàm thuần túy được gọi là bộ giảm tốc. Hộp số có 2 thuộc tính quan trọng:

  1. Họ không bao giờ đột biến, trở về đối tượng mới được xây dựng: Điều này cho phép lập luận về đầu vào + đầu ra mà không tác dụng phụ
  2. chữ ký của họ là luônfunction name(state, action) {}, vì vậy nó làm cho dễ dàng thao tác chúng:

Giả sử nhà nước trông như thế này:

var theState = { 
     _2ndLevel: { 
     count: 0 
     } 
    } 

Chúng tôi muốn tăng số lần, vì vậy chúng tôi làm cho những gia giảm

const INCR_2ND_LEVEL_COUNT = 'incr2NdLevelCount'; 

function _2ndlevel (state, action) { 
    switch (action.type) { 
     case INCR_2ND_LEVEL_COUNT: 
      var newState = Objectd.assign({}, state); 
      newState.count++ 
      return newState; 
     } 
    } 

function topLevel (state, action) { 
    switch (action.type) { 
     case INCR_2ND_LEVEL_COUNT: 
      return Objectd.assign({}, {_2ndLevel: _2ndlevel(state._2ndlevel)}); 
    } 
} 

Lưu ý việc sử dụng Objectd.assign({}, ...) để tạo ra một đối tượng hoàn toàn mới trong mỗi giảm:

Giả sử chúng tôi đã có dây lên Redux với các bộ giảm tốc này, nếu chúng tôi sử dụng hệ thống sự kiện của Redux để kích hoạt thay đổi trạng thái ...

dispatch({type: INCR_2ND_LEVEL_COUNT}) 

... Redux sẽ gọi:

theNewState = topLevel(theState, action); 

LƯU Ý: action là từ dispatch()

Bây giờ theNewState là một đối tượng hoàn toàn mới.

Lưu ý: Bạn có thể thực thi bất biến với a library (hoặc new language features), hoặc chỉ cần cẩn thận để không đột biến bất cứ điều gì: D

Đối với một cái nhìn sâu hơn, tôi khuyên bạn nên bạn kiểm this video bởi Dan Abramov (tác giả). Nó sẽ trả lời bất kỳ câu hỏi kéo dài bạn có.

+5

đầu tiên hãy để tôi nói cảm ơn vì câu trả lời, tôi +1 bạn. Nhưng với điều đó, hãy để tôi giải thích, tôi rất ý thức về cách Redux hoạt động, tôi đã sử dụng nó, câu hỏi của tôi là suy nghĩ sâu sắc hơn. Hãy suy nghĩ về nó, nếu bạn thay đổi một tên thay vì thay thế toàn bộ đối tượng giữ tên, bạn có thể STILL đạt được "ảnh chụp nhanh đối tượng đông lạnh". Lý do duy nhất (và đó có thể là một lý do đủ tốt) là để so sánh tốc độ. Vì có thể nhanh hơn để so sánh các đối tượng mới so với các đối tượng đã thay đổi khi trạng thái đóng băng. Đó sẽ là lý do duy nhất tôi có thể thấy ... tx Sean. – born2net

+1

Ahhh ok - Rất tiếc: P. Hmm, tôi không hiểu làm thế nào một "snapshots đối tượng đông lạnh" đạt được khi bạn thay đổi tên, như bạn đã thay đổi đối tượng. Nhưng bất kể, tôi nghĩ bạn đang đi đúng hướng.Sự tập trung vào tính bất biến là vì _computation economics_ xảy ra trong một SPA điển hình, cho vay đối với trạng thái tái tạo đối tượng nông/câm. Hãy tưởng tượng nó không phải là tên mà bạn đã sửa đổi, mà là một tên trong một ô của 1000 hàng trong một bảng được hiển thị. Hiển thị lại bảng khi _something_ thay đổi nhanh hơn so với duyệt qua toàn bộ trạng thái để tìm ra _exactly what_ đã thay đổi. –

+5

Tôi không thấy cách này trả lời câu hỏi "Tại sao nhà nước nên không thay đổi". Có nó giải thích rất nhiều làm thế nào để làm điều đó và chỉ lặp lại đặc tả Redux: "nhà nước nên không thay đổi", nhưng không có mô tả/giải thích về động lực đằng sau nó. Nếu có bất kỳ lý do nào cho các trạng thái ứng dụng mô tả các chuyển đổi (các thay đổi), ta chỉ cần thực hiện ** Objectd.assign ({}, ...) ** trước và sau bất kỳ lệnh gọi hàm thuần túy nào. – Slav

7

sau đây benefits of immutability được đề cập trong tài liệu hướng dẫn Redux:

  • Cả Redux và Phản ứng-Redux dụng shallow equality checking. Cụ thể:
  • Quản lý dữ liệu không thay đổi cuối cùng giúp xử lý dữ liệu an toàn hơn.
  • Gỡ lỗi thời gian di chuyển yêu cầu các bộ giảm tốc là các hàm thuần túy không có tác dụng phụ, do đó bạn có thể nhảy đúng cách giữa các trạng thái khác nhau.
+0

Nói cách khác, bỏ qua đề xuất và tắt 'trạng thái' sẽ gây rối với logic" nên cập nhật thành phần "? Có thể nói theo cách này sẽ sai, tức là, sự kết xuất sẽ xảy ra luôn luôn/không bao giờ/nó phụ thuộc? – bluenote10

+1

Câu trả lời cho câu hỏi của bạn không phải là tầm thường. Nó phụ thuộc vào trạng thái của bạn được cấu trúc như thế nào, bạn đang thay đổi thuộc tính sâu nào và nếu bạn đang sử dụng 'combinedReducers' và/hoặc' react-redux'. Bạn chắc chắn có thể biết những gì sẽ xảy ra với một sự hiểu biết sâu sắc hơn về 'combinedReducers' và' react-redux'. Nói chung, khi không tìm thấy thay đổi sâu do kiểm tra cạn, một số thành phần trong giao diện người dùng của bạn sẽ không cập nhật. Nhưng dòng dưới cùng là _don't mutate state_. Đó là một Bad Thing ™. –

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