4.1 Get Started
To start our RandomGifPair
component, firstly, we need to create a RandomGifPair
folder in src
folder and then create stlye file index.js
in RandomGifPair/styles
. Its content can be found from here
Next, we need to create the component entry point index.js
in RandomGifPair
with the followings:
import React from "react";
import PropTypes from "prop-types";
import { ComponentManager, AppContainer, AppContainerContext } from "fractal-component";
import RandomGif, { actions as randomGifActions, actionTypes as randomGifActionTypes } from "../RandomGif";
import jss from "jss";
import jssDefaultPreset from "jss-preset-default";
import styles from "./styles";
class RandomGifPair extends React.Component {
constructor(props) {
super(props);
this.state = {};
this.componentManager = new ComponentManager(this, {
namespace: "io.github.t83714/RandomGifPair",
namespaceInitCallback: componentManager => {
const styleSheet = jss
.setup(jssDefaultPreset())
.createStyleSheet(props.styles ? props.styles : styles, {
generateClassName: componentManager.createClassNameGenerator()
})
.attach();
return { styleSheet };
},
namespaceDestroyCallback: ({ styleSheet }) => {
styleSheet.detach();
}
});
}
render() {
const { styleSheet } = this.componentManager.getNamespaceData();
const { classes } = styleSheet;
return (
<div className={classes.table}>
<div className={classes.cell}>RandomGif Pair</div>
<div className={`${classes.cell}`}>
<div>
<RandomGif
showButton={false}
apiKey={this.props.apiKey}
namespacePrefix={`${
this.componentManager.fullPath
}/Gifs`}
// --- pass down appContainer in case users want to specify `appContainer`
appContainer={this.componentManager.appContainer}
/>
</div>
<div>
<RandomGif
showButton={false}
apiKey={this.props.apiKey}
namespacePrefix={`${
this.componentManager.fullPath
}/Gifs`}
// --- pass down appContainer in case users want to specify `appContainer`
appContainer={this.componentManager.appContainer}
/>
</div>
</div>
{this.props.showButton && (
<div className={`${classes.cell} `}>
<button
onClick={() => {
this.componentManager.dispatch(
randomGifActions.requestNewGif(),
// --- sent multicast actions
// --- and flow down to all namespace paths under `${this.componentManager.fullPath}/Gifs/`
"./Gifs/*"
);
}}
disabled={this.state.isLoading}
>
{this.state.isLoading
? "Loading..."
: "Get Gif Pair"}
</button>
</div>
)}
</div>
);
}
}
RandomGifPair.contextType = AppContainerContext;
RandomGifPair.propTypes = {
showButton: PropTypes.bool,
apiKey: PropTypes.string,
styles: PropTypes.object,
appContainer: PropTypes.instanceOf(AppContainer)
};
RandomGifPair.defaultProps = {
showButton: true
};
export default RandomGifPair;
In index.js
, we imported component RandomGif
and configure it as:
<RandomGif
// --- hide `RandomGif`'s button
showButton={false}
apiKey={this.props.apiKey}
namespacePrefix={`${
this.componentManager.fullPath
}/Gifs`}
// --- pass down appContainer in case users want to specify `appContainer`
appContainer={this.componentManager.appContainer}
/>
Here, we set namespacePrefix
to ${this.componentManager.fullPath}/Gifs
so that the namespace path of RandomGif
components included by our new RandomGifPair
will be always under RandomGifPair
's namespace path. The actual Namespace Tree
structure is shown as below:
From the Namespace Tree
structure, we can tell that to send multicast actions to both RandomGif
components, we just need to dispatch to relativeDispatchPath
: ./Gifs/*
. Thus, in index.js
, we use the following code to dispatch REQUEST_NEW_GIF
actions to RandomGif
components when the button is clicked:
this.componentManager.dispatch(
randomGifActions.requestNewGif(),
"./Gifs/*"
);
Next, to render this newly created component, you can modify src/main.js
to import it:
// --- As of Babel 7.4.0, @babel/polyfill is deprecated
import "core-js/stable";
import "regenerator-runtime/runtime";
import React from "react";
import ReactDOM from "react-dom";
import RandomGif from "./RandomGif";
import RandomGifPair from "./RandomGifPair";
ReactDOM.render(
<div>
<div>
<RandomGif />
</div>
<div>
<RandomGifPair />
</div>
</div>,
document.getElementById("root")
);
Now, if you run the App by npm start
& access http://localhost:3000/
, you should see both RandomGif
& the newly created RandomGifPair
component.