1.0.7 • Published 3 years ago

slice-hooks v1.0.7

Weekly downloads
-
License
ISC
Repository
github
Last release
3 years ago

slice-hooks

帮助你更简单地使用redux

作者

白切
wechat: feng-baiqie

文档

初始化

// base/slice-hooks.js
// 创建redux,然后作为new SliceHooks的入参
import SliceHooks from 'slice-hooks'
import { createStore } from 'redux'

function defaultReducer(state = {}, action) {
  switch (action.type) {
    default:
      return state
  }
}

export default new SliceHooks(createStore(defaultReducer))

use-store

import sliceHooks from 'base/slice-hooks'

const initialState = {
  number: 1,
  arr: [{ label: 'hey,' }, { label: 'im joy' }]
}

const slice = sliceHooks.createSlice({
  name: 'use-store',
  initialState,
})

const { useStore, set } = slice

export default () => {
  const { number, arr } = useStore()

  return (
    <div>
      <div>
        number is
        <br />
        {number}
      </div>
      <div>
        arr is:
        <br />
        {arr.map(item => item.label)}
      </div>
      <button
        onClick={() => set({ number: number + 1 })}
      >
        +1
      </button>
      <button
        onClick={() => {
          set((draftState) => {
            draftState.arr[1].label = 'im mike'
          })
        }}
      >
        call me mike
      </button>
    </div>
  )
}

use-thunks

import sliceHooks from 'base/slice-hooks'

const initialState = {
  number: 1,
}

const slice = sliceHooks.createSlice({
  name: 'use-thunkx',
  initialState,
  thunks: {
    async thunk1(num) {
      await new Promise((resolve) => {
        setTimeout(resolve, 500)
      })

      this.set((draftState) => {
        draftState.number += num
      })

      this.thunk2() 
    },
    async thunk2() {
      await new Promise((resolve) => {
        setTimeout(resolve, 500)
      })

      const { number } = this.get()
      console.log('now, number is:', number)
    }
  }
})

const { useStore, useThunks } = slice

export default () => {
  const { number } = useStore()
  const { thunk1 } = useThunks()

  return (
    <div>
      <div>
        number is
        <br />
        {number}
      </div>
      <button onClick={() => thunk1(2)}>
        async to +2
      </button>
    </div>
  )
}

use-dispatch

import sliceHooks from 'base/slice-hooks'

const initialState = {
  number: 1
}

const slice = sliceHooks.createSlice({
  name: 'use-dispatch',
  initialState,
  reducers: {
    add(draftState, action) {
      draftState.number += action.payload
    }
  }
})

const { useStore, useDispatch, useActions } = slice

export default () => {
  const { number } = useStore()
  const dispatch = useDispatch()
  const { add } = useActions()

  return (
    <div>
      <div>
        number is
        <br />
        {number}
      </div>
      <button
        onClick={() => {
          // @redux/toolkit的action写法,是一个语法糖
          dispatch(add(2))
        }}
      >
        +2
      </button>
      <button
        onClick={() => {
          // redux原生写法
          dispatch({ type: 'use-dispatch/add', payload: 3 })
        }}
      >
        +3
      </button>
    </div>
  )
}

use-selector

const { useDispatch, useSelector } = slice // you could use any slice

export default () => {
  // by this, you can get any slice state
  // get use-promise page state
  const { name } = useSelector(state => state['use-promise'])
  const dispatch = useDispatch()

  return (
    <div>
      supprise, i get the value in use-promise page:
      {name}
      <button
        onClick={() => dispatch({ type: 'use-promise/change', payload: 'use-selector' })}
      >
        change name
      </button>
    </div>
  )
}

promise

import sliceHooks from 'base/slice-hooks'

const initialState = {}

const slice = sliceHooks.createSlice({
  name: 'use-promise',
  initialState,
  thunks: {
    async thunkThen() {
      await new Promise((resolve) => {
        setTimeout(resolve, 1000)
      })
      
      return 123
    },
    async thunkError() {
      await new Promise((resolve) => {
        setTimeout(resolve, 1000)
      })

      throw new Error('哈哈')
    }
  }
})

const { useThunks } = slice

export default () => {
  const { thunkThen, thunkError } = useThunks()

  return (
    <div>
      <button
        onClick={() => {
          thunkThen().then((result) => {
            console.log('then', result)
          })
        }}
      >
        then
      </button>
      <button
        onClick={() => {
          thunkError().catch((err) => {
            console.log('catch', err)
          })
        }}
      >
        catch
      </button>
      <button
        onClick={async () => {
          const result = await thunkThen()
          console.log('await', result)
        }}
      >
        await
      </button>
    </div>
  )
}
1.0.7

3 years ago

1.0.6

4 years ago

1.0.5

4 years ago

1.0.4

4 years ago

1.0.2

4 years ago

1.0.3

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago