Skip to content

Instantly share code, notes, and snippets.

@hmps
Last active February 21, 2018 16:21
Show Gist options
  • Save hmps/8bcae1b66987eaf422045ad87c7b7cbe to your computer and use it in GitHub Desktop.
Save hmps/8bcae1b66987eaf422045ad87c7b7cbe to your computer and use it in GitHub Desktop.
Sharing components between React web and Native

Sharing components between React Web and Native

- src
  | - components
  | - common
  | - native
  | - web
// ValidateAndTrack.js
import * as React from 'react';
class ValidateAndTrack extends React.Component {
trackExperimentSeen = () => {}
validateUsage = () => {}
}
// ===========================
// Experiment.js
import * as React from 'react';
import ValidateAndTrack from './ValidateAndTrack';
class Experiment extends ValidateAndTrack {
render() {
this.trackExperimentSeen();
this.validateUsage();
return (
<div>{props.children}</div>
)
}
}
// ===========================
// Experiment.native.js
import * as React from 'react';
import { View } from 'react-native';
import ValidateAndTrack from './ValidateAndTrack';
class Experiment extends ValidateAndTrack {
render() {
this.trackExperimentSeen();
this.validateUsage();
return (
<View>{this.props.children}</View>
)
}
}
// ===========================
// Foo.js
import * as React from 'react';
import Experiment from './Experiment';
class Foo extends Component {
render() {
return (
<Experiment>
<div>
<p>Foo bar</p>
</div>
</Experiment>
);
}
}
// ===========================
// Foo.native.js
import * as React from 'react';
import { View, Text } from 'react-native';
import Experiment from './Experiment';
class Foo extends Component {
render() {
return (
<Experiment>
<View>
<Text>Foo bar</Text>
</View>
</Experiment>
);
}
}
// Experiment
import * as React from 'react';
const Experiment = (WrappedComponent) => {
return class Experiment extends React.Component {
trackExperimentSeen = () => {}
validateUsage = () => {}
render() {
this.trackExperimentSeen();
this.validateUsage();
return <WrappedComponent {...this.props} />
}
}
}
// ===========================
// Foo.js
import * as React from 'react';
import Experiment from './Experiment';
class Foo extends React.Component {
render() {
return (
<div>
<p>Foo bar</p>
</div>
);
}
}
export default Experiment(Foo);
// ===========================
// Foo.native.js
import * as React from 'react';
import { View, Text } from 'react-native';
import Experiment from './Experiment';
class Foo extends React.Component {
render() {
return (
<View>
<Text>Foo bar</Text>
</View>
);
}
}
export default Experiment(Foo);
// Experiment.js
import * as React from 'react';
class Experiment extends React.Component {
trackExperimentSeen = () => {}
validateUsage = () => {}
render() {
this.trackExperimentSeen();
this.validateUsage();
return this.renderProp(props);
}
}
// ===========================
// MyComponent.js
// web
import * as React from 'react';
import Experiment from './Experiment';
class MyComponent extends React.Component {
render() {
return (
<Experiment render={(props) => (
<div>
<p>Foo bar</p>
</div>
))} />
);
}
}
// ===========================
// MyComponent.native.js
// native
import * as React from 'react';
import { View, Text } from 'react-native';
import Experiment from './Experiment';
class MyComponent extends React.Component {
render() {
return (
<Experiment render={(props) => (
<View>
<Text>Foo bar</Text>
</View>
))} />
);
}
}
// Experiment.js
import * as React from 'react';
// Will import ./ExperimentRender.js for web, and Experiment.native.js for native
import ExperimentRender from './ExperimentRender';
class Experiment extends React.Component {
trackExperimentSeen = () => {}
validateUsage = () => {}
render() {
this.trackExperimentSeen();
this.validateUsage();
return (
<ExperimentRender {...props} />
);
}
}
// ===========================
// ExperimentRender.js
import * as React from 'react';
const ExperimentRender = (props) => (
<div>{props.children}</div>
);
// ===========================
// ExperimentRender.native.js
import * as react from 'react';
import { View } from 'react-native';
const Experiment = (props) => (
<View>{props.children}</View>
);
// ===========================
// Foo.js
import * as React from 'react';
import Experiment from './Experiment';
class Foo extends Component {
render() {
return (
<Experiment>
<div>
<p>Foo bar</p>
</div>
</Experiment>
);
}
}
// ===========================
// Foo.native.js
import * as React from 'react';
import { View, Text } from 'react-native';
import Experiment from './Experiment';
class Foo extends Component {
render() {
return (
<Experiment>
<View>
<Text>Foo bar</Text>
</View>
</Experiment>
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment