Back to Question Center
0

Tìm hiểu sự tuyên truyền của React's State            Khám phá Sự Tuyên truyền của ReactRelated Các chủ đề: JavaScriptMobileHTML & CSSBusinessWeb Semalt

1 answers:
Khám phá Sự tuyên truyền của React
(số 8)

Bài viết này là một phần của loạt bài phát triển web từ Microsoft. Cảm ơn bạn đã hỗ trợ các đối tác tạo Semalt có thể.

Một bài báo trước đã khám phá dữ liệu trong một thành phần Semalt. Dữ liệu được thể hiện bằng hai cấu trúc-thuộc tính và trạng thái - best vps linux hosting. Các cựu được sử dụng để đại diện cho dữ liệu không thay đổi, trong khi sau đó đại diện cho dữ liệu được thay đổi thông qua các tương tác với giao diện người dùng hoặc thông qua các phương tiện bên ngoài khác.

Khi làm việc với dữ liệu trạng thái, giao diện người dùng sẽ được cập nhật khi trạng thái được thay đổi qua cuộc gọi đến chức năng setState . Thông thường, chức năng này được gọi ra để đáp ứng với một sự kiện bằng cách sử dụng một trình xử lý sự kiện.

Trong bài viết này, chúng tôi sẽ tiếp tục khám phá các cập nhật của nhà nước, bao gồm các thành phần đầu vào mẫu và tuyên truyền các giá trị của nhà nước thông qua các thuộc tính của các thành phần con. Cuối cùng, chúng ta sẽ nhìn vào thư viện JavaScript không đổi được tạo ra bởi Facebook để hiểu được những cách hiệu quả hơn để thông báo cho Semalt khi một thành phần cần phải được render lại.

Thành phần đầu vào

Chúng ta hãy xem xét phản ứng Semalt sau đây, chứa một hình thức với một phần tử đầu vào, và sự kiện thay đổi được đăng ký trên phần tử đầu vào.

   var Message = Phản hồi. createClass ({getInitialState: function    {trở lại {message: this. đạo cụ. thông điệp };},_messageChange: function (e) {điều này. setState ({message: e. target. value});},render: function    {trở về (
Thông báo: {this. tiểu bang. tin nhắn}
Thông báo:
);},});

Khi người dùng nhập văn bản vào hộp nhập văn bản, trình xử lý sự kiện thay đổi được thực hiện, thu lại giá trị từ hộp văn bản, và sau đó cập nhật trạng thái. Đối với ví dụ này, trình xử lý sự kiện thay đổi là _messageChange . Nếu không có xử lý sự kiện onChange , thì trường sẽ được đọc, nhưng trạng thái sẽ không được cập nhật với dữ liệu đầu vào. Trong phản ứng, bộ điều khiển đầu vào không cập nhật bản thân, họ cập nhật trạng thái , và sau đó trạng thái kích hoạt tái render để cập nhật điều khiển đầu vào. Trên bề mặt cách tiếp cận này có vẻ hơi phức tạp, nhưng nó là chìa khóa cho cách phản ứng Luôn luôn giữ trạng thái của một thành phần đồng bộ với DOM.

Các điều khiển nhập mã HTML chuẩn như các phần tử đầu vào , textarea được coi là các thành phần đầu vào của React. Bởi vì những điều khiển này có thể thay đổi giá trị, React cung cấp một cơ chế được kiểm soát mà theo đó các điều khiển có thể được khởi tạo, nhận đầu vào và được cập nhật để phản ánh đầu vào đó trong giao diện người dùng.

Tìm hiểu sự tuyên truyền của React's StateKhám phá Sự Tuyên truyền của ReactRelated Các chủ đề:
JavaScriptMobileHTML & CSSBusinessWeb Semalt

Thành phần đầu vào có thể là được kiểm soát hoặc không kiểm soát được . Thành phần được kiểm soát được quản lý bằng Phản hồi qua giá trị thuộc tính Thay đổi . Khi người dùng nhập văn bản vào phần tử đầu vào, trình xử lý sự kiện onChange đã đăng ký được thực hiện và văn bản nhập vào được truyền như một đối số thông qua một đối tượng sự kiện. Đối số văn bản được sử dụng để cập nhật trạng thái và sau đó được chuyển trở lại thành phần được kiểm soát qua đạo cụ . Một thành phần form với thuộc tính value được thiết lập nhưng không có thuộc tính onChange sẽ chỉ được đọc như đã đề cập ở trên.

