In this section we will explore the three ways available in ConanJs to connect a component with a state. There are four ways of doing it:
Direct
We can use the Conan state object directly to connect to a component, using the method connect . This method will connect the whole state to the specified component
Js
Copy import { counterState$ } from "../../../state/counter.state$";
{counterState$.connect(CounterDisplay)}
We can also use connectMap to connect to specific parts of the state:
Js Ts
Copy import { counterState$ } from "../../../state/counter.state$";
counterState$.connectMap(CounterContainer, (data, actions) => ({
decrementCounter: actions.decrement,
incrementCounter: actions.increment
}));
counterState$.connectMap(CounterDisplay, data => ({
counter: data.counter
}))
Copy import {counterState$} from "../../../state/counter.state$";
counterState$.connectMap<CounterContainerProps> (
CounterContainer,
(data, actions)=>({
decrementCounter: actions.decrement,
incrementCounter: actions.increment
})
)
counterState$.connectMap<CounterDisplayProps> (
CounterDisplay,
data=>({
counter: data.counter
})
)
HOC
Using the ConanJs component StateConnect, we can connect a React component with a Conan state:
Js Ts
Copy export const CounterAppHOCAll = () => {
return <StateConnect from={counterState$} into={CounterContainer}/>;
};
Copy export const CounterAppHOCAll = (): React.ReactElement => {
return <StateConnect<CounterData, CounterActions>
from={counterState$}
into={CounterContainer}
/>
}
And then use the state's data and actions within our React component. We can also use Conan's component ContextStateConnect, to achieve the same purpose, connect the whole state with a component:
Js Ts
Copy <ContextStateConnect into={CounterDisplay}/>
Copy <ContextStateConnect<CounterData, CounterActions>
into={CounterDisplay}
/>
Inside the component, we can invoke the actions defined in the state, via props:
Copy this.props.actions.decrement
We can also access any data property via props:
Copy <h1>{this.props.data.counter}</h1>
Composition
We can also use compositions with the components contextStateConnect and contextStateMapConnect
contextStateConnect will connect the whole state:
Js Ts
Copy import {stateConnect, contextStateConnect} from "conan-js-core";
stateConnect(counterState$, CounterContainer);
contextStateConnect(CounterDisplay)
Copy import {ConnectedState, stateConnect, contextStateConnect} from "conan-js-core";
stateConnect<CounterData, CounterActions>(
counterState$,
CounterContainer
)
contextStateConnect<CounterData, CounterActions>(CounterDisplay)
contextStateMapConnect will connect only the specified properties:
Js Ts
Copy import {stateMapConnect, contextStateMapConnect} from "conan-js-core";
stateMapConnect(counterState$, CounterContainer, (data, actions) => ({
decrementCounter: actions.decrement,
incrementCounter: actions.increment
}));
contextStateMapConnect(CounterDisplay, (data) => ({
counter: data.counter
}))
Copy import {ICallback, contextStateMapConnect, stateMapConnect} from "conan-js-core";