2.7.3 β€’ Published 10 months ago

react-pinia v2.7.3

Weekly downloads
-
License
MIT
Repository
github
Last release
10 months ago

react-pinia

🍍 Build minimal state management for React

Installation

npm i react-pinia

Global Usage

Define data source

import { createStore } from 'react-pinia'
type HomeState = {
  count: number
  user: string
  info: {
    useName: string
    password: string
  }
  getters: {
    doubleCount: number
  }
  actions: {
    add: (count: number) => void
  }
}
type AboutState = {
  num: number
}

export interface State {
  home: HomeState
  about: AboutState
}
const store = createStore<State>({
  home: {
    state: () => {
      return {
        count: 1,
        user: 'hello',
        info: {
          useName: 'admin',
          password: '123456',
        },
      }
    },
    getters: {
      doubleCount: (state) => {
        return state.count * 2
      },
    },
    actions: {
      add(count) {
        console.log(this.info)
        // this.count += count
        // this.info.useName = 'cobill'
        this.info = {
          useName: 'cobill',
          password: '123456789',
        }
        // this.user = 'world'
      },
    },
    deep: false,
  },
  about: {
    state: () => {
      return {
        num: 1,
      }
    },
  },
})

export default store

Global Mounting

import { Provider } from 'react-pinia'
import store from '@/store'
ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  root
)

Global Usage

import { useStore } from 'react-pinia'
// Import globally defined types
import { State } from '@/store/global'
const App = memo(() => {
  const home = useStore<State, 'home'>('home')! // Need to pass generics and assert
  return (
    <section>
      <p>count: {home.count}</p>
      <p>doubleCount: {home.doubleCount}</p>
      <p>{home.user}</p>
      <button onClick={home.add}>Add</button>
    </section>
  )
})
export default App

Local Usage

Local usage does not require global mounting, just use it directly

// Define data source
import { defineStore } from 'react-pinia'

type State = {
  count: number
  user: string
  getters: {
    doubleCount: number
  }
  actions: {
    add: () => void
  }
}

const useStore = defineStore<State>({
  state: () => {
    return {
      count: 1,
      user: 'hello',
    }
  },
  getters: {
    doubleCount: (state) => {
      return state.count * 2
    },
  },
  actions: {
    add() {
      this.count += 1
    },
  },
  // Whether to persist data
  persist: {
    key: 'user',
    storage: 'localStorage', // 'localStorage' | 'sessionStorage' default is localStorage
  },
  deet: true,
})
// Use data source
import { memo } from 'react'
import useStore from './useStore'

// Use directly outside
const state = useStore().get()

const Child = memo(() => {
  const { count, doubleCount, add } = useStore()
  const onClick = () => {
    state.count = state.count + 1
  }
  return (
    <section>
      <p>{count}</p>
      <p>{doubleCount}</p>
      <button onClick={add}>Add</button>
      <button onClick={onClick}>Modify externally</button>
    </section>
  )
})
export default Child

Sponsored

Open source is not easy, with your sponsorship, we will do better πŸ‘‹

Technical feedback and communication

WeChat: cobill2008

License

MIT

2.7.0

10 months ago

2.6.0

10 months ago

2.7.2

10 months ago

2.7.1

10 months ago

2.7.3

10 months ago

2.5.8

11 months ago

2.5.7

11 months ago

2.5.9

11 months ago

2.5.6

2 years ago

2.3.0

3 years ago

2.2.0

3 years ago

2.5.0

3 years ago

2.5.2

3 years ago

2.5.1

3 years ago

2.5.3

3 years ago

2.1.0

3 years ago

2.5.5

3 years ago

2.0.0

3 years ago

1.9.0

3 years ago

1.8.9

3 years ago

1.8.8

3 years ago

1.8.6

3 years ago

1.8.2

3 years ago

1.8.0

3 years ago

1.7.8

3 years ago

1.7.6

3 years ago

1.7.3

3 years ago

1.7.2

3 years ago

1.7.0

3 years ago

1.6.8

3 years ago

1.5.8

3 years ago

1.5.6

3 years ago

1.5.2

3 years ago

1.3.2

3 years ago

1.3.0

3 years ago

1.2.0

3 years ago

1.1.0

3 years ago

1.0.0

3 years ago