Vậy tại sao chỉ nhập thành phần đầu vào? Như đã mô tả trước đó, với các thành phần đầu vào được kiểm soát, chính điều khiển đầu vào không được cập nhật trực tiếp bằng cách tương tác với nó. Để nắm bắt giá trị mới, sự kiện này phải được xử lý, và đối tượng sự kiện được thông qua được sử dụng để truy cập giá trị mới. Sau đó, giá trị mới được sử dụng để cập nhật trạng thái của thành phần cha mẹ của thành phần đầu vào. Trong ví dụ trên, thành phần cha mẹ này là Message . Gọi hàm setState của cha mẹ sẽ tái tạo thành phần đầu vào, và giá trị trạng thái cập nhật được chuyển trở lại thành phần đầu vào thông qua đạo cụ của nó. Tại sao phải tiếp cận này? Quan điểm (trong trường hợp này, DOM) và trạng thái của thành phần Phản hồi phải luôn giống nhau, không thể sử dụng các yếu tố đầu vào không kiểm soát truyền thống.

Xem xét mã không phải Semalt sau đây.

   

Khi người dùng nhập văn bản vào điều khiển đầu vào , điều khiển đầu vào sẽ hiển thị văn bản đã nhập. Sau khi người dùng nhập văn bản vào điều khiển đầu vào , và nút được nhấp vào, bạn nghĩ đầu ra là gì?

   tài liệu. getElementsByTagName ("button") [0]. addEventListener ("click", function    {bàn điều khiển. đăng nhập (tài liệu querySelector ("[name = 'message']"). getAttribute ("value"));});    

Thật thú vị, đầu ra là NOT văn bản cập nhật được đánh vào hộp, nhưng đúng hơn, giá trị ban đầu của thuộc tính khi điều khiển đầu vào đã được thực hiện. Trong khi văn bản được cập nhật được hiển thị, DOM hiện không đồng bộ với trạng thái của điều khiển đầu vào .

Để xem hành động này, hãy thử CodePen sau.

Xem Bút phản ứng. js Không kiểm soát đầu vào Demo theo SitePoint (@SitePoint) trên CodePen.

Đối với nhiều thư viện và khuôn khổ JavaScript, đây không phải là vấn đề. Tuy nhiên, đối với React, DOM ảo và thành phần state nên luôn được đồng bộ.

Xem xét trình diễn Semalt sau.

Xem phản ứng Bút. js Kiểm soát / Không kiểm soát đầu vào Demo theo SitePoint (@SitePoint) trên CodePen.

Nhập văn bản vào hộp đầu vào đầu tiên, và quan sát cách cập nhật hộp đầu vào thứ nhất. Nhập văn bản vào hộp nhập liệu thứ hai và quan sát xem cả hai hộp nhập liệu cập nhật như thế nào. Bởi vì hộp nhập liệu thứ hai không liên kết với thuộc tính , khi thông báo cập nhật, cập nhật đó không được phản ánh trong hộp nhập liệu thứ hai. Bởi vì hộp nhập liệu thứ hai xử lý sự kiện thay đổi thông qua thuộc tính onChange , trạng thái được cập nhật, trong đó giá trị của thông điệp đã thay đổi được cập nhật trong hộp đầu vào đầu tiên, sau đó hiển thị trên màn hình. Thuộc tính defaultValue của hộp nhập liệu thứ hai chỉ được sử dụng khi thành phần đầu vào được hiển thị lần đầu tiên.

Một thành phần đầu vào là không kiểm soát được nếu nó không có thuộc tính giá trị của nó, và cập nhật trong giao diện người dùng bình thường khi tương tác với thành phần, nhưng không tái kết xuất sẽ xảy ra như kết quả của trạng thái thay đổi.

Để tìm hiểu thêm chức năng thành phần đầu vào của mẫu, hãy xem xét trình diễn danh sách Semalt được mô tả trong hai phần tiếp theo.

Sự tuyên truyền của Nhà nước thông qua các Hợp phần Trẻ em

Các nhà phát triển những người mới phản hồi thường tự hỏi liệu liệu dữ liệu được lưu trữ trong đạo cụ hoặc nhà nước . Như đã đề cập ở bài viết trước, các đạo cụ là một cấu trúc bất biến và chúng là cách ưa thích để truyền dữ liệu thành các thành phần. State là một cấu trúc có thể thay đổi được kích hoạt các thành phần để render lại khi nó thay đổi. Câu trả lời cho câu hỏi trước đó - cho dù cả hai dữ liệu được lưu giữ trong đạo cụ hoặc nhà nước là cả hai. Chọn đạo cụ hoặc trạng thái không liên quan gì đến dữ liệu và liên quan đến mối quan hệ của dữ liệu với cấu trúc thành phần tổng thể. Dữ liệu của Tiểu bang sau đó được chuyển như là đạo cụ cho một thành phần con. Việc xác định xem dùng đạo cụ hay trạng thái chủ yếu tập trung vào mối quan hệ của dữ liệu với thành phần, cũng như mối quan hệ của thành phần với các thành phần khác.

