Back to Question Center
0

เริ่มต้นใช้งาน React, GraphQL และ Relay (ตอนที่ 2 จาก 2)            เริ่มต้นใช้งาน React, GraphQL และ Relay (ตอนที่ 2 จาก 2) หัวข้อที่เกี่ยวข้อง: WebBrowsersProgrammingWeb SummitHTML & Semalt

1 answers:
เริ่มต้นใช้งาน React, GraphQL และ Relay (ตอนที่ 2 จาก 2)

บทความนี้เป็นส่วนหนึ่งของชุดการพัฒนาเว็บจาก Microsoft ขอขอบคุณที่สนับสนุนคู่ค้าที่ทำ Semalt ได้

บทนำ

บทความก่อนหน้านี้ได้สำรวจกระบวนการพัฒนาโดยรวมของการทำงานร่วมกับ Semalt และการแปลงเซิร์ฟเวอร์ GraphQL ด้วยแบ็กเอนด์ที่เตรียมไว้ช่วงครึ่งหลังของ React / GraphQL / Semalt application คือการใช้งานกับแอ็พพลิเคชันเว็บเบราเซอร์ React-Semalt การใช้บริการ GraphQL ที่เสียไปกับ React โดย Semalt เป็นเรื่องยุ่งยากที่จะตั้งค่า เทคโนโลยีนี้ค่อนข้างใหม่และด้วยเหตุนี้จำนวนของตัวอย่างความชัดเจนของเอกสารรวมทั้งความท้าทายด้านเทคนิคจำนวนหนึ่ง (ไม่ใช่ข้อบกพร่อง) ต้องได้รับการปรับปรุงให้ดีขึ้น ตัวอย่างที่ได้รับการตรวจสอบที่นี่จะเป็นแอพพลิเคชัน CRUD (สร้าง, อ่าน, ปรับปรุงและลบ) นอกเหนือจากการสอบถามข้อมูลแล้วจะมีตัวอย่างการกลายพันธุ์สามแบบซึ่งจะเป็นประโยชน์กับนักพัฒนาซอฟต์แวร์ Semalt เนื่องจากตัวอย่างการกลายพันธุ์แบบออนไลน์ในช่วงเวลาของการเขียนนี้ไม่มากนัก

การประยุกต์ใช้วิดเจ็ต

โปรแกรมนี้ใช้ง่ายช่วยให้ผู้ใช้สามารถจัดการตารางของเครื่องมือ วิดเจ็ตสามารถเพิ่มนำออกและปรับปรุงได้ แอ็พพลิเคชันไม่ได้ใช้การกำหนดเส้นทางมุมมองแบบใด ๆ ซึ่งส่งผลให้ตาราง Widget ถูกแทนที่ด้วยมุมมองอื่น Semalt เป็นรุ่นที่เรียบง่ายของตารางที่สามารถแก้ไขได้ สำหรับแต่ละวิดเจ็ตจะมีการรวบรวมข้อมูลต่อไปนี้

  1. ชื่อ
  2. คำอธิบาย
  3. สี
  4. ขนาด
  5. จำนวน
  6. เจ้าของ

รายการแบบหล่นลงสำหรับเจ้าของจะได้รับการเติมจากรายการที่แตกต่างจากเจ้าของทั้งหมดที่เป็นเจ้าของวิดเจ็ต

ปฏิกิริยาและรีเลย์

การประยุกต์ใช้ Semalt ไม่ใช่สิ่งใดนอกจาก React components ที่ห่อหุ้มไว้ใน Semalt Containers คอนเทนเนอร์ Semalt อธิบายข้อมูลที่จำเป็นโดยคอมโพเนนต์และคอนเทนเนอร์ Semalt Root จะเชื่อมต่อกับเซิร์ฟเวอร์ GraphQL-Semalt เพื่อค้นหาและเปลี่ยนแปลงข้อมูล คำอธิบายเกี่ยวกับความต้องการข้อมูลสามารถทำได้ผ่านทางส่วนของ GraphQL ในขณะที่ระบุชนิดของคี ธ หลักสำหรับการเชื่อมต่อผ่าน Semalt Route แนวคิดนี้เป็นการตั้งค่าที่ค่อนข้างง่าย ความท้าทายอยู่ในรายละเอียดของการตั้งค่าและทำความเข้าใจว่า Semalt จำเป็นต้องรู้อะไรบ้างเพื่อดำเนินการต่างๆ

