ตอบสนองกับ Redux หรือไม่ ปัญหา 'บริบท' เป็นอย่างไร?


91

ปกติฉันจะโพสต์สิ่งที่เกี่ยวข้องกับรหัสบน Stack แต่นี่เป็นคำถามมากกว่าว่าความคิดทั่วไปของชุมชนคืออะไร

ดูเหมือนว่าจะมีผู้คนมากมายที่สนับสนุนการใช้ Redux กับ React เพื่อจัดการข้อมูล / สถานะ แต่ในขณะที่อ่านและเรียนรู้ทั้งสองอย่างฉันได้เจอบางสิ่งที่ดูไม่ถูกต้องนัก

Redux

ที่ด้านล่างของหน้านี้: http://redux.js.org/docs/basics/UsageWithReact.html (ผ่านร้านค้า) ขอแนะนำให้ใช้ "Magic" ของ React "Context"

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

ตัวเลือกที่เราแนะนำคือใช้ส่วนประกอบ React Redux พิเศษที่เรียกว่าเพื่อทำให้ร้านค้าพร้อมใช้งานสำหรับส่วนประกอบคอนเทนเนอร์ทั้งหมด ...

ตอบสนอง

ในหน้า React Context ( https://facebook.github.io/react/docs/context.html ) จะมีคำเตือนที่ด้านบน:

บริบทเป็นคุณลักษณะขั้นสูงและเป็นการทดลอง API มีแนวโน้มที่จะเปลี่ยนแปลงในอนาคต

จากนั้นที่ด้านล่าง:

เช่นเดียวกับที่หลีกเลี่ยงตัวแปรส่วนกลางได้ดีที่สุดเมื่อเขียนโค้ดที่ชัดเจนคุณควรหลีกเลี่ยงการใช้บริบทในกรณีส่วนใหญ่ ...

อย่าใช้บริบทเพื่อส่งผ่านข้อมูลโมเดลของคุณผ่านส่วนประกอบ การเธรดข้อมูลของคุณผ่านโครงสร้างอย่างชัดเจนนั้นเข้าใจง่ายกว่ามาก ...

ดังนั้น...

Redux แนะนำให้ใช้คุณสมบัติ React 'Context' แทนที่จะส่งต่อstoreไปยังแต่ละองค์ประกอบผ่าน 'props' ในขณะที่ React แนะนำตรงกันข้าม

นอกจากนี้ดูเหมือนว่า Dan Abramov (ผู้สร้าง Redux) ทำงานให้กับ Facebook (ผู้สร้าง React) เพื่อทำให้ฉันสับสนมากขึ้น

  • ฉันอ่านหมดแล้วใช่ไหม .. ?
  • ฉันทามติทั่วไปในประเด็นนี้คืออะไร .. ?

9
อ่านี่เป็นคำถามที่ดีฉันอยากรู้มากที่จะได้ยินมุมมองของคนอื่น ๆ เช่นกัน! ฉันกลัวเล็กน้อยว่ามันจะถูกปิดเนื่องจากประเด็นการสนทนา ฉันหวังว่ามันจะไม่
mjohnsonengr

คำตอบ:


91

บริบทเป็นคุณลักษณะขั้นสูงและอาจมีการเปลี่ยนแปลง ในบางกรณีความสะดวกสบายของมันมีมากกว่าข้อเสียดังนั้นไลบรารีบางแห่งเช่น React Redux และ React Router จึงเลือกที่จะพึ่งพามันแม้จะมีลักษณะการทดลอง

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

React Redux ใช้บริบทภายใน แต่ไม่เปิดเผยข้อเท็จจริงนี้ใน API สาธารณะ ดังนั้นคุณควรรู้สึกปลอดภัยกว่าเมื่อใช้บริบทผ่าน React Redux โดยตรงเพราะหากมีการเปลี่ยนแปลงภาระในการอัปเดตโค้ดจะอยู่ที่ React Redux ไม่ใช่คุณ

ในที่สุด React Redux ยังคงรองรับการส่งผ่านร้านค้าเป็นเสาหลักเสมอดังนั้นหากคุณต้องการหลีกเลี่ยงบริบทโดยสิ้นเชิงคุณมีทางเลือกนั้น อย่างไรก็ตามฉันจะบอกว่านี่เป็นไปไม่ได้

TLDR: หลีกเลี่ยงการใช้บริบทโดยตรงเว้นแต่คุณจะรู้จริงๆว่าคุณกำลังทำอะไรอยู่ การใช้ห้องสมุดที่อาศัยบริบทภายในค่อนข้างปลอดภัย


1
แดนพูดดี ความเสี่ยงคือหาก React ลบบริบททั้งหมดในรุ่นอนาคตอาจต้องมีการปรับปรุงใหม่เพื่ออัปเดตแอป Redux ที่มีอยู่ Redux จะไม่สามารถป้องกันผู้ใช้จากการเปลี่ยนแปลงดังกล่าวได้ เนื่องจากตอนนี้คุณใช้ Facebook ข่าวดีก็คือฉันคาดว่าคุณจะมีการแจ้งเตือนล่วงหน้ามากมายหากบริบทหายไป
Cory House

6
การตอบสนองจะไม่ลบบริบท ฉันหมายความว่ามันเป็นไปได้ในทางเทคนิค แต่เหตุผลทั้งหมดที่มีอยู่เป็นเพราะผลิตภัณฑ์มากมายใน FB ต้องการมัน ดังนั้นหากไม่มีวิธีแก้ปัญหาที่เทียบเท่าก็จะไม่หายไป แต่ API ที่แน่นอนอาจเปลี่ยนแปลงซึ่งเป็นสิ่งที่เราป้องกันผู้ใช้
Dan Abramov

5
ข้อสังเกตที่สำคัญอีกประการหนึ่งคือ React วางแผนที่จะใช้บริบทมากกว่าน้อยกว่าในอนาคต เราคิดว่ามันอาจมีประโยชน์สำหรับการจัดรูปแบบภาพเคลื่อนไหวการจัดการท่าทาง ฯลฯ
Dan Abramov

อย่างไรก็ตามสิ่งที่น่าสนใจคือเมื่อคุณได้รับไลบรารีของ React Components (เช่น Material-ui) โดยธรรมชาติแล้วพวกมันจะไม่เป็นส่วนหนึ่งของโมเดลสถานะแอปพลิเคชันของคุณ แต่ก็ยังคงเป็นโครงสร้างของส่วนประกอบ React เหมือนเดิมโดยมีข้อกำหนดเดียวกันของ การรักษาแบบจำลองสถานะและกระแสข้อมูลของตนเองแยกจากแอปพลิเคชัน 'หลัก' ดังนั้นพวกเขาจึงใช้ประโยชน์จากคุณลักษณะบริบทเป็นวิธีเดียว (สำหรับพวกเขา) ในการส่งผ่านข้อมูลไปยัง hiearchy ลูกของพวกเขา
stephenwil

1
@DanAbramov แล้วบริบทใหม่ API ล่ะ ยังไม่แนะนำให้ใช้?
Stanislav Mayorov

5

ฉันไม่รู้เกี่ยวกับคนอื่น แต่ฉันชอบใช้มัณฑนากรเชื่อมต่อของ react-redux เพื่อห่อส่วนประกอบของฉันเพื่อให้ส่งผ่านอุปกรณ์ประกอบฉากจากร้านค้าที่ฉันต้องการเท่านั้นไปยังส่วนประกอบของฉัน สิ่งนี้แสดงให้เห็นถึงการใช้บริบทในแง่หนึ่งเพราะฉันไม่ได้ใช้มัน (และฉันรู้ว่าตามกฎแล้วรหัสใด ๆ ที่ฉันรับผิดชอบจะไม่ใช้มัน)

เมื่อฉันทดสอบส่วนประกอบของฉันฉันทดสอบส่วนประกอบที่ไม่ได้ห่อหุ้ม เนื่องจาก react-redux ส่งผ่านอุปกรณ์ประกอบฉากที่ฉันต้องการในส่วนประกอบนั้นเท่านั้นตอนนี้ฉันรู้แล้วว่าฉันต้องการอุปกรณ์ประกอบฉากใดบ้างเมื่อฉันเขียนแบบทดสอบ

ฉันคิดว่าประเด็นคือฉันไม่เคยเห็นบริบทคำในรหัสของฉันฉันไม่ได้ใช้มันดังนั้นในระดับหนึ่งมันไม่ส่งผลกระทบต่อฉัน! นี่ไม่ได้พูดอะไรเกี่ยวกับคำเตือน "การทดลอง" ของ Facebook .. หากบริบทหายไปฉันก็คงเมาเหมือนคนอื่น ๆ จนกว่า Redux จะได้รับการอัปเดต


น่าสนใจ ... ฉันเห็นว่าคุณหมายถึงอะไรเกี่ยวกับ 'react-redux' โดยใช้Providerและconnectแยกเนื้อหาบริบททั้งหมดออกไป ฉันเดาว่าตอนนี้ Dan Abramov อยู่ที่ FB คุณคงหวังว่าถ้า Context เปลี่ยน Redux และ 'react-redux' จะได้รับการอัปเดต ... แต่ไม่มีการรับประกันและคำเตือน "ทดลอง" ของ FB ยังคงมีให้ทุกคนเห็น
Stephen ล่าสุด

ฉันมีความหวังอย่างแน่นอนว่าหาก FB ไม่เก็บ react-redux ไว้ในลูปในกรณีที่มีอะไรเกิดขึ้นกับบริบทผู้สนับสนุนโอเพนซอร์สที่คุ้นเคยกับ redux มากกว่าฉัน ถ้าไม่ฉันจะคิดออกและทำเอง!
mjohnsonengr

ฉันถาม Dan เกี่ยวกับความคิดของเขาผ่าน Twitter ... คำตอบที่ดีในบรรทัดเดียวกัน ... ใช้ไลบรารีที่ใช้ Context อย่าใช้โดยตรง
Stephen ล่าสุด

1

มีโมดูล npm ที่ทำให้ง่ายต่อการเพิ่ม redux ในบริบทการตอบสนอง

https://github.com/jamrizzi/redux-context-provider

https://www.npmjs.com/package/redux-context-provider

import React, { Component } from 'react';
import ReduxContextProvider from 'redux-context-provider';
import createStore from './createStore';
import actions from './actions';
import Routes from './routes';

export default class App extends Component {
  render() {
    return (
      <ReduxContextProvider store={store} actions={actions}>
        <Routes />
      </ReduxContextProvider>
    );
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.