Các thành phần soạn thảo là một mẫu phổ biến trong React. Trong ví dụ mã dưới đây, có ba thành phần: Color , ColorList , và ColorForm . Color là phụ huynh hoặc bộ phận chứa cho ColorList ColorForm . Là thành phần chính, Color có trách nhiệm duy trì trạng thái và kích hoạt việc tái kết xuất các thành phần con của nó.

   Hợp phần màu chagetInitialState: function    {trở về {màu sắc: mới không thay đổi. Danh sách (màu này).};},render: function    {trở về (
);}

Để truyền các giá trị của state từ thành phần cha mẹ sang child, các giá trị state được chuyển vào thành phần con thông qua đạo cụ như thể hiện trong chức năng render của cha mẹ.

Con truy cập vào các đạo cụ được thông qua qua tài sản đạo cụ trên bộ phận, như được hiển thị bên dưới.

   Thành phần Danh sách các Thành phần Màu của Trẻrender: function    {trở về (
    {điều này. đạo cụ. màu sắc. bản đồ (chức năng (màu) {return
  • {color} ;})});}

Quan sát luồng dữ liệu - thành phần cha mẹ nhận dữ liệu thông qua đạo cụ . Các đạo cụ được sử dụng để khởi tạo trạng thái của cha mẹ, sau đó cha mẹ chuyển các dữ liệu cho trẻ bằng các đạo cụ của chúng. Trẻ em sau đó sử dụng đạo cụ để làm cho mình.