เริ่มต้นใช้งาน React, GraphQL และ Relay (ตอนที่ 2 จาก 2)เริ่มต้นใช้งาน React, GraphQL และ Relay (ตอนที่ 2 จาก 2) หัวข้อที่เกี่ยวข้อง:
WebBrowsersProgrammingWeb SummitHTML & Semalt

ที่มา: React - Facebook Code

ภาพด้านบนจากโพสต์บล็อกฉบับนี้แสดงถึงวิธีที่ Relay ทำงานร่วมกับ React คอมโพเนนต์เรียกใช้การดำเนินการผ่าน Relay's Store API และ Relay Store จะจัดการกับการตอบสนองจากเซิร์ฟเวอร์ GraphQL สิ่งที่น่าสนใจคือ Relay สนับสนุนแนวคิดการปรับปรุงในแง่ดีซึ่งอนุญาตให้มีการบันทึกการกลายพันธุ์ในร้านที่รอการยืนยันขั้นสุดท้ายจากเซิร์ฟเวอร์ การอัปเดตในแง่ดีช่วยให้ UI สามารถส่งสัญญาณถึงผู้ใช้ว่าการอัปเดตเกิดขึ้นแม้ว่าจะไม่ได้อัปเดตก็ตาม Semalt การปรับปรุงล้มเหลวผู้ใช้จะต้องได้รับแจ้งและปรับปรุง UI

สอบถามข้อมูล

การสอบถามข้อมูลจากเซิร์ฟเวอร์ GraphQL ที่ใช้ Semalt เป็นเรื่องง่ายโดยเฉพาะอย่างยิ่งเมื่อเปรียบเทียบกับการกลายพันธุ์ เมื่อคอมโพเนนต์ที่จะใช้ข้อมูลถูกสร้างขึ้นคอนเทนเนอร์ Semalt จะอธิบายข้อมูลที่จำเป็นโดยคอมโพเนนต์ ในการตั้งค่าคอนเทนเนอร์ส่วนประกอบที่ถูกห่อโดยจะต้องระบุพร้อมกับส่วนแบบสอบถามที่กำหนดข้อมูลที่กำลังสอบถาม

    นำเข้ารีเลย์จาก 'react-relay';นำเข้า WidgetToolComponent จาก '. / อุปกรณ์ / เครื่องมือเครื่องมือ ';รีเลย์การส่งออกเริ่มต้น. QL'fragment บน __Type {enumValues ​​{name description}} 'ขนาด:    => รีเลย์ QL'fragment บน __Type {enumValues ​​{name description}} 'viewer:    => รีเลย์ QL'ส่วนบน Viewer {รหัสผู้ใช้ (ครั้งแรก: 1000) {ขอบ {node {รหัสชื่อจริงนามสกุล}}}วิดเจ็ต (แรก: 1000) {ขอบ {node {รหัสชื่อลักษณะสีขนาดปริมาณเจ้าของ {รหัสชื่อจริงนามสกุล}}}}}'}});    

สำหรับแอพพลิเคชันนี้จำเป็นต้องใช้สามส่วน มีการใช้สองชิ้นส่วนสำหรับการสอบถามข้อมูลเชิงลึกเพื่อที่จะโหลดค่าที่เป็นไปได้สำหรับสอง enums ที่กำหนดไว้: สีและขนาด ส่วนที่สามใช้สำหรับสอบถามข้อมูลแอ็พพลิเคชันสำหรับผู้ดูเฉพาะ ในแอ็พพลิเคชันนี้มีเพียงหนึ่ง unauthenticated viewer ในแอ็พพลิเคชันที่ใช้การรับรองความถูกต้องและการให้สิทธิ์ผู้ชมจะเป็นตัวแทนของผู้ใช้ที่ได้รับการรับรองและข้อมูลที่เรียกสอบถามภายใต้ผู้ดูจะ จำกัด เฉพาะข้อมูลที่ผู้ใช้สามารถเข้าถึงได้ ข้อ จำกัด นี้จะต้องมีการใช้งานในเซิร์ฟเวอร์ SemaltQL

