官网参考1
暂时没看明白!
This API can be used to subscribe to a variety of “subscribable” sources, from event dispatchers to RxJS observables. Below are a few examples of how to subscribe to common types.
Subscribing to event dispatchers
路径:github\react\packages\create-subscription\README.md
Below is an example showing how create-subscription can be used to subscribe to event dispatchers such as DOM elements.
import React from "react";import { createSubscription } from "create-subscription";// Start with a simple component.// In this case, it's a function component, but it could have been a class.function FollowerComponent({ followersCount }) {return <div>You have {followersCount} followers!</div>;}// Create a wrapper component to manage the subscription.const EventHandlerSubscription = createSubscription({getCurrentValue: eventDispatcher => eventDispatcher.value,subscribe: (eventDispatcher, callback) => {const onChange = event => callback(eventDispatcher.value);eventDispatcher.addEventListener("change", onChange);return () => eventDispatcher.removeEventListener("change", onChange);}});// Your component can now be used as shown below.// In this example, 'eventDispatcher' represents a generic event dispatcher.<EventHandlerSubscription source={eventDispatcher}>{value => <FollowerComponent followersCount={value} />}</EventHandlerSubscription>;
参考2
路径:reactjs.org\examples\update-on-async-rendering\adding-event-listeners-create-subscription.js
adding-event-listeners-before
// Beforeclass ExampleComponent extends React.Component {// highlight-range{1-10}componentWillMount() {this.setState({subscribedValue: this.props.dataSource.value,});// This is not safe; it can leak!this.props.dataSource.subscribe(this.handleSubscriptionChange);}componentWillUnmount() {this.props.dataSource.unsubscribe(this.handleSubscriptionChange);}handleSubscriptionChange = dataSource => {this.setState({subscribedValue: dataSource.value,});};}
adding-event-listeners-after
// Afterclass ExampleComponent extends React.Component {// highlight-range{1-3}state = {subscribedValue: this.props.dataSource.value,};// highlight-line// highlight-range{1-18}componentDidMount() {// Event listeners are only safe to add after mount,// So they won't leak if mount is interrupted or errors.this.props.dataSource.subscribe(this.handleSubscriptionChange);// External values could change between render and mount,// In some cases it may be important to handle this case.if (this.state.subscribedValue !==this.props.dataSource.value) {this.setState({subscribedValue: this.props.dataSource.value,});}}componentWillUnmount() {this.props.dataSource.unsubscribe(this.handleSubscriptionChange);}handleSubscriptionChange = dataSource => {this.setState({subscribedValue: dataSource.value,});};}
adding-event-listeners-create-subscription
import {createSubscription} from 'create-subscription';const Subscription = createSubscription({getCurrentValue(sourceProp) {// Return the current value of the subscription (sourceProp).return sourceProp.value;},subscribe(sourceProp, callback) {function handleSubscriptionChange() {callback(sourceProp.value);}// Subscribe (e.g. add an event listener) to the subscription (sourceProp).// Call callback(newValue) whenever a subscription changes.sourceProp.subscribe(handleSubscriptionChange);// Return an unsubscribe method.return function unsubscribe() {sourceProp.unsubscribe(handleSubscriptionChange);};},});// Rather than passing the subscribable source to our ExampleComponent,// We could just pass the subscribed value directly:<Subscription source={dataSource}>{value => <ExampleComponent subscribedValue={value} />}</Subscription>;