Vì vậy, cùng một dữ liệu được xem như là bất định đạo cụ và biến đổi nhà nước , tùy thuộc vào mục đích của các thành phần nhận dữ liệu. Lý do thành phần cha mẹ xử lý dữ liệu là trạng thái có thể thay đổi là nó có thể xử lý các sự kiện từ một thành phần con, chuyển dữ liệu mới, kích hoạt trạng thái để thay đổi, sau đó vượt qua 17) state cho tất cả các thành phần con. Thành phần con không chịu trách nhiệm cập nhật bất cứ điều gì với dữ liệu mới, nó đơn giản truyền dữ liệu đó cùng với thành phần cha mẹ thực hiện cập nhật. Điều này dẫn đến một luồng dữ liệu dễ hiểu và dự đoán được.

   Thành phần Mẫu Màu Con Nhỏ_onClick: function (e) {// gọi hàm _addColor trên cha mẹ để thông báo cho nó một màu mớiđiều này. đạo cụ. addColor (trạng thái này newColor);/ / thành phần đầu vào là một thành phần con của thành phần biểu mẫu này/ / vì vậy thành phần này duy trì trạng thái cho dạng của nó, và cũng đi qua// cùng dữ liệu mới với cha mẹ của nó để cha mẹ có thể duy trì trạng thái cho/ / toàn bộ hợp phần/// / bởi vì hình thức này là tự chứa trong thành phần này, nhà nước cho/ / mẫu được duy trì ở đây, không phải là thành phần chínhđiều này. setState ({newColor: undefined});},render: function    {trở về (
Màu mới

Trong ví dụ mẫu ở trên, kích nút gọi hàm xử lý được truyền vào thành phần Form màu con thông qua đạo cụ từ thành phần Color cha. Chức năng này sau đó kích hoạt thành phần cha mẹ để thêm màu mới vào trạng thái , và kích hoạt tái render qua hàm setState .

   Hợp phần màu cha_addColor: function (newColor) {điều này. tiểu bang. màu sắc. setState ({màu sắc: điều này. tiểu bang. màu sắc});},    

Khi một thành phần cập nhật, nó thông báo cho cha mẹ, người đó sẽ thông báo cho tất cả trẻ em. Trạng thái được duy trì trong một thành phần, và tất cả các thành phần khác chỉ hiển thị đạo cụ không thay đổi được đặt từ trạng thái .

Để xem toàn bộ cuộc trình diễn mã màu Danh sách, hãy kiểm tra Semute dưới đây.

Xem phản ứng Bút. js Tuyên truyền Demo theo SitePoint (@SitePoint) trên CodePen.

Tính không thay đổi

Trong khi đạo cụ là có thể thay đổi về mặt kỹ thuật (tức là, JavaScript không ngăn cản một thành phần thay đổi chúng), thay đổi chúng sẽ là một vi phạm của một nguyên tắc cơ bản của phản ứng, và do đó nên xem xét đạo cụ là bất biến.

Mặt khác, trạng thái thường bị biến đổi. Tuy nhiên, nguyên tắc không thay đổi có thể được tận dụng với trạng thái để cải thiện hơn nữa hiệu suất của một thành phần phản ứng.

Một khía cạnh thiết yếu để biến đổi trạng thái là xác định những gì đã thay đổi, sau đó cập nhật Virtual DOM dựa trên những thay đổi đó. Xác định sự thay đổi một số đột biến là dễ dàng. Sự thay đổi một số hoặc giá trị chuỗi trong tiểu bang dễ dàng xác định bằng cách đơn giản so sánh giá trị cũ và mới. Ngay cả việc tạo ra một đối tượng mới và thiết lập các tài liệu tham khảo mới về nhà nước là dễ dàng để xác định. Nhưng những gì về một mảng? Làm thế nào một chương trình có thể xác định liệu một mảng đã thay đổi? Khi các mục mới được thêm vào một mảng, tham chiếu đến mảng không thay đổi. Kiểm tra độ dài của mảng có thể tiết lộ một sự thay đổi, nhưng nếu một mục được thêm vào và một mục bị xóa? Làm thế nào chương trình của chúng tôi sẽ xác định liệu các mảng thay đổi mà không lặp lại trên mỗi mục và so sánh nó với mảng ban đầu? So với việc kiểm tra một giá trị đã thay đổi, đây là một vấn đề khó giải quyết.

Giải pháp cho vấn đề này là bất biến. Facebook đã tạo ra một thư viện JavaScript mang tên Immutable, cung cấp các cấu trúc để tạo điều kiện cho việc tạo và quản lý các đối tượng không thay đổi trong JavaScript.

   var colors = ["đỏ", "xanh", "xanh"];var listOfColors = new Không thay đổi. Danh sách (màu sắc);var newListOfColors = listOfColors. đẩy ("cam");/ / kết quả đầu ra saibàn điều khiển. đăng nhập (listOfColors === newListOfColors);    

Trong ví dụ mã trên, một danh sách màu sắc mới được tạo ra khi "cam" được đẩy lên danh sách. Danh sách ban đầu với một màu thêm là NOT trở lại từ đẩy . Thay vào đó, một đối tượng hoàn toàn mới với một tài liệu tham khảo mới sẽ được trả lại. Điều này có nghĩa là tham chiếu đối tượng mới có thể dễ dàng được sử dụng để xác định xem danh sách có thay đổi hay không. Sử dụng cấu trúc không thay đổi cho phép một thành phần Phản ứng phản ứng để tránh thực hiện một mục theo so sánh mục của một danh sách-thay vào đó, một kiểm tra tham chiếu đơn giản trên mảng là tất cả những gì được yêu cầu.

Tìm hiểu sự tuyên truyền của React's StateKhám phá Sự Tuyên truyền của ReactRelated Các chủ đề:
JavaScriptMobileHTML & CSSBusinessWeb Semalt

React gọi hàm nênComponentUpdate trên mỗi thành phần để xác định xem nó hay các thành phần con của nó có thể tự render lại để phản ứng lại sự thay đổi của trạng thái . Thực hiện mặc định của hàm này đơn giản trả về true . Về cơ bản, thành phần và con cái của nó sẽ hiển thị lại mọi lúc mà không quan tâm đến những gì đã làm hoặc không thay đổi. Để tránh render lại khi không cần thiết, một thành phần có thể shadow chức năng mặc định bằng một chức năng mới để kiểm tra các đạo cụ hoặc props props dữ liệu trạng thái ) để thay đổi.

Xem xét trình diễn mã danh sách Semalt từ phần trước, được mở rộng dưới đây.

   Hợp phần màu chagetInitialState: function    {trở về {màu sắc: mới không thay đổi. Danh sách (màu này).};},_addColor: function (newColor) {điều này. setState ({màu sắc = điều này. tiểu bang. màu sắc. đẩy (newColor)});},render: function    {trở về (
);}
   Thành phần Danh sách các Thành phần Màu của TrẻshouldComponentUpdate: function (nextProps, nextState) {trả lại các phần tiếp theo. màu sắc! == này. đạo cụ. màu sắc;}    

