Tôi đang tạo bản sao Word Dojo trong React/Flux. Các trò chơi chủ yếu là Boggle - bạn thực hiện lời bằng cách nhấp vào chữ cái liền kề trong một mạng lưới:Nested-loop React components với Flux, change-listeners trên cha mẹ hoặc con cái?
My Phản ứng linh kiện với nguồn của họ:
Tất cả mã nguồn can be viewed here.
Làm thế nào nó hoạt động ngay bây giờ:
Có một GameStore chứa một mảng hai chiều của các đối tượng javascript. các đối tượng có giá trị chuỗi 'thư' và giá trị boolean 'hoạt động'. Khi người dùng nhấp vào một chữ cái, điều đó gửi đến GameStore, cập nhật mảng hai chiều và phát ra một sự kiện Thay đổi.
Thành phần GameBoard lắng nghe sự kiện thay đổi đó và sau đó hiển thị lại 10 TileColumn, lần lượt hiển thị 10 ô xếp kề. GameBoard có dữ liệu của cửa hàng như là một phần của trạng thái của nó và các ô có ký tự/trạng thái hoạt động của riêng chúng làm đạo cụ.
Vấn đề là việc thay đổi 1 chữ cái sẽ làm cho tất cả 100 ô được hiển thị lại.
shouldComponentUpdate
tôi đã cố gắng sử dụng shouldComponentUpdate trên Tile để xác định rằng nó chỉ nên cập nhật nếu giá trị 'hoạt động' của nó đã thay đổi, nhưng vấn đề là cả hai this.props.active và nextProps .active luôn có cùng giá trị: cả hai đều sai hoặc cả hai đều đúng.
trì hoãn trách nhiệm cho trẻ em
Ý tưởng khác tôi đã có được để có mỗi Ngói chịu trách nhiệm cập nhật riêng của mình, bằng cách đăng ký người nghe thay đổi trên gạch trực tiếp. Tôi nhận được một cảnh báo rằng tôi đã vượt quá số lượng người nghe, và có vẻ như 100 người nghe thay đổi tất cả bắn trên mỗi bản cập nhật thư sẽ kém hiệu quả hơn. Mặc dù đó là tất cả chỉ là Javascript, vì vậy chúng tôi muốn được tránh một số thao tác DOM ...
Performance
tôi bắn lên Profiler và ngay bây giờ, với phụ huynh làm tất cả các quản lý nhà nước , nó lấy 40ms để tái render toàn bộ hội đồng quản trị trên thư bấm. Đó không phải là xấu, nhưng khi trò chơi trở nên phức tạp hơn, tôi lo lắng nó sẽ trở thành một sự chậm trễ đáng chú ý.
Trợ giúp cần thiết
Cụ thể là tôi đang tìm lời khuyên về thực hành tốt nhất trong tình huống này (khi bạn đã lồng nhau, các thành phần lặp), và nếu shouldComponentUpdate là giải pháp nhưng tôi chỉ sử dụng sai.
Cảm ơn!
Bạn cũng nên đặt dấu kiểm vào trong cột shouldComponentUpdate của TileColumn. Và ImmutableJS làm cho mọi thứ dễ dàng hơn cho PureRenderMixin để làm việc cùng.Chuyển sang ImmutableData, sử dụng mixin trong tất cả các thành phần của bạn, và bạn đã hoàn thành. – fisherwebdev
Xin cảm ơn! Điều này cực kỳ hữu ích. Tôi khá chắc chắn lý do shouldComponentUpdate không hoạt động được vì các biến javascript-just-point-to-objects; bằng cách sử dụng Immutable.js nên khắc phục điều này và đó là một cái gì đó tôi đã có nghĩa là để làm anyway. –