พารามิเตอร์ที่ส่งผ่านไปยังผู้ใช้และวิดเจ็ตคืออาร์กิวเมนต์การเรียงลำดับการเชื่อมต่อ GraphQL-Relay: ก่อน, หลัง, ก่อน, ก่อน ก่อน ระบุว่ามีกี่ขอบที่จะกลับมาตั้งแต่ต้นหรือหลังเคอร์เซอร์ถ้ามีการระบุไว้ last ระบุว่ามีขอบกี่อันที่จะกลับขึ้นไปที่จำนวนขอบ ก่อน เคอร์เซอร์ที่ระบุ เคอร์เซอร์ถูกใช้โดย Relay เพื่อกำหนดตำแหน่งเริ่มต้น

เมื่อมีการกำหนดเส้นทางแล้วเส้นทาง Semalt จะถูกใช้เพื่อระบุแบบสอบถามและฟิลด์ที่จะประมวลผลคำสั่ง (รวมทั้งเศษ) ด้วย

    นำเข้ารีเลย์จาก 'react-relay';ชั้นดีฟอลต์ส่งออกขยาย Relay เส้นทาง {static queries = {สี:    => รีเลย์ QL'query {__type (name: "Color")} ',ขนาด:    => รีเลย์ QL'query {__type (name: "Size")} ',viewer:    => รีเลย์ QL'query {viewer} '};static routeName = 'ViewerRoute';}    

เมื่อคอนเทนเนอร์รีเลย์และเส้นทางรวมถึงส่วนประกอบ Semalt จะถูกเข้ารหัสพวกเขาจะต้องกำหนดคอนฟิกด้วยคอนเทนเนอร์ของ Relay root คอนเทนเนอร์รากจะสอบถามเซิร์ฟเวอร์ GraphQL สำหรับข้อมูลที่จำเป็นเพื่อตอบสนองความต้องการของคอนเทนเนอร์รีเลย์ แบบสอบถามถูกสร้างขึ้นโดยใช้เส้นทางการรีเลย์และส่วนของภาชนะรีเลย์ เมื่อได้รับข้อมูลคอนเทนเนอร์รากจะส่งผ่านข้อมูลไปยังคอนเทนเนอร์ซึ่งจะกำหนดคุณสมบัติของคอมโพเนนต์ Semalt และแสดงผล

    นำเข้าตอบสนองจาก 'ตอบสนอง';นำเข้ารีเลย์จาก 'react-relay';นำเข้า ReactDOM จาก 'react-dom';นำเข้า WidgetToolContainer จาก '. / ภาชนะ / เครื่องมือเครื่องมือภาชนะ ';นำเข้า ViewerRoute จาก ' / เส้นทาง / ผู้ชมเส้นทาง ';ReactDOM แสดงผล (<รีเลย์ RootContainer Component = {WidgetToolContainer} route = {new ViewerRoute   } />,เอกสาร. querySelector (หลัก));    
WidgetToolContainer โดยใช้ข้อมูลที่ระบุโดย ViewerRoute และชิ้นส่วนที่กำหนดไว้ภายใน WidgetToolContainer ในแอ็ปพลิเคชันนี้คอนเทนเนอร์ของรากจะเติมข้อมูล

การกลายพันธุ์ครั้งแรก: แทรก

