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" ;