Getting Started
In this chapter, we will show you the usage of the library by adding Deviation to the example Counter App.
Create a Counter App
To create a counter app, first we will create a CounterApp that hold the Counter component:
import { Counter } from './Counter'
export class CounterApp extends React.Component {
render() {
return (
<Counter />
)
}
}And then we create the Counter component that render the counter and hold the counter state:
export class Counter extends React.Component {
state = {
counter: 0
}
decrement = () => {
this.setState(({ counter }) => ({ counter: counter - 1 }))
}
increment = () => {
this.setState(({ counter }) => ({ counter: counter + 1 }))
}
render() {
return (
<div>
<p>Counter: <b>{this.state.counter}</b></p>
<button onClick={this.decrement}>Decrement</button>
<button onClick={this.increment}>Increment</button>
</div>
)
}
}Now, we can mount the CounterApp to ReactDOM so that the counter app can run:
import { CounterApp } from './CounterApp'
ReactDOM.render(
<CounterApp />,
document.getElementById('root')
)Lift the State Up
It's simple to create a CounterApp with a single state, but when you have to share the state throughout your app, you will need to Lift the State Up. To do that, we will create a CounterStore that handle store's state and actions:
import { Store } from 'deviation'
export const CounterStore extends Store {
state = {
counter: 0
}
decrement() {
this.setState(({ counter }) => ({ counter: counter - 1 }))
}
increment() {
this.setState(({ counter }) => ({ counter: counter + 1 })
}
}Then, we need to add the CounterStore to the provider so that it will initialize and provide the Store throughout your app:
import { Deviation } from 'deviation'
import { CounterApp } from './CounterApp'
ReactDOM.render(
<Deviation providers={[CounterStore]}>
<CounterApp />
<Deviation />
)Now, CounterStore can be access anywhere in our app. We can now lift the state up by removing the component state and replace it with the state and the actions from CounterStore:
import { Inject } from 'deviation'
import { CounterStore } from './CounterStore'
@Inject({
counterStore: CounterStore
})
export class Counter extends React.Component {
render() {
const { counterStore } = this.props
return (
<div>
<p>Counter: <b>{counterStore.state.counter}</b></p>
<button onClick={counterStore.decrement}>Decrement</button>
<button onClick={counterStore.increment}>Increment</button>
</div>
)
}
}Last updated
Was this helpful?