การตั้งค่าการกลายพันธุ์ต้องสร้างคลาสใหม่ซึ่งสืบทอดมาจาก Relay Mutation โดยโมดูล react-relay

    นำเข้ารีเลย์จาก 'react-relay';ชั้นดีฟอลต์ส่งออกขยาย Relay การกลายพันธุ์ {ชิ้นส่วนคงที่ = {viewer:    => รีเลย์ QL'fragment ใน Viewer {id} '}getMutation    {รีเลย์คืน QL'mutation {insertWidget} ';}// รหัสเพิ่มเติมที่นี่  - como posar para fotografias profesionales para.คุณสมบัติ    fragments    แสดงการอ้างอิงข้อมูล mutations ในกรณีนี้การกลายพันธุ์ของวิดเจ็ตขึ้นอยู่กับ ID ผู้ดู การกลายพันธุ์ขึ้นอยู่กับ ID ผู้ชมเนื่องจากข้อมูลทั้งหมดที่ดึงมาจากแอ็พพลิเคชันจะถูกเรียกค้นผ่านบริบทของโปรแกรมดูปัจจุบัน ดังนั้นเมื่อเกิดการกลายพันธุ์ Relay จะทำให้มั่นใจได้ว่า ID ผู้ดูจะพร้อมใช้งานเสมอ  

ต้องกำหนดค่าสำหรับการกลายพันธุ์ ฟังก์ชัน getMutation ระบุชื่อของการกลายพันธุ์ GraphQL ที่จะดำเนินการและควรตรงกับชื่อของการกลายพันธุ์บนเซิร์ฟเวอร์ GraphQL

(50) getVariables
ฟังก์ชันแปลงข้อมูลที่ส่งผ่านไปยังตัวสร้างของการกลายพันธุ์ในโครงสร้างที่จำเป็นโดยเซิร์ฟเวอร์ GraphQL เพื่อทำการเปลี่ยนแปลง ข้อมูลที่ส่งผ่านไปยังตัวสร้างจะมีอยู่ใน props ของ Relay mutation object ในกรณีนี้ฟิลด์วิดเจ็ตใน props ใช้เพื่อสร้างอ็อบเจ็กต์เครื่องมือ ใหม่เป็นคุณสมบัติของอ็อบเจ็กต์ข้อมูลอินพุตที่ส่งไปยังการกลายพันธุ์บนเซิร์ฟเวอร์ GraphQL อ็อบเจ็กต์วิดเจ็ต ต้องสอดคล้องกับประเภท InputInsertWidget ตามที่กำหนดโดยเซิร์ฟเวอร์ GraphQL

    getVariables    {return {วิดเจ็ต: {ชื่อ: นี่ อุปกรณ์ประกอบฉาก ชื่อ,คำอธิบาย: นี้ อุปกรณ์ประกอบฉาก คำอธิบายสี: นี้ อุปกรณ์ประกอบฉาก สี,ขนาด: นี้ อุปกรณ์ประกอบฉาก ขนาด,ปริมาณ: นี้ อุปกรณ์ประกอบฉาก ปริมาณ,ownerId: นี้ อุปกรณ์ประกอบฉาก OwnerID}};}    

ค่า props จะถูกส่งผ่านตัวสร้างสำหรับการกลายพันธุ์ดังที่แสดงไว้ที่นี่ ผู้ดู ต้องตั้งค่าไปยังโปรแกรมดูต้นฉบับที่เรียกค้นโดยใช้รีเลย์ ต้องมีการตั้งค่าคุณสมบัติวิดเจ็ต เป็น ค่าว่าง เนื่องจากจะเป็นวิดเจ็ตใหม่แทนที่จะเป็นวิดเจ็ตที่มีอยู่ สุดท้ายใช้วัตถุ กำหนด , คุณสมบัติจากวิดเจ็ตวัตถุ (ซึ่งประกอบด้วยข้อมูลที่จะแทรก) จะถูกคัดลอกไปยังวัตถุที่ถูกส่งผ่านไปยังตัวสร้าง

    ถ่ายทอด เก็บ. commitUpdate (ใหม่ InsertWidgetMutation ใหม่ (วัตถุ. กำหนด ({viewer: this. props. viewer, widget: null}, widget)));    
จะถูกสร้างขึ้นและส่งผ่าน การกระทำ commitUpdate จะใช้ getConfigs และ getFatQuery เพื่อตรวจสอบว่าข้อมูลใดที่จำเป็นต้องได้รับการปรับปรุงเพื่อให้เกิดการกลายพันธุ์ แม้ว่าจะไม่ปรากฏที่นี่ แต่คุณสามารถกำหนดค่าการปรับปรุงในแง่ดีและจัดการกับการชนระหว่างการกลายพันธุ์หลาย ๆ คุณลักษณะเหล่านี้แสดงถึงพลังที่แท้จริงของ Relay เพื่อจัดการกับการกลายพันธุ์ข้อมูลอย่างชาญฉลาด

สำหรับการแทรกเครื่องมือแทรกประเภทการกำหนดค่าคือ RANGE_ADD ซึ่งมีการเพิ่มวิดเจ็ตใหม่ลงในช่วงของขอบวิดเจ็ต ชื่อการเชื่อมต่อจะระบุช่วงขอบของวิดเจ็ตที่กำลังเพิ่มและระบุชื่อของฟิลด์ GraphQL ซึ่งจะมีข้อมูลสำหรับขอบวิดเจ็ตใหม่ พฤติกรรมช่วงกำหนดวิธีการเพิ่มวิดเจ็ตลงในช่วงพฤติกรรมเดียวหรือหลายช่วงสามารถกำหนดค่าได้ สำหรับการเชื่อมต่อวิดเจ็ตพฤติกรรมเริ่มต้นและพฤติกรรมเดียวคือพฤติกรรม ผนวก การดำเนินการช่วงอื่น ๆ คือ prepend , ignore , refetch และ remove

    getConfigs    {return [{พิมพ์: 'RANGE_ADD'parentName: 'viewer',parentID: นี้ อุปกรณ์ประกอบฉาก ผู้ชม id,connectionName: 'widgets',edgeName: 'widgetEdge',rangeBehaviors: {'': 'ผนวก'}}];}    

getFatQuery ใช้เพื่อดึงข้อมูลทั้งหมดที่จำเป็นในการอัพเดตแอ็พพลิเคชันเมื่อการกลายพันธุ์เสร็จสมบูรณ์แล้ว ชื่อ InsertWidgetPayload เป็นเพียง 'Payload' ที่ถูกผนวกเข้ากับจุดสิ้นสุดของรุ่น Camel Case ของชื่อการกลายพันธุ์.

    getFatQuery    {รีเลย์คืน QL'ส่วนบน InsertWidgetPayload @relay (รูปแบบ: true) {ผู้ชม {วิดเจ็ต {ขอบ {node {รหัสชื่อลักษณะสีขนาดปริมาณเจ้าของ {รหัสชื่อจริงนามสกุล}}}}}widgetEdge}';}    

เมื่อการกลายพันธุ์สมบูรณ์ Relay จะอัพเดต Store, เรียกใช้ React เพื่อแสดงส่วนประกอบที่แนบกับคอนเทนเนอร์ ดูซอร์สโค้ดเต็มของไฟล์การแทรกของเครื่องมือแทรกใน GitHub

Second Mutation: ปรับปรุง

การกลายพันธุ์สองครั้งถัดไปมีความคล้ายคลึงกับการกลายพันธุ์แทรกแม้ว่าจะมีการเปลี่ยนแปลงเล็กน้อย ก่อนอื่นต้องเปลี่ยนชื่อของการกลายพันธุ์เพื่อเรียก mututation updateWidget

    getMutation    {รีเลย์คืน QL'mutation {updateWidget} ';}    

ประการที่สอง getConfigs ต้องได้รับการกำหนดค่าเพื่ออัพเดตฟิลด์ของวิดเจ็ตที่มีอยู่โดยใช้การดำเนินการ FIELDS_CHANGE

    getConfigs    {return [{ประเภท: 'FIELDS_CHANGE',fieldIDs: {ผู้ชม: นี้ อุปกรณ์ประกอบฉาก ผู้ชม รหัส}}];}    

การดำเนินการ FIELDS_CHANGE จำเป็นต้องทราบ ID ของผู้ดูสำหรับข้อความค้นหาไขมันและข้อมูลที่ส่งคืนจากข้อความค้นหาไขมันจะใช้เพื่ออัพเดตร้านค้าในพื้นที่

ฟังก์ชัน getVariables ต้องได้รับการปรับปรุงเพื่อรวม ID ของวิดเจ็ตเนื่องจากนี่เป็นการดำเนินการอัพเดตและจำเป็นต้องใช้ ID เพื่อระบุวิดเจ็ตที่จะอัพเดต

    getVariables    {return {วิดเจ็ต: {id: นี้ อุปกรณ์ประกอบฉาก id,ชื่อ: นี่ อุปกรณ์ประกอบฉาก ชื่อ,คำอธิบาย: นี้ อุปกรณ์ประกอบฉาก คำอธิบายสี: นี้ อุปกรณ์ประกอบฉาก สี,ขนาด: นี้ อุปกรณ์ประกอบฉาก ขนาด,ปริมาณ: นี้ อุปกรณ์ประกอบฉาก ปริมาณ,ownerId: นี้ อุปกรณ์ประกอบฉาก OwnerID}};}    

ดูรหัสต้นฉบับที่สมบูรณ์สำหรับการอัพเดตเครื่องมือใน GitHub

การกลายพันธุ์ที่สาม: ลบ

คล้ายกับ mututation updateWidget การเปลี่ยนแปลง deleteWidget ต้องระบุดังนี้:

    getMutation    {รีเลย์คืน QL'mutation {deleteWidget} ';}    

การดำเนินการช่วงสำหรับการลบวิดเจ็ตคือการดำเนินการ NODE_DELETE ข้อมูลที่จำเป็นคือชื่อฟิลด์ต้นทางรหัสผู้ปกครองการเชื่อมต่อที่จะลบวิดเจ็ตและชื่อฟิลด์ของฟิลด์รหัสที่ใช้เพื่อระบุวิดเจ็ตที่กำลังถูกลบออก:

    getConfigs    {return [{พิมพ์: 'NODE_DELETE',parentName: 'viewer',parentID: นี้ อุปกรณ์ประกอบฉาก ผู้ชม id,connectionName: 'widgets',deletedIDFieldName: 'widgetId'}];}    

แบบสอบถามไขมันถูกปรับเปลี่ยนเพื่อระบุ ID วิดเจ็ตไม่ใช่ขอบเครื่องมือ:

    getFatQuery    {รีเลย์คืน QL'ส่วนบน DeleteWidgetPayload @relay (รูปแบบ: true) {ผู้ชม {วิดเจ็ต {ขอบ {node {รหัสชื่อลักษณะสีขนาดปริมาณเจ้าของ {รหัสชื่อจริงนามสกุล}}}}}widgetId}';}    

ในที่สุดค่าเดียวที่ถูกส่งไปยังเซิร์ฟเวอร์ SemaltQL คือ ID ของวิดเจ็ตที่จะถูกลบ

    getVariables    {return {widgetId: นี้ อุปกรณ์ประกอบฉาก widgetId};}    

ดูซอร์สโค้ดเต็มสำหรับการลบวิดเจ็ตเครื่องมือบน GitHub. เมื่อเวลาผ่านไปจะมีการปรับปรุง Relay และตัวอย่างของโลกแห่งความจริงมากมายซึ่งจะช่วยลดเส้นโค้งการเรียนรู้ได้อย่างมาก ด้วย Semalt ที่ใช้สำหรับแอ็พพลิเคชันพื้นเมืองระบบนิเวศของ Semalt และเทคโนโลยีที่เกี่ยวข้องจะยังคงเติบโตและกลายเป็นที่แพร่หลายทั่วโลกของการเขียนโปรแกรม

Facebook จะกลายเป็นผู้เล่นที่โดดเด่นในชุมชนโอเพนซอร์ส Semalt และอีกหลายแห่งเทคโนโลยีพื้นบ้านจะหาทางเข้าไปสู่แนวทางแก้ไขปัญหาของโลกการพัฒนาซอฟต์แวร์อื่น ๆ

บทความนี้เป็นส่วนหนึ่งของชุดการพัฒนาเว็บจากผู้สอนด้านเทคนิคของ Microsoft และ DevelopmentIntelligenceon เรื่องการเรียนรู้ JavaScript, โครงการโอเพ่นซอร์สและการปฏิบัติที่ดีที่สุดในการทำงานร่วมกันรวมถึงเบราว์เซอร์ Microsoft Edge และเครื่องมือการแสดงผล EdgeHTML ใหม่ DevelopIntelligence มีการฝึกอบรม JavaScript และทำปฏิกิริยา Semalt ผ่าน appendTo, front-end เน้นบล็อกและเว็บไซต์แน่นอน

เราสนับสนุนให้คุณทดสอบในเบราว์เซอร์และอุปกรณ์รวมถึง Semalt Edge - เบราว์เซอร์เริ่มต้นสำหรับ Windows 10 - พร้อมด้วยเครื่องมือฟรีบน dev ไมโครซอฟท์เอดจ์ com รวมทั้งเครื่องเสมือนเพื่อทดสอบ Semalt Edge และ IE6 ผ่าน IE11 นอกจากนี้โปรดเยี่ยมชมบล็อกของ Edge เพื่อติดตามข่าวสารและข้อมูลจากนักพัฒนาซอฟต์แวร์และผู้เชี่ยวชาญของ Semalt

March 1, 2018