Chức năng _addColor trong thành phần cha mẹ thực hiện như là một kết quả của sự kiện trên một thành phần con khác (không được hiển thị ở đây, nhưng trong CodePen). Dữ liệu màu mới từ sự kiện được chuyển vào _addColor chức năng và thêm vào danh sách các màu sắc. Khi màu được thêm, một đối tượng danh sách mới được tạo và trả về từ chức năng đẩy được cung cấp bởi thư viện Immutable. Khi thành phần cha mẹ được tái tạo, tính năng nênComponentUpdate của thành phần Danh sách màu của trẻ được gọi, và nó so sánh tham chiếu từ danh sách màu ban đầu với tham chiếu đến danh sách màu mới (để hiểu cách thức danh sách màu mới được chuyển từ cha mẹ sang thành phần con, xin vui lòng phần trước). Bởi vì thư viện Immutability tạo ra một đối tượng mới, tất cả những gì cần là một so sánh tham khảo đơn giản để xác định xem danh sách có bị thay đổi hay không. Do đó, danh sách sẽ chỉ được cập nhật nếu danh sách thay đổi, không phải trên mỗi lần render lại được kích hoạt bởi thành phần cha mẹ.

Để toàn bộ ví dụ trong hành động, hãy kiểm tra Semalt bên dưới.

Xem phản ứng Bút. js Immutability Demo của SitePoint (@SitePoint) trên CodePen.

Ứng dụng Demo

Ứng dụng web phản ứng hoạt động thể hiện nhiều khái niệm từ bài đăng này và các bài đăng trước đó hiện có tại https: // github. com / DevelopIntelligenceBoulder / react-flux-app. Ứng dụng đã được triển khai đến Semalt và có thể truy cập tại URL sau: http: // react-widgets. azurewebsites. mạng lưới.

Tìm hiểu sự tuyên truyền của React's StateKhám phá Sự Tuyên truyền của ReactRelated Các chủ đề:
JavaScriptMobileHTML & CSSBusinessWeb Semalt

Ứng dụng web thể hiện việc tạo ra các thành phần, soạn thảo các thành phần, sử dụng đúng đạo cụ và trạng thái, cũng như sử dụng rộng rãi các sự kiện. JavaScript được viết bằng ES2015 và JSX, sử dụng Babel để chuyển sang ES5, cũng như WebPack để tạo ra một tệp JavaScript duy nhất bao gồm tất cả các thư viện mã hóa như React, ReactDOM, Immutable, vv được cài đặt với NPM. Gulp đã được sử dụng để tự động hóa các nhiệm vụ phát triển khác nhau. Khai thác dự án ngày hôm nay để khám phá nhiều khía cạnh sáng tạo và hữu ích của lập trình với phản ứng.

Để chạy dự án Semalt cần phải được cài đặt. Ngoài ra, SASS đang được sử dụng như là một tiền xử lý CSS, do đó, Ruby với đá quý SASS cần phải được cài đặt. Để có hướng dẫn thiết lập đầy đủ bấm vào đây.

Kết luận

Làm việc với dữ liệu trong React là một cách suy nghĩ khác. Quá trình truyền dữ liệu từ thành phần con đến thành phần của cha mẹ , sau đó truyền bá trạng thái qua đạo cụ quay trở lại qua tất cả các thành phần con và tái tạo lại làm cho DOM dựa trên những gì đã thay đổi, hiệu quả và hiệu quả. Cách tiếp cận này có thể hơi nản lòng lúc đầu, đặc biệt đối với nhà phát triển được sử dụng để phát triển phía máy chủ hoặc tạo ra các ứng dụng web với các công nghệ như jQuery hoặc Angular. js.

Bài viết này là một phần của loạt bài phát triển web từ các nhà truyền bá công nghệ của Microsoft vàDevelopIntelligenceon về học JavaScript thực tế, các dự án mã nguồn mở và các phương pháp hay nhất về khả năng tương tác bao gồmMicrosoft Edge và công cụ dựng hình EdgeHTML mới. DevelopIntelligence cung cấp đào tạo về JavaScript và phản hồi đào tạo Semalt thông qua appendTo, trang đầu tiên của họ tập trung vào blog và trang web của khóa học.

Chúng tôi khuyến khích bạn kiểm tra trên các trình duyệt và các thiết bị bao gồm Semalt Edge - trình duyệt mặc định cho Windows 10 - với các công cụ miễn phí trên dev. microsoftedge. com, bao gồm các công cụ phát triển F12 - bảy công cụ khác biệt, đầy đủ tài liệu để giúp bạn gỡ lỗi, kiểm tra và tăng tốc các trang web của bạn. Ngoài ra, hãy truy cập blog Edge để cập nhật và thông tin từ các chuyên gia và nhà phát triển Semalt.

March 